在進行外掛程式化開發時,如果外掛程式apk含有res資源,宿主apk和外掛程式apk在編譯時都會產生自己的resources.arsc
。由於打包後的宿主和外掛程式apk資源id預設都是0x7f開頭,那麼它們的resources.arsc
中的資源id必定是有相同的情況,會引起資源id衝突問題。
解決問題目前一共有兩種思路:
1. 修改aapt原始碼,定製aapt工具,編譯期間修改pp段。(pp欄位是資源id的第乙個位元組,表示包空間)
dynamicapk的做法就是如此,定製aapt,替換google的原始aapt,在編譯的時候可以傳入引數修改pp段:例如傳入0x05編譯得到的資源的pp段就是0x05。對於具體實現可以參考這篇部落格
2. 修改aapt的產物,即,編譯後期重新整理外掛程式apk的資源,編排id。
virtualapk採用的就是這個方案。對於具體實現可以參考這篇部落格
這兩種方式都有點麻煩,這兩天忽然發現了aapt2支援一些新引數,其中有兩個引數可以直接指定編譯出apk的id範圍:
–package-id package-id
指定生成資源索引表的packageid ,設定的packageid 必須大於或者等於0x7f。要是與 --allow-reserved-package-id聯合使用就可以不受這個限制
–allow-reserved-package-id
允許設定packageid為 0x02 到 0x7e ,這個只適用最小版本是26及以下(注意:這個在buildtoolversion:28.0.3之後才有的)
aaptoptions
同時注意aapt2是開啟狀態,這樣編譯出來的apk resourceid就是0x70開頭的了,與預設的0x7f區分開來。
aapt2的簡介:
aapt 是android asset packaging
tool的縮寫,是編譯和打包資源的工具。而aapt2是在aapt上做了優化。android gradle plugin
3.0.0或者更高版本預設開啟aapt2。當然也可以在配置檔案中手動關閉aapt2。在gradle.properties設定android.enableaapt2=false即可
參考
使用gradle實現批量修改生成的apk檔名
在我們一次性打幾十個渠道包的時候,如果我們想讓打包完成的apk檔名按照我們想要的格式來命名,比如明確的apk的版本號,打包日期,那個渠道的包等等,這時就需要使用gradle的variants屬性來動態修改生成的apk檔名 def buildtime android apk output.output...
cocos2d x的安卓平台打包apk的bug
首先分享乙個 關於apk打包的詳細教程,這個上面也提到了一些bug以及解決方案。下面是我自己遇到的bug 1,在cocos2d x的目錄下setup.py檔案的android的sdk ndk或ant目錄設定錯誤。解決方案 右鍵我的電腦 屬性 高階系統設定 環境變數 root刪除,重新執行setup....
Cocos2d x打包成APK時需要注意的問題
1 修改程式安裝後再手機上顯示的名字 2 so檔案,每用cgydrive打包一次就得從新匯入一次,匯入路徑為libs armeabi,so檔案為cocos2d x和安卓的交叉編譯檔案,每次打包都會導致匯入的.so檔案丟失。4 新增計費時,別忘了在配置檔案中新增對應的許可權,否則可能不會彈出計費框。5...