Android 項目構建過程

Android項目構建過程:平常開發中使用ide可以很方便構建打包編譯成一個Apk包安裝到手機,那麼整個流程到底是啥樣的呢?
我們可以根據Google官方提供的流程圖來具體瞭解構建的過程, 構建工具放在Android sdk目錄下面的build-tools文件夾下:
這裏寫圖片描述

下面是具體描述:

1.AAPT(Android Asset Packaging Tool)工具會打包應用中的資源文件,如AndroidManifest.xml、layout佈局中的xml等,並將xml文件編譯爲二進制形式,當然assets文件夾中的文件不會被編譯,圖片及raw文件夾中的資源也會保持原來的形態,需要注意的是raw文件夾中的資源也會生成資源id。AAPT編譯完成之後會生成R.Java文件。
詳細命令參考: aapt 命令可應用於查看apk包名、主activity、版本等很多信息

1.  aapt l[ist] [-v] [-a] file.{zip,jar,apk} 列出壓縮文件目錄
2. aapt d[ump] [--values] WHAT file.{apk} [asset [asset ...]]
3.查看apk包的packageName、versionCode、applicationLabel、launcherActivity、permission等各種詳細信息
aapt dump badging <file_path.apk>
...

2.AIDL工具會將所有的aidl接口轉化爲java接口。

Android:學習AIDL,這一篇文章就夠了

1.AIDL是什麼?
///AIDL是一個縮寫,全稱是Android Interface Definition Language,也就是Android接口定義語言。
2.AIDL是如何工作的?
///一類是用來定義方法接口,以供系統使用來完成跨進程通信的
///一類是用來定義parcelable對象,以供其他AIDL文件使用AIDL中非默認支持的數據類型
使用:
第一塊是 初始化 。在 onCreate() 方法裏面我進行了一些數據的初始化操作。第二塊是 重寫 BookManager.Stub 中的方法 。在這裏面提供AIDL裏面定義的方法接口的具體實現邏輯。第三塊是 重寫 onBind() 方法 。在裏面返回寫好的 BookManager.Stub 。
3.爲什麼設計AIDL?
///AIDL目的是爲了實現 進程間通信 。

客戶端:調用AIDL-->客戶端與服務端交互-->IBinder 的一個代理類Proxy-->transact()方法-->將客戶端的數據和請求發送到服務端去。

服務端:onTransact()方法
1,獲取客戶端傳過來的數據,根據方法 ID 執行相應操作。
2,將傳過來的數據取出來,調用本地寫好的對應方法。
3,將需要回傳的數據寫入 reply 流,傳回客戶端。

3.所有的java代碼,包括R.java與aidl文件都會被Java編譯器編譯成.class文件。

4.Dex工具會將上述產生的.class文件及第三庫及其他.class文件編譯成.dex文件(dex文件是Dalvik虛擬機可以執行的格式),dex文件最終會被打包進APK文件。

5.ApkBuilder工具會將編譯過的資源及未編譯過的資源(如圖片等)以及.dex文件打包成APK文件。

6.生成APK文件後,需要對其簽名纔可安裝到設備,平時測試時會使用debug keystore,當正式發佈應用時必須使用release版的keystore對應用進行簽名。

7.如果對APK正式簽名,還需要使用zipalign工具對APK進行對齊操作,這樣做的好處是當應用運行時會提高速度,但是相應的會增加內存的開銷。

參考: Android應用程序Zipalign化

zipalign使用了4字節的邊界對齊方式來映射內存,通過空間換時間的方式提高執行效率。
//zipalign優化的最根本目的是幫助操作系統更高效率的根據請求索引資源,將resource-handling code統一將Data structure alignment(數據結構對齊標準:DSA)限定爲4-byte boundaries。如果第一次接觸有關Data structurealignment的內容,強烈建議搜索更多與其相關的內容來充分理解這樣做的最終目的,這也是理解zipalign工作原理的關鍵。 如果不採取對齊的標準,處理器無法準確和快速的在內存地址中定位相關資源。

zipalign位於android sdk的tools文件夾下面所以cmd進入命令行模式進入到tools目錄:執行
//zipalign -v 4 source.apk destination.apk(目標apk)
其中這裏-v代表詳細輸出, 4代表對齊爲4個字節
//zipalign -c -v 4 destination.apk 
來查看是否成功的優化了你的apk文件,這裏-c參數代表檢查對齊,可以看作是隻讀執行,最後提示大家這步可能會造成文件簽名問題,注意和apk簽名執行的順序。

數據的字節對齊(data structure alignment)

1. 爲什麼需要字節對齊

1、處理器的差異
2、出於CPU讀取內存數據效率的考慮。

2.結構對齊的基本原則:

1、結構體對齊的字節數是此結構體所有成員對齊的字節數中的最大值。
2、結構體每一個成員自身要保持字節對齊。
3、如果結構體中包含嵌套子結構體,那麼子結構體自身必須對齊。
4、對於整個結構體,要根據規則1中“結構體對齊的字節數”滿足字節對齊,對於沒有對齊的情況,需要在最後增加pading。

C語言中,基本數據類型默認的對齊方式:

類型 長度(字節) 對齊方式
Cha 1 1字節對齊
short 2 2字節對齊
int 4 4字節對齊
long 4 4字節對齊
Float 4 4字節對齊
double 8 8字節對齊(windows);4字節對齊(Linux)
指針 4 4字節對齊

從上面的結構體規則以及表格的基本數據類型對其字節數了解爲什麼android zipAlign採用4字節爲邊界對齊。

如何用提問方式促進深度思考?

最後看到一篇文章:用提問來促進思維——談 WHAT HOW WHY 三部曲

WHAT HOW WHY 的步驟:
1. WHAT(相當於初級工程師–攻克初級使用層次~)
當我們開始瞭解某個事物的時候,總是先從 WHAT 類型的問題開始入手。而所謂的【WHAT】也就是“What is it?”

從 WHAT 類型的問題得到的答案,通常只反映出事情的表面現象。而表象跟本質,往往是不同的,甚至是相反的。如果你僅僅停留在 WHAT 層面,很可能會被表象所誤導。

2.HOW(相當於中級工程師–攻克原理性層次~)
所謂的【HOW】就是“How to do?”。

和 WHAT 層次不同的是,HOW 層次光靠記憶力是遠遠不夠滴。你還需要具備一定的分析推理能力,還需要懂得查閱相關資料,才能搞明白上述 HOW 類型的問題。

3.WHY(相當於高級工程師–攻克系統層次~)
當你能夠比較透徹地釐清 HOW 層面的各類問題,就可以開始思考 WHY 類型的問題了。

WHY 類型的問題比 HOW 類型的問題更難回答——在回答 WHY 類型問題的過程中,你不但需要動用分析、推理、歸納、總結等各種思維能力,可能還要運用到跨領域、跨學科的知識。但是收穫也是很大的。一旦把這些 WHY 類型的問題想明白,你就對整個事件有一個既宏觀又深刻的認識。能達到這個境界,看問題通常會比較深刻。可惜這樣的人比例太低了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章