<p>本篇文章谋梭,我們將介紹apk生成的大致流程信峻,并通過大量的案例來展示各種資源的加載過程。</p>
<p>首先說一下資源是怎么生成的瓮床。資源生成的工具叫做 AAPT 盹舞, AAPT 是一個可執(zhí)行的工具产镐,主要負(fù)責(zé)資源的編譯和打包。</p>
資源的打包
- XML 文件通過 AAPT 編譯會生成一個編譯過的 XML 文件
- Values 編譯過后沒有一個對等的文件踢步,編譯過后的 dimens 癣亚、 colors 文件數(shù)值會存儲在 Android 的一個資源包里 resource.arsc , resource.arsc 是一個資源的索引获印。
- Image 通過 AAPT 會 Crunch 述雾, Crunch 會將 png 進行壓縮形成 Android 系統(tǒng)的 Image 文件;值得一提的是兼丰,我們在制作** 點9圖 **時會有一些伸縮的信息玻孟,而 Crunch 不會將這些信息存儲起來,而是將數(shù)據(jù)保存在 resource.arsc 文件里面鳍征。
- Raw文件就相對簡單黍翎,直接Copy進APK包里的Raw文件中
Resource ID(資源ID)
我們在編寫代碼的時候會對 XML、Values 等資源進行引用艳丛,這時候我們會通過 R.Java 文件去引用匣掸。實際上 AAPT 在將資源文件編譯成 R 文件之前 會先將資源文件轉(zhuǎn)化成一個 R.text 然后再將 R.text 轉(zhuǎn)化成 R.java,而在 R.java 文件里面质礼,引用的資源是用 Resource ID 來標(biāo)識的旺聚。所以在這里我們有必要介紹一下 Resource ID。
<p> Resource ID 是由一個4個字節(jié)的 int 組成的眶蕉,而 Resource ID 又可以拆分成三個部分:</p>
Resource ID的邏輯結(jié)構(gòu)
- 第一個字節(jié)表示這個資源是屬于哪一個包的
- 第二個字節(jié)表示這個資源是什么類型的
- 第三砰粹、四個字節(jié)就是表示這個資源所唯一的標(biāo)識符
getString( )
getString()引用String資源的流程:
1. getString();409Context(android.context),Context.java
2. getString();400,Resources(android.context.res),Resources.java
3. getText();308,Resources(android.context.res),Resources.java
5. getResourcesText();105,AssetManager(android.context.res),AssetManager.java
getString( ) 邏輯結(jié)構(gòu)圖
getLayout( )
<p>
getLayout()引用Layout資源的流程:</p>
1. getLayout();1165,Resources(android.content.res),Resources.java
2. loadXmlResourceParser();2776,Resources(android.content.res),Resources.java
3. loadXmlResourceParser();2803,Resources(android.content.res),Resources.java
4. openXmlBlockAsset();485,AssetManasger(android.content.res),AssetManager.java
Xml Block邏輯圖
getLayout( )邏輯結(jié)構(gòu)
getDimention( )
<p>
getDimention( )流程圖:
</p>
1. getDimention();620,Resources(android.content.res),Resources.java
2. getValue();1347,Resources(android.content.res),Resources.java
3. getResourcesValue();196,AssetManager(android.content.res),AssetManager.java
getDimention( ) 邏輯結(jié)構(gòu)
getDrawable( )
getDrawable( )結(jié)構(gòu)流程圖
完結(jié)