AndResGuard keepmapping 的一个坑

AndResGuard是微信的资源压缩工具,减少包体积大小的利器。
我们项目是在Jenkins上面构建的,所以是通过命令来执行的。我们直接来看代码
代码里面我有注释

/**
 * 压缩APK
 */
def compress = {
    name ->
        //减去.apk
        def path = name.substring(0, name.length() - 4)
        def guardJarFile = file('./AndResGuard/AndResGuard-cli-1.2.15.jar')
        def guardConfigFile = file('./AndResGuard/config.xml')
        def originApkFile = file("./target/${name}")
        def outputDir = file("./target/outapk")
        def tempOutputDir = file("./target/tempoutapk")
        //def patchTool = "$projectDir/patch/apkpatch-1.0.3/apkpatch.sh"
        def zipPath
        if (Os.isFamily(Os.FAMILY_WINDOWS)) {
            //patchTool = "$projectDir/patch/apkpatch-1.0.3/apkpatch.bat"
            zipPath = file('./AndResGuard/7-Zip/7za')
        } else {
            zipPath = file('./AndResGuard/bin/7za')
        }
        def zipalignPath = file(System.getenv('ANDROID_HOME') + "/build-tools/${build_tools_version}/zipalign")
        // 开始执行压缩命令
        println "guardJarFile " + guardJarFile
        println "zipPath " + zipPath
        println "originApkFile " + originApkFile
        println "ZipAlign apk, tools: " + zipalignPath.absolutePath
        //主要就是这里,如果我们在这个地方直接加如-mapping命令的话是无效的(我的版本是1.2.15)
        //不知道是Bug还是什么,所以最后我是在confing文件里面加的这个keepmaping
        def proc = """java -jar ${guardJarFile} ${originApkFile} -config ${guardConfigFile}
                    -out ${tempOutputDir} -signature ${gKeyStore} ${gStorePass} ${gKeyPass} ${gAlias}
                    //-mapping ${maapingFilePath}   在这里加这句不生效
                    -7zip ${zipPath} -zipalign ${zipalignPath}""".execute()
        proc.waitFor()
        println "return code: ${proc.exitValue()}" + ", stderr: ${proc.err.text}" + " stdout: ${proc.in.text}"
        //压缩后会清空目标文件夹,所以新建了tempOutputDir做为缓存目录,压缩成功后再复制到outputDir,
        // 不然多包操作目标目录最后会只剩下最后的一个包
        tempOutputDir.listFiles().each {
            println "tempOutputDir:" + it
            if (it.name.endsWith(".apk") || it.name.endsWith(".txt")) {
                copyFile.call(it.getAbsolutePath(), outputDir.getAbsolutePath() + "/" + it.name)
            }
        }
}

最后的方案如下图,注意resource_mapping文件的路径:


image.png

至于resource_mapping.txt怎么在Jenkins上同步到Git仓库可以查看我另外的文章
Gradle(groovy)中执行Git命令,Jenkins构建后提交文件到Git仓库

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容