Android Studio環(huán)境下代碼混淆+簽名打包

注:本文使用的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

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

gradle內(nèi)對應混淆配置文件

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

二、簽名打包:

按照以下步驟進行簽名打包:

1、在build下選擇簽名APK

選擇簽名打包

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

新建keystore
選擇已有keystore

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

Master Password

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

選擇輸出APK位置

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容