最近項目中有用到發佈混淆aar的需求,網上有很多方法,但都不夠全面,這裏把自己整理的結果做個彙總,避免重複收集浪費時間
環境要求
android studio(該方法是針對AS的)
初始需求
把你項目中的某一個模塊,打包成一個混淆的aar,集成到其他的項目中,同事暴露的接口不混淆,你這個aar的依賴庫跟其他項目的依賴庫不能衝突
需求詳情
假設目前的項目有三個module,A, B, C,A是application類型,B, C是library,關係是A依賴B,B依賴C,現在要把B模塊打包成一個混淆的aar發佈給其他的項目使用,其他項目拿到B的aar以後,集成要OK,並且依賴沒問題
好,背景情況介紹完了,下面是解決方法
1 依賴關係剝離
把B模塊中的一些依賴的庫全部移到C中,比如網絡庫,圖片庫和其他第三方的庫,統統剝離,放到C中,B只是一個純粹的實現某個需求一個模塊庫,不包含其他任何第三方依賴庫,這種剝離是爲了方便後期其他項目的接入
2 配置B的混淆
- 把B的入口方法統一到一個類中,在混淆文件中加上keep的方法,讓這個類不被混淆,同事R文件也能混淆,配置方式如下:
-keep class *.R -keepclasseswithmembers class **.R$* { public static <fields>;}
其他的混淆配置看項目具體的情況了,一般實力類不混淆,不屬於這個主題,不多介紹了 - build.gradle配置
要配置對應生成aar的那個模塊的build.gradle,其他的模塊的不要改動,配置方式如下:
沒看錯,只要配置release就可以了,把minifyEnabled設置成ture就可以了buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
3 生成aar
生成aar非常簡單,只要運行項目,在對應的build路徑下會自動生成aar,比如我這個demo項目的aar路徑是:
E:\practise\AarDemo\mylibrary\build\outputs\aar
裏面有兩個aar,一個是debug,一個是release,拿release那個,debug那個是沒有混淆的
4 發佈aar
- 把你要發佈的aar,和該aar說依賴第三方的庫整理好,一起給要新的項目,新的項目如果已經有依賴那些第三方的庫,則無需重新依賴,對於沒有依賴的,就要配置依賴關係,這個就是第一步剝離依賴的好處,避免多餘的依賴
- 在新的項目的application模塊的libs文件夾下面放上該aar文件,同事在該模塊對應的build.gralde中加上下面的配置
dependencies { compile(name:'mylibrary-release', ext:'aar') } repositories{ flatDir{ dirs 'libs' }
}
打包aar 時 如何不混淆某個類及裏邊的某個方法
-keep class com.demo.download.DownloadManager { public static DownloadManager getInstance(); public void startDownload(Url, java.lang.String, Callback); }