Android 多模块打包混淆填坑记

最近有个 sdk 的项目使用了多模块(Module)开发,然后提供 jar 包给接入者使用,要求大部分类是混淆过的,保留几个接口,

Android Studio 能够导出 aar 文件,对于导出 jar 却要大费一番周折。我在网上找到这个比较靠谱的解决方案: [Android Studio分模块自动化构建实战](Android Studio分模块自动化构建实战),它通过 shell 脚本执行 Java 打包命令,解压各个模块的 class 文件然后合成一个完整的 class 文件。

导出 jar 后,下一步就是进行混淆了。根据网上的资料,我自己写了一个 gradle task: proguardJar,专门用来做混淆。遇到的坑就是下面的 libraryjars,加上该参数会忽略 jar 包引用的 Java 和 Android API,保证混淆继续进行,要不然就会出现类似 can't find referenced class java.lang.String 这样的报错。

// 混淆 jar 包
task proguardJar(type: ProGuardTask) {
    def properties = new Properties()
    def file = file("../../local.properties")
    properties.load(new FileInputStream(file))
    def sdkDir = properties.getProperty("sdk.dir")

    // 输出路径
    def path = "../../output/${project.ext.SDK_NAME}.jar"
    delete path

    // 未混淆的jar路径
    injars "../../output/unminified/${project.ext.SDK_PRODUCT}_sdk_unminified.jar"
    // 混淆后的jar输出路径
    outjars path
    // 混淆协议
    configuration '../../proguard-rules.pro'

    // 忽略 Java 和 Android API
    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
    libraryjars "${System.getProperty('java.home')}/lib/jce.jar"
    libraryjars "${sdkDir}/platforms/android-${rootProject.ext.pyramidneyCompileSdkVersion}/android.jar"

    println("proguardJar done!")
}

另外,混淆规则需要加上 -dontshrink,表示不压缩输入的类文件,比如不会移除无用的方法、域或者类。这样做的目的是保留对外的接口,但是带来的问题是 jar 包体积的增大,所以在编码中就要做好优化工作。

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

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 179,392评论 25 708
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,724评论 19 139
  • 哈喽北鼻,最近看到一组情侣的恋爱日常,快齁死我了!必须分享给你们,看看人家是怎么谈恋爱的! 01 02 03 04...
    奇趣玩阅读 1,650评论 1 8
  • 久歌未央/文 1 我和林白是在一场相亲中认识的。 一直都觉得相亲这种事从不靠谱,唯一靠谱的只是时间。 阿叶是我的好...
    这个周末阅读 677评论 3 2
  • 用了好久的时间,一直在学习奔跑,独立。父亲和丈夫终于开始认可我的努力,虽然只是那么一点点,我也很开心。挣开你们那双...
    迷糊Y头阅读 413评论 0 0

友情链接更多精彩内容