作為移動端操作系統,目前最新的Android 11.0已經發展的比較完善了,現在也到了系統的整理一番的時間,接下來的系列文章將以Android開發者為中心,爭取用歸納總結的態度對初級入門者所應掌握的基礎知識聊以標記。
應用環境
Android系統是Google基於Linux系統開發的一套移動系統,不僅應用於手機,還有穿戴設備,TV大屏設備等多種移動場景,其優勢是使得硬件具有人性化的界面(Activity),並行的服務(Service),高效的數據存儲(ContentProvider),實時的通知調度(BroadcastReceiver)。然而這十多年也累積了很多弊端,像是頗為詬病的碎片化問題,被攻擊的安全隱私問題等。好在官方也在深度維護着Android,基於Android系統的軟件開發開發人員只能盡量規避劣勢,充分發揮優勢。這也是該系列文章的主旨。
在Android系統中,每個應用程序都運行在一個單獨的沙箱環境中,不同應用程序之間的交互受到的限制也越來越多,這一點在Android10及以上的版本中尤為明顯。(Android系統版本適配)
我們所看到的系統主界面,也是一個名為Launcher的應用程序,每個應用程序都會有一個主進程,主進程主要負責與用戶的交互,包括界面顯示,用戶操作等。(Android系統進程及線程)
為了防止不同應用程序之間的越級操作產生安全問題,Android系統將應用程序分為了系統應用和第三方應用,不同級別的應用程序能使用的AndroidSDK接口及Android權限被嚴格區分。有一種簡單區分系統應用和第三方應用的方法,在沒有root的系統上,如果是第三方應用,允許正常用戶卸載,反之就是系統應用。而這里所說的root系統,就是將Android系統上的用戶權限升級為管理員權限,此行為類似於Linux系統中的su root指令。
上面的描述比較隨意,如果對Android系統的底層調用感興趣,可參考菜鳥教程-Android系統架構及其他相關文章,不再過多贅述。
通常意義上,初級的Android應用程序編程,是負責應用程序內部與AndroidSDK接口之間的交流,或涉及到應用程序與系統應用之間的交互,從而生成后綴為apk的應用安裝包,以確保應用程序在Android系統上安裝、運行。這也是該系列文章所涉及的范圍。
本質上后綴為apk的安裝包是Android系統可識別的zip壓縮包,所以在電腦上可以直接將安裝包的后綴改為zip,之后用壓縮軟件解壓打開,就可以一窺究竟。下圖是通過開發軟件創建模板項目,以Kotlin語言開發的HelloWord安裝包的解壓效果。
打開這個安裝包后,Android系統首先會使用META-INF文件夾下的一系列簽名信息,用以校驗該apk是由合法簽名者發布的,而且也可以校驗apk中的文件都是沒有被篡改的。
之后系統會根據AndroidManifest.xml清單文件中記錄的一些基本信息,供系統安裝及開始運行前檢查加載,當然這樣解壓出來的內容是計算機識別的二進制內容。
而程序最主要的邏輯代碼,在classes.dex中,如果代碼過多,還會有classes1.dex,classes2.dex, ...無限增加,而每個dex文件最多只能有65535個方法。
在邏輯代碼中會加載使用一些圖標或全局配置變量,而這些都會以xml格式的形式分類保存在res資源目錄下,該目錄下的子目錄名包括子文件名都是Android系統規定的固定名稱,其填寫內容也必須符合固定格式。如果想在存放自定義的文件,可以新建assets目錄使用。
在classes.dex文件和res目錄之間並不是可以直接對應查找的。通常編程在res中使用的變量大多是String字符串,而且繁瑣的變量名在邏輯代碼中會占據大量存儲空間。為了縮減classes.dex文件大小,在應用程序編譯階段,編譯器會將res中的繁長變量名轉換為int類型的十六進制數字表示,形成一一映射的關系,並將該關系保存在resources.arsc中,這樣在邏輯代碼classes.dex中使用res目錄下的資源時,只需要用一個int變量表示,之后到resources.arsc中找到對應的資源變量,再去res中查找該資源變量的內容。
另外,如果開發的應用程序有使用到Kotlin語言,該壓縮包中還會有kotlin目錄,該目錄下保存了使用的Kotlin語言中的一些定義,從而將編程階段使用的Kotlin直接轉換為dex文件。
開發環境
在Android系統4.0時代,Eclipse和AndroidStudio在Android應用開發軟件市場中還是雙足鼎立的狀態,但是隨着后來的市場發展,AndroidStudio越來越占據主導地位。至少目前看來AndroidStudio還是官方主推的Android應用編程開發軟件,安裝下載流程可參考AndroidStudio官方鏈接。
AndroidStudio是基於JetBrain Idea開發的一款軟件,所以延續了JetBrain系列的風格。還是以上邊HelloWord應用程序的代碼為例,在AndroidStudio中以Android視圖查看截圖如下
這里可以看到該項目下主要有兩個目錄
第一個app目錄是與應用開發相關的,為了實現分包管理開發的目的,AndroidStudio引入module模塊的概念,而這個app目錄就是一個module。在應用的模塊開發策略中,經常見到多個模塊的組裝依賴,而項目的根目錄下就會產生對應模塊的目錄結構。
下邊的GradleScripts目錄與gradle插件有關,說到gradle,主要是AndroidStudio用它來執行編譯app的相關指令,在正常開發中盡量保持AndroidStudio版本與gradle插件版本一一對應的關系,不然很可能出現各種棘手的麻煩。
app目錄
該目錄下的內容大概能與上文對apk的解壓包中各文件對應上。
manifests目錄下的AndroidManifest.xml對應apk中的二進制AndroidManifest.xml。
java目錄下分別三個,都是相同的包名路徑,其中后綴(androidTest)路徑下是可以在Android系統模擬器上運行的測試程序代碼,后綴(test)路徑下是單純Kotlin環境下運行的測試程序代碼,沒有后綴的則是正常應用程序的邏輯代碼。
java(generate)目錄下則是AndroidStudio在編譯上邊java目錄中的源代碼時所產生的編譯文件,一般開發者不需要手動修改。
res目錄下與apk中的res文件夾對應一致,存放應用程序中所用到的資源文件。
res(generate)目錄同樣是AndroidStudio在編譯上邊res目錄中的資源文件時所產生的二進制文件,包括上文apk中的resources.arsc等信息都是在該目錄下生成的。
GradleScript目錄
gradle插件的語法規則可以參考gradle官網教程,一般開發中使用AndroidStudio創建項目后固定的模板內容也足夠了。該目錄下主要有兩種類型的文件,.gradle 文件是gradle插件在編譯項目時用到的配置信息,.pro/.prperties 是AndroidStudio加載gradle插件或其他sdk的配置文件。注意:該目錄下的任何文件編輯修改后,在AndroidStudio中都要Sync一次,才能繼續后面的代碼編輯。
build.gradle(Project)文件配置了項目中使用的外部第三方包倉庫,包括google(),maven(),jcenter()等,另外全局腳本指令或使用的自定義gradle配置文件也可以在該文件中聲明。
build.gradle(Module)文件是屬於上邊名為app的module下的,該文件可以配置app內部需要用到的參數信息,包括module的版本信息等。所以該文件也是開發過程中改動比較頻繁的配置文件。
setting.gradle文件主要保存該項目中用到的各module名稱及項目自身名稱信息。
gradle-wrapper.properties文件配置了當前AndroidStudio所使用的gradle插件版本等信息。
proguard-rules.pro文件用來配置項目編譯時的混淆規則。說到混淆,是在源碼編譯生成apk安裝包時,將源碼中的類名、變量名、方法名、參數名等易懂長字符串,簡化為26個英文字母和數字表示。這樣一方面縮減了apk中class.dex文件的大小,另一方面增加apk逆向的難度。而指定哪些類可以混淆,哪些變量不可以混淆,這些規則就是在該文件中配置的。當然該文件配置之后,需要在上邊對應的module模塊配置文件build.gradle(Module)中配置引用,指向該文件。
gradle.properties文件是配置AndroidStudio中使用gradle插件的配置信息,比如優化gradle的編譯速度,設置編譯過程使用的內存限制等信息。
local.properties文件則是配置AndroidStudio使用的AndroidSdk路徑,或者JNI項目的話也會配置AndroidNdk路徑。
至此,Android應用程序開發中需要用到的基本總結完畢,下一篇開始將介紹應用程序界面相關內容。