前言
公司因?yàn)槟承I(yè)務(wù)員需要做SDK給到合作方接入,但是卻不希望源代碼泄露(其實(shí)沒啥源代碼),需要我們做混淆。。。WDNMD,噩夢開始了。然并卵,代碼還是得擼起來。

方案一:生成AAR
缺點(diǎn):AAR不能包含所依賴的項(xiàng)目。接入體驗(yàn):低。
方案二:生成帶有依賴包的AAR
Gradle編譯編譯生成帶有依賴Jar的AAR包,參照:
https://github.com/kezong/fat-aar-android
優(yōu)點(diǎn):完美解決方案一的缺點(diǎn)。
缺點(diǎn):如果接入項(xiàng)目的依賴與AAR包中的依賴包有沖突,編譯會(huì)不成功,各種排除沖突都會(huì)失效。接入體驗(yàn):中
方案三:將AAR發(fā)布到Jcenter后進(jìn)行遠(yuǎn)程依賴
接入體驗(yàn):高
優(yōu)點(diǎn):完美解決以上兩個(gè)方案的缺點(diǎn)。
缺點(diǎn):提交到Jcenter的項(xiàng)目代碼是不會(huì)被混淆的,也就不符合我期望的核心要求-“代碼混淆”。

最終方案:將AAR打成Jar包,新建一個(gè)空殼庫,導(dǎo)入Jar包,添加Jar包需要的依賴,發(fā)布空殼庫到Jcenter。

下面來開始技術(shù)總結(jié)
- 一、注冊bintray賬號,不會(huì)的交由其他熱心開發(fā)處理
- 二、在需要打成AAR的庫的build.gradle文件下添加編譯Jar包的代碼
如果你需要混淆,請?zhí)崆按蜷_ 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 執(zhí)行代碼
./gradlew makeJar
然后會(huì)在庫的build/outputs下生成Jar包
-
四、新建一個(gè)項(xiàng)目,再新建一個(gè)moudle,導(dǎo)入這個(gè)Jar包
順便把Jar包的混淆代碼也復(fù)制一份到新建moudle里面來然后在新建moudle的build.gradle下添加一份這樣子的代碼
android {
...
defaultConfig {
...
consumerProguardFiles 'proguard-rules.pro'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//導(dǎo)入Jar包需要的依賴
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
...
api files('libs/xxxxxxxxx.jar')
}
- 五、導(dǎo)入 bintray-release 將新建的moudle發(fā)布到Jcenter
- 六、依賴使用
