美文网首页Android
apk编译时固定R.id

apk编译时固定R.id

作者: yin_xin | 来源:发表于2023-02-09 11:00 被阅读0次

    场景

    热修复生成补丁时,基线apk和修复后apk中资源id固定,可以有效减少补丁大小

    1. 创建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参数输出本次的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参数固定母包中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值不变

    相关文章

      网友评论

        本文标题:apk编译时固定R.id

        本文链接:https://www.haomeiwen.com/subject/yowckdtx.html