前言
公司因为某些业务员需要做SDK给到合作方接入,但是却不希望源代码泄露(其实没啥源代码),需要我们做混淆。。。WDNMD,噩梦开始了。然并卵,代码还是得撸起来。
方案一:生成AAR
缺点:AAR不能包含所依赖的项目。接入体验:低。
方案二:生成带有依赖包的AAR
Gradle编译编译生成带有依赖Jar的AAR包,参照:
https://github.com/kezong/fat-aar-android
优点:完美解决方案一的缺点。
缺点:如果接入项目的依赖与AAR包中的依赖包有冲突,编译会不成功,各种排除冲突都会失效。接入体验:中
方案三:将AAR发布到Jcenter后进行远程依赖
接入体验:高
优点:完美解决以上两个方案的缺点。
缺点:提交到Jcenter的项目代码是不会被混淆的,也就不符合我期望的核心要求-“代码混淆”。
最终方案:将AAR打成Jar包,新建一个空壳库,导入Jar包,添加Jar包需要的依赖,发布空壳库到Jcenter。
下面来开始技术总结
- 一、注册bintray账号,不会的交由其他热心开发处理
- 二、在需要打成AAR的库的build.gradle文件下添加编译Jar包的代码
如果你需要混淆,请提前打开 minifyEnabled true 并编写好混淆代码
def SDK_BASENAME = "custom_sdk";
def SDK_VERSION = "_v1.0.0";
def sdkDestinationPath = "build/outputs/jar/";
def zipFile = file('build/intermediates/packaged-classes/release/classes.jar')
task deleteBuild(type: Delete) {
delete sdkDestinationPath + SDK_BASENAME + SDK_VERSION + ".jar"
}
task makeJar(type: Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main', includes: ['assets/**']) // 打包assets目录下的所有文件
baseName = SDK_BASENAME + SDK_VERSION
destinationDir = file(sdkDestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
- 三、Terminal 执行代码
./gradlew makeJar
然后会在库的build/outputs下生成Jar包
-
四、新建一个项目,再新建一个moudle,导入这个Jar包
顺便把Jar包的混淆代码也复制一份到这个库里面来然后在这个库的build.gradle下添加一份这样子的代码
android {
...
defaultConfig {
...
consumerProguardFiles 'proguard-rules.pro'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//导入Jar包需要的依赖
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
...
api files('libs/xxxxxxxxx.jar')
}
- 五、导入 bintray-release 将新建的moudle发布到Jcenter
- 六、依赖使用
网友评论