android 子module混淆_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 包体积的增大,所以在编码中就要做好优化工作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值