Android應(yīng)用程序資源可以分為兩大類寒随,分別是assets和res:
- Assets里面保存的是一些原始的文件誊抛。 根據(jù)文件名來訪問這些文件入愧。
- res里面包含很多類型的文件涉兽,都需要根據(jù)Id來訪問叫胖。
通過ClassLoader 實(shí)現(xiàn) Hotfix 可能存在的一個(gè)問題就是草冈,兩次打包間資源ID很可能會(huì)發(fā)生變化。
比如打包前有一個(gè)String資源ID為0x7f050005瓮增。如果資源文件發(fā)生變化怎棱,比如我們?cè)赿ev上新加了資源或者重命名了資源,即使不被當(dāng)前Hotfix包含的Class所引用钉赁,也可能會(huì)導(dǎo)致問題蹄殃,因?yàn)橘Y源文件的ID可能發(fā)生了變化。
這幾天想通過Hack 打包中AAPT處理資源文件的過程來盡量保證多次打包過程中未發(fā)生變化的資源的ID盡量保持一致你踩∽缪遥總體來說思路是對(duì)的,但是施行起來難度比較大带膜。
-
Android打包過程中對(duì)資源文件的處理吩谦。
推薦這篇文章 。 偷張圖來表示以下aapt打包資源文件的流程:
資源文件打包流程 -
對(duì)以上流程了解后膝藕,發(fā)現(xiàn)在Add Resource Symbols階段會(huì)在 /app/build/symbols/release/ 下生成一個(gè)R.txt文件式廷。 格式如下
int attr button_color_normal 0x7f010000 int attr button_color_pressed 0x7f010001 int attr navigation_bar_background 0x7f010002 int color black 0x7f040000 int color grey 0x7f040001 int color red 0x7f040002 int color user_center_button_normal 0x7f040003 int color user_center_button_pressed 0x7f040004 int color user_center_clickable_text_color 0x7f040005
預(yù)期是第一次打包后,緩存R.txt文件芭挽,然后第二次打包時(shí)滑废,優(yōu)先根據(jù)上次的R.txtl來設(shè)置ResourceID。
-
接下來就是定制Gradle task來滿足我們的需求了袜爪。但是難點(diǎn)在于我們必須要了解相關(guān)Gradle Task的邏輯蠕趁,以便我們來做Hack,但是這方面相關(guān)的資料好少辛馆。以下是相關(guān)的Task(通過 -m 參數(shù)來獲取的)俺陋。
:app:prepareReleaseDependencies SKIPPED :app:mergeReleaseAssets SKIPPED :app:compileReleaseRenderscript SKIPPED :app:generateReleaseResValues SKIPPED :app:generateReleaseResources SKIPPED :app:mergeReleaseResources SKIPPED :app:processReleaseManifest SKIPPED :app:processReleaseResources SKIPPED
我正在嘗試下載Android Studio的源碼來查看這部分的具體邏輯。昙篙。腊状。。苔可。