AndroidStudio打包.jar文件并混淆部分代碼

應客戶需求,將App中的某個模塊功能做成SDK供其使用
注:以下代碼為:2018.7.28修改(之前自己寫的那個編譯不過),修改后基本都是復制而來,<來自這里>,經實踐驗證,所以更新來我之前的方法

需求分析:

  • 1、介于該模塊沒有UI頁面,所以將其打包成.jar文件;
  • 2、若需要UI界面,可使用.arr文件<下文不提及.arr打包和使用>;
  • 3、若包含有.so文件引用,可以使用.arr,也可以打包.jar另附.so 文件

開始

一、注意
  • 打包.jar文件時引用第三方框架要下載導入其.jar文件;
  • 能不引入第三方的盡量使用原生Api來實現;
二、新建Module或者使用已存在的;
  • 在mudule中的build.gradle設置apply plugin: 'com.android.library'
  • 在android和dependencies同級添加task makeJar如下:

task makeJar(type: Jar, dependsOn: ['compileReleaseJavaWithJavac']) {
    appendix = 'sdk'
    baseName = 'superPay'
    version = '1.0.0'
    classifier = 'release'
    extension = 'jar'//后綴名
    //需打包的資源所在的路徑集
    def srcClassDir = ["build/intermediates/classes/release"]
    //初始化資源路徑集
    from srcClassDir
    //去除路徑集下部分的資源
    exclude 'com/along/pay/BuildConfig.class'
    exclude '**/R.class'
    exclude '**/R\$*.class'
    //只導入資源路徑集下的部分資源
    include 'com/along/pay/**/*.class'
}

task proguardJar(dependsOn: ['makeJar'], type: proguard.gradle.ProGuardTask) {
    //Android 默認的 proguard 文件
    configuration android.getDefaultProguardFile('proguard-android.txt')
    //manifest 注冊的組件對應的 proguard 文件
    configuration 'proguard-rules.pro'
    String inJar = makeJar.archivePath.getAbsolutePath()
    //輸入 jar
    injars inJar
    //輸出 jar
    outjars inJar.substring(0, inJar.lastIndexOf(File.separator)) + "/proguard-${makeJar.archiveName}"
    //設置不刪除未引用的資源(類,方法等)
    dontshrink
    Plugin plugin = getPlugins().hasPlugin("AppPlugin") ?
            getPlugins().findPlugin("AppPlugin") :
            getPlugins().findPlugin("LibraryPlugin")
    if (plugin != null) {
        List<String> runtimeJarList
        if (plugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
            runtimeJarList = plugin.getRuntimeJarList()
        } else if (android.getMetaClass().getMetaMethod("getBootClasspath")) {
            runtimeJarList = android.getBootClasspath()
        } else {
            runtimeJarList = plugin.getBootClasspath()
        }
        for (String runtimeJar : runtimeJarList) {
            //給 proguard 添加 runtime
            libraryjars(runtimeJar)
        }
    }
}

完成以上代碼之后,

三、配置混淆代碼

1、配置混淆文件:
當前module的混淆文件proguard-rules.pro,當然還是要按需求自己增刪改查一下的


-ignorewarnings                     # 忽略警告,避免打包時某些警告出現
-optimizationpasses 5               # 指定代碼的壓縮級別
-dontusemixedcaseclassnames         # 是否使用大小寫混合
-dontskipnonpubliclibraryclasses    # 是否混淆第三方jar
-dontpreverify                      # 混淆時是否做預校驗
-verbose                            # 混淆時是否記錄日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆時所采用的算法


-dump class_files.txt    #記錄生成的日志數據,gradle build時在本項目根目錄輸出 apk 包內所有 class 的內部結構
-printmapping mapping.txt       #混淆前后的映射 (我是在使用了這條語句后,就在build\outputs\mapping\你的項目名\release\文件夾下,出現了dump.txt, mapping.txt, seeds.txt, usage.txt)
-printseeds seeds.txt  #未混淆的類和成員
-printusage unused.txt (dump.txt) #列出從 apk 中刪除的代碼



-dontwarn android.support.v4.**     #缺省proguard 會檢查每一個引用是否正確,但是第三方庫里面往往有些不會用到的類,沒有正確引用。如果不配置的話,系統就會報錯。
-dontwarn android.os.**
-keep class android.support.v4.** { *; }        # 保持哪些類不被混淆
-keep class com.baidu.** { *; }
-keep class android.os.**{*;}

-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.support.v4.widget


-keepclasseswithmembernames class * {       # 保持 native 方法不被混淆
     native <methods>;
 }

-keepclasseswithmembers class * {            # 保持自定義控件類不被混淆
     public <init>(android.content.Context, android.util.AttributeSet);
 }

-keepclasseswithmembers class * {            # 保持自定義控件類不被混淆
     public <init>(android.content.Context, android.util.AttributeSet, int);
 }

-keepclassmembers class * extends android.app.Activity { #保持類成員
    public void *(android.view.View);
 }

-keepclassmembers enum * {                  # 保持枚舉 enum 類不被混淆
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }

-keep class * implements android.os.Parcelable {    # 保持 Parcelable 不被混淆
   public static final android.os.Parcelable$Creator *;
 }

#上面是公共可用的,這個是我自己實際測試用的
-keep public class com.along.pay.Functions{  # 保持 提供外部調用的類和方法不被混淆
    public <fields>;
    public <methods>;
}

四、編譯打包

在Android Studio的Terminal中輸入 gradlew makeJar回車;
直到顯示"BUILD SUCCESSFUL"即為成功!否則視錯誤信息修改
但是此時的jar包是還沒有混淆

打混淆包建議使用點擊右側Gradle中pay/other下的proguardJar,就好了;如下:

20180728235238.png

接著就可以在其他工程直接使用了,如果有.so文件需另外復制過去,否則編譯之后找不到.so文件中的引用

Thank you all,中間查閱了許多的資料,填了不少坑,遂以此為記;歡迎補充和討論,也希望能幫到有需要的人!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,577評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,486評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,852評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,600評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,944評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,108評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,652評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,385評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,616評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,798評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,205評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,537評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,334評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,570評論 2 379

推薦閱讀更多精彩內容