第1章:開始啟程 - 你的第一行android程式碼
1.1 瞭解全貌——Android王國簡介
1.1.1 Android系統架構
-
Android系統架構分為四層:
-
Linux核心層:Android系統基於Linux核心。 為Android硬體提供底層驅動,例如顯示驅動,音訊驅動,照相機驅動,藍芽驅動,Wi-Fi驅動,電源管理等。
-
系統執行庫層:通過C/C++庫為Android系統提供特性支援如:SQLite庫提供資料庫支援,Webkit庫提供瀏覽器核心支援。
該層還有Android執行時庫,提供核心庫,允許用Java語言開發Android應用。Android執行時庫還包含Dalvik虛擬機器(5.0後是ART執行環境),它使得每個Android應用都能執行在獨立的程式當中,並且擁有一個自己的Dalvik虛擬機器例項,相較於Java虛擬機器,Dalvik是專門為移動裝置定製的,它針對手機記憶體、CPI效能有限等情況做了優化處理。 -
應用框架層:提供應用程式的各種API,Android自帶的核心應用就是使用這些API完成的。
-
應用層: 手機中所有的應用程式屬於應用層,如系統自帶的聯絡人、簡訊等,或者其他第三方應用程式。
1.1.2 Android已釋出的版本(截止201712)
<tr>
<th width=10%, bgcolor=yellow>版本號</th>
<th width=10%, bgcolor=yellow>API級別</th>
<th width=10%, bgcolor=yellow>釋出日期</th>
<th width=10%, bgcolor=yellow>版本代號</th>
<th width=10%, bgcolor=yellow>CodeName(系統名稱)</th>
</tr>
<tr>
<th>1.0</th>
<th>1</th>
<th>2008-09-23</th>
<th>阿童木</th>
<th>BASE</th>
</tr>
<tr>
<th>1.5</th>
<th>3</th>
<th>2009-04-17</th>
<th>紙杯蛋糕</th>
<th>Cupcake</th>
</tr>
<tr>
<th>1.6</th>
<th>4</th>
<th>2009-09-15</th>
<th>甜甜圈</th>
<th>Donut</th>
</tr>
<tr>
<th>2.0</th>
<th>5</th>
<th>2009-10-26</th>
<th>泡芙</th>
<th>Eclair</th>
</tr>
<tr>
<th>2.2</th>
<th>8</th>
<th>2010-05-20</th>
<th>凍酸奶</th>
<th>Froyo</th>
</tr>
<tr>
<th>2.3</th>
<th>9</th>
<th>2010-12-06</th>
<th>薑餅</th>
<th>Gingerbread</th>
</tr>
<tr>
<th>3.0</th>
<th>11</th>
<th>2011-02-24</th>
<th>蜂巢</th>
<th>Honeycomb</th>
</tr>
<th>4.0</th>
<th>14</th>
<th>2011-10-19</th>
<th>冰激凌三明治</th>
<th>Ice Cream Sandwich</th>
</tr>
<th>4.1</th>
<th>16</th>
<th>2012-06-28</th>
<th>果凍豆</th>
<th>Jelly Bean</th>
</tr>
<th>4.4</th>
<th>19</th>
<th>2013-09-03</th>
<th>奇巧</th>
<th>KitKat</th>
</tr>
<th>5.0</th>
<th>21</th>
<th>2014-10-15</th>
<th>棒棒糖</th>
<th>Lollipop</th>
</tr>
<th>6.0</th>
<th>23</th>
<th>2015-05-28</th>
<th>棉花糖</th>
<th>Marshmallow</th>
</tr>
<th>7.0</th>
<th>24</th>
<th>2016-05-18</th>
<th>牛軋糖</th>
<th>Nougat</th>
</tr>
<th>8.0</th>
<th>26</th>
<th>2017-8-22</th>
<th>奧利奧</th>
<th>Oreo</th>
</table>
複製程式碼
- 我擦,Table表格不是這麼用的嗎,上截圖了...
1.1.3 Android應用開發特色
-
四大元件
- Activity 活動
- Service 服務
- BroadCast Receiver 廣播接收者
- Content Provider 內容提供者
-
豐富的系統控制元件
-
SQLite資料庫
-
強大的多媒體
-
地理位置定位
1.2 手把手帶你搭建開發環境
工欲善其事,必先利其器
1.2.1 準備所需要的工具
- JDK1.8以上:Java語言的軟體開發工具包(包含Java的執行環境,工具集合,基礎類庫等內容)
- Android SDK:Android開發工具包
- Android Studio:Android編譯器
1.2.2 搭建開發環境
- 下載AndroidStudio:
- 官網:https://developer.android.google.cn/studio/index.html
- 開發者:http://www.androiddevtools.cn/
當前正式版最新版本為:3.0.1
1.3 建立你的第一個Android專案
Hello World
1.3.1 建立HelloWorld專案
1.3.2 啟動模擬器
1.3.3 執行HelloWorld
當年花了大半天去搞得東西,如今幾分鐘,我想起那天夕陽下的奔跑...
1.3.4 分析你的第一個Android程式
Project下的目錄結構
- .gradle和.idea: Android Studio自動生成的檔案
- app: 專案中的程式碼,資源幾乎都在放app目錄下
- build:編譯時自動生成的檔案
- libs:放置第三方jar包
- androidTest:編寫Android Test測試用例,專案自動化測試
- java:放置所有Java程式碼
- res:專案資源目錄
- AndroidManifest.xml:Android專案配置檔案
- test:編寫Unit Test測試用例,專案自動化測試
- .gitignore:控制版本忽略檔案
- app.iml:IntellJ IDEA自動生成的檔案
- build.gradle:app模組的gradle構建指令碼
- proguard-rules.pro:指定專案程式碼的混淆規則
- build: 專案編譯時自動生成的檔案
- gradle: 包含gradle wrapper的配置檔案 ,使用gradle wrapper不需要提前將gradle下好,Android Studio會自動根據快取情況決定是否需要聯網下載。預設不啟用gradle wrapper,可以通過File-Setting-Build-Execution-Deployment-Gradle進行配置更改
- .gitignore: 指定的目錄或檔案排除在版本之外
- build.gradle: 專案全域性的gradle構建指令碼
- gradle.properties: 全域性的gradle配置檔案,這裡配置的屬性影響專案中所有的gradle編譯指令碼
- gradlew和gradlew.bat: 命令列介面執行gradle命令 ,gradlew在Linux或Mac系統中使用 ,gradlew.bat 在Windows系統中使用
- HelloWorld.iml: 所有IntelliJ IDEA專案中都會自動生成的檔案,用來標識這是一個IntelliJ.IDEA專案
- local.properties:指定本機中SDK路徑,通常自動生成
- setting.gradle: 指定專案中所有引入的模組
1.3.5 詳解專案中的資源
- drawable 存放圖片
- mipmap 存放應用圖示
- value 存放字串,樣式,顏色等配置
- layout 存放佈局檔案
1.3.6 詳解build.gradle檔案
AndroidStudio是採用Gradle來構建專案
1.最外層目錄下:build.gradle
- jcenter:程式碼託管倉庫
- classpath:Gradle外掛版本
- classpath 'com.android.tools.build:gradle:3.0.1'
- 因為Gradle並不是專門為構建android專案開發的,Java,C++都可以用Gradle構建
- classpath:Gradle外掛版本
2.App目錄下的:build.gradle
-
apply plugin(應用一個外掛):
- com.android.application 應用程式模組,可直接執行
- com.android.library 庫模組,只能作為程式碼庫依附
-
android閉包(配置專案構建的各種屬性):
- compileSdkVersion: 指定專案的編譯版本
- bulidToolsVersion: 用於指定構建工具的版本
- defaultConfig 閉包:對專案的更多細節進行配置
- applicationId:指定專案的包名
- minSdkVersion: 指定專案最低相容的系統版本
- targetSdkVersion: 在該目標版本上已經做了充分的測試,系統將為你的應用程式啟用一些最新的功能和特性
- versionCode: 指定專案的版本號
- versionName: 指定專案的版本名
- bulidTypes 閉包: 指定生成安裝檔案的相關配置,通常只有兩個子閉包
- debug:指定生成測試版安裝檔案的配置,可忽略不寫
- release:指定生成正式版安裝檔案的配置
- minifyEnable: 指定是否對專案進行混淆
- proguardFiles: 指定混淆時使用的規則檔案,這裡指定兩個
- proguard-android.txt是在AndrliodSDK目錄下的,裡面是所有專案通用的混淆規則
- proguard-rules.pro 當前專案的根目錄下,編寫當前專案特有的混淆規則,注意:通過androidStudio直接執行專案生成的都是測試版安裝檔案
-
dependencies閉包:指定當前專案所有的依賴關係
- compile fileTree 本地依賴:對本地的jar包或目錄新增依賴關係
- implementation fileTree(include: ['*.jar'], dir: 'libs')
- lib目錄下所有jar字尾檔案新增到專案構建路徑中
- 庫依賴: 對專案中的庫模組新增依賴關係
- compile project(':helper')
- 遠端依賴:對jcenter庫上的開源專案新增依賴關係
- implementation 'com.android.support:appcompat-v7:26.1.0'
- com.android.support 域名部分:用於和其他公司庫區分 appcompat-v7 組名稱,區分同一公司不同庫
- compile fileTree 本地依賴:對本地的jar包或目錄新增依賴關係
1.4 前行必備-掌握日誌工具的使用
android.util.Log
1.4.1 使用Android的日誌工具Log
- Log.v():verbose 最小的日誌
- Log.d():debug 除錯資訊,比verbose高一級
- Log.i():info 比較重要的資訊,比debug高一級
- Log.w():warm 警告資訊,比info高一級
- Log.e():error 錯誤資訊,比warm高一級
1.4.2 為什麼使用Log而不使用Systom.out
- Log:可控制列印資訊,確定列印時間,能新增過濾器,日誌有級別區分
- System.out滿足不了
1.5 小結與點評
學習android的起點
本章總結
回頭看看,這一章我還有很多說不出因果的點,比如android系統架構/build.gradle檔案每個條目的相關情況,平時開發一般也沒留意吧,知其然而不知其所以然,趁這回好好總結,在之後筆記中多寫寫自己的思考,觸類旁通.
亂拳打死老師傅,懷著敬畏的心態去複習基礎.前兩天我司一個android開發跟架構爭論為毛後臺java介面加密用MD5不用非對稱加密,架構大佬直接問:你知道MD5加密底層怎麼實現的嗎,它的位數長度是多少...頓時無言以對..技術的選擇沒有必然的好壞,但是跟別人討論還是要提前做好準備吧,裝逼有風險,就這些.