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檔案。
詳細命令參考:
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介面。
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進行對齊操作,這樣做的好處是當應用執行時會提高速度,但是相應的會增加記憶體的開銷。
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簽名執行的順序。
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 的步驟:
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 型別的問題想明白,你就對整個事件有一個既巨集觀又深刻的認識。能達到這個境界,看問題通常會比較深刻。可惜這樣的人比例太低了。