Android技术知识Android开发Android开发经验谈

混淆后的AAR发布到Jcenter最靠谱的的方式

2019-11-15  本文已影响0人  夏季凉茶

前言

公司因为某些业务员需要做SDK给到合作方接入,但是却不希望源代码泄露(其实没啥源代码),需要我们做混淆。。。WDNMD,噩梦开始了。然并卵,代码还是得撸起来。


方案一:生成AAR

缺点:AAR不能包含所依赖的项目。接入体验:低。

方案二:生成带有依赖包的AAR

Gradle编译编译生成带有依赖Jar的AAR包,参照:
https://github.com/kezong/fat-aar-android
优点:完美解决方案一的缺点。
缺点:如果接入项目的依赖与AAR包中的依赖包有冲突,编译会不成功,各种排除冲突都会失效。接入体验:中

方案三:将AAR发布到Jcenter后进行远程依赖

接入体验:高
优点:完美解决以上两个方案的缺点。
缺点:提交到Jcenter的项目代码是不会被混淆的,也就不符合我期望的核心要求-“代码混淆”。


最终方案:将AAR打成Jar包,新建一个空壳库,导入Jar包,添加Jar包需要的依赖,发布空壳库到Jcenter。

下面来开始技术总结

如果你需要混淆,请提前打开 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)
./gradlew makeJar

然后会在库的build/outputs下生成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')
}
上一篇下一篇

猜你喜欢

热点阅读