apk編譯時固定R.id

場景

熱修復生成補丁時,基線apk和修復后apk中資源id固定,可以有效減少補丁大小

  1. 創(chuàng)建ids_keep.gradle文件
android.aaptOptions {
    //歸檔目錄:rootProject/archived
    String dirName = "archived"
    File archivedDir = project.rootProject.file(dirName)
    if (!archivedDir.exists()) {
        archivedDir.mkdirs()
    }
    //保存本次編譯產生的ids
    String time = new Date().format("yyyyMMdd_HHmmss", TimeZone.getTimeZone("GMT+08:00"))
    File outIdsFile = project.rootProject.file("${dirName}${File.separator}ids_${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}_${time}.txt")
    //用aapt2 --emit-ids參數(shù)輸出本次的ids
    android.aaptOptions.additionalParameters("--emit-ids", "${outIdsFile}")

    //如果存在母包ids,則采用母包中ids分配
    if (baseIdsFileName != null && !baseIdsFileName.isEmpty()) {
        File inIdsFile = project.rootProject.file("${dirName}${File.separator}${baseIdsFileName}")
        if (!inIdsFile.exists()) {
            project.logger.error "請檢查配置,母包ids文件不存在,${inIdsFile}"
        } else {
            project.logger.error "正在應用母包ids文件,${inIdsFile}"
            //用aapt2 --stable-ids參數(shù)固定母包中ids
            android.aaptOptions.additionalParameters("--stable-ids", "${inIdsFile}")
        }
    } else {
        project.logger.error "沒有配置母包ids文件,可能導致熱修復補丁異常"
    }
}

該腳本會在每次編譯時生成一份ids_xxx_xxx_xxx.txt文件,該文件記錄了本次編譯時R.id資源分配

  1. 在打包的app module中引用該腳本
//生成補丁時功能時,配置基線包的ids文件,正常打包時可以配置為""
ext.baseIdsFileName = "ids_xxx_xxx_xxx.txt"
apply from: '../ids_keep.gradle'

配置了基線ids后,在編譯apk時就會保持基線ids文件中已有的id值不變

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容