注:本文使用的Android Studio版本是 2.1.2。
做公司項目,需要對項目進行代碼混淆+簽名打包,然后就各種搜集查看資料,算是小有成果吧。周末無事就想著總結(jié)一下以后再用可做參考。如有不對的地方煩請各位大神指導……
一、代碼混淆
android studio進行代碼混淆需要在兩個地方做配置:1、添加自己的混淆規(guī)則到對應Module下的proguard-rules.pro文件;2、修改對應Module下的build.gradle;
1、添加混淆規(guī)則
已下是我代碼中添加的混淆規(guī)則(僅供參考)
#--------------------------1.實體類---------------------------------
-keepclasscom.package.bean.**{*;}
#--------------------------2.第三方包-------------------------------
#Gson
-keepattributes Signature
-keepattributes *Annotation*
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.google.gson.* { *;}
-dontwarncom.google.gson.**
#umeng
-dontwarncom.umeng.**
-keepclasscom.umeng.**{*;}
-keepclassu.aly.**{*;}
-keepclasscom.google.**{*;}
#nineoldandroids
-dontwarncom.nineoldandroids.*
-keepclasscom.nineoldandroids.**{*;}
#weixin
-dontwarncom.tencent.mm.**
-keepclasscom.tencent.mm.**{*;}
#JGPUSH
-dontwarn cn.jpush.**
-keep class cn.jpush.** { *; }
-dontwarn com.google.**
-keep class com.google.protobuf.** {*;}
-keep class com.google.gson.** {*;}
#-------------------------3.與js互相調(diào)用的類------------------------
#-------------------------4.反射相關(guān)的類和方法----------------------
#-------------------------5.基本不用動區(qū)域--------------------------
#指定代碼的壓縮級別
-optimizationpasses5
#不去忽略非公共的庫類
-dontskipnonpubliclibraryclasses
-dontskipnonpubliclibraryclassmembers
# 是否使用大小寫混合
-dontusemixedcaseclassnames
#預校驗
-dontpreverify
#混淆時是否記錄日志
-verbose
#忽略警告,避免打包時某些警告出現(xiàn)
-ignorewarning
# 混淆時所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保護注解
-keepattributes *Annotation*
#記錄生成的日志數(shù)據(jù),gradle build時在本項目根目錄輸出
#apk 包內(nèi)所有 class 的內(nèi)部結(jié)構(gòu)
-dump class_files.txt
#未混淆的類和成員
-printseeds seeds.txt
#列出從 apk 中刪除的代碼
-printusage unused.txt
#混淆前后的映射
-printmapping mapping.txt
#-----------------------------6.默認保留區(qū)-----------------------
# 保持哪些類不被混淆
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Fragment
-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.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
#如果有引用v4、v7包可以添加下面這行
-keep publicclass*extendsandroid.support.*
-keepclasseswithmembersclass*{?
? ? ? ? ?public(android.content.Context,android.util.AttributeSet);?
? ? ? ? ?public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers class * implements java.io.Serializable {
? ? ? ? static final long serialVersionUID;
? ? ? ? private static final java.io.ObjectStreamField[] serialPersistentFields;
? ? ? ? private void writeObject(java.io.ObjectOutputStream);
? ? ? ? private void readObject(java.io.ObjectInputStream);
? ? ? ? java.lang.Object writeReplace();
? ? ? ? java.lang.Object readResolve();
}
# 保持 native 方法不被混淆
-keepclasseswithmembernamesclass*{
? ? ? ? native;
}
# 保持自定義控件類不被混淆
-keepclasseswithmembersclass*{
? ? ? ?public(android.content.Context,android.util.AttributeSet);
}
# 保持自定義控件類不被混淆
-keepclasseswithmembersclass*{
? ? ? ?public(android.content.Context,android.util.AttributeSet,int);
}
# 保持自定義控件類不被混淆
-keepclassmembersclass*extendsandroid.app.Activity{
? ? ? ?publicvoid*(android.view.View);
}
# 保持枚舉 enum 類不被混淆
-keepclassmembersenum*{
? ? ? ?publicstatic**[]values();
? ? ? ?publicstatic**valueOf(java.lang.String);
}
# 保持 Parcelable 不被混淆
-keepclass*implementsandroid.os.Parcelable{
? ? ? ?publicstaticfinalandroid.os.Parcelable$Creator *;
}
#---------------------------7.webview-----------------------
-keepclassmembersclassfqcn.of.javascript.interface.for.webview{
? ? ? ?public*;
}
-keepclassmembersclass*extendsandroid.webkit.webViewClient{
? ? ? ?publicvoid*(android.webkit.WebView,java.lang.String,android.graphics.Bitmap);
? ? ? ?publicboolean*(android.webkit.WebView,java.lang.String);
}
-keepclassmembersclass*extendsandroid.webkit.webViewClient{
? ? ? ?publicvoid*(android.webkit.webView,jav.lang.String);
}
#-----------------------------end-------------------------------
2、修改gradle文件
在即將打包的Module下找到對應的build.gradle文件如下圖:

打開gradle修改對應內(nèi)容如下圖:

在新建Android Studio項目時默認是會關(guān)閉代碼混淆開關(guān)的,所以我們需要在build.gradle文件中,將minifyEnabled 開關(guān)設為true,如上圖所示;此時混淆代碼的所有準備工作都已完成,在簽名打包時才會對代碼進行混淆;
二、簽名打包:
按照以下步驟進行簽名打包:
1、在build下選擇簽名APK

2、選擇新建keystore或者使用已有的keystore:


首次進行簽名打包會出現(xiàn),目前僅僅是隨意設置了一個密碼,具體還不清楚有什么作用;(如有哪位大神知曉,煩請告知,在此提前謝過~)

選擇簽名打包APK的輸出位置

到此為止代碼混淆+簽名打包已全部完成,想要驗證自己的apk是否被混淆就需要自己去進行反編譯,然后來進行驗證了~