簽名-程式碼混淆Progurard-反編譯
阿新 • • 發佈:2018-12-24
簽名
路徑/檔名+.jks 簽名檔案通過 build generate signed apk 記住簽名庫的密碼 和key 的密碼程式碼混淆
混淆程式碼 可以 減小APK體積,將類名簡單化,在反編譯時打亂程式碼的閱讀理解。
所以release 版本的apk 通常進行程式碼混淆
通過Gradle 進行 配置
buildTypes 宣告構建型別
1.release 2.debug 3.可以自定義型別buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }
將minifyEnabled 更改為Ture
更改proguard-rules.pro混淆檔案自己配置:
#-------------------------------------------定製化區域---------------------------------------------- #---------------------------------1.實體類--------------------------------- #------------------------------------------------------------------------- #---------------------------------2.第三方包------------------------------- #------------------------------------------------------------------------- #---------------------------------3.與js互相呼叫的類------------------------ #------------------------------------------------------------------------- #---------------------------------4.反射相關的類和方法----------------------- #---------------------------------------------------------------------------- #--------------------------------------------------------------------------------------------------- #-------------------------------------------基本不用動區域-------------------------------------------- #---------------------------------基本指令區---------------------------------- -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontskipnonpubliclibraryclassmembers -dontpreverify -verbose -printmapping proguardMapping.txt -optimizations !code/simplification/cast,!field/*,!class/merging/* -keepattributes *Annotation*,InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable #---------------------------------------------------------------------------- #---------------------------------預設保留區--------------------------------- -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.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class * extends android.view.View -keep public class com.android.vending.licensing.ILicensingService -keep class android.support.** {*;} -keepclasseswithmembernames class * { native <methods>; } -keepclassmembers class * extends android.app.Activity{ public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep public class * extends android.view.View{ *** get*(); void set*(***); public <init>(android.content.Context); public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); public <init>(android.content.Context, android.util.AttributeSet, int); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -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(); } -keep class **.R$* { *; } -keepclassmembers class * { void *(**On*Event); } #---------------------------------------------------------------------------- #---------------------------------webview------------------------------------ -keepclassmembers class fqcn.of.javascript.interface.for.Webview { public *; } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap); public boolean *(android.webkit.WebView, java.lang.String); } -keepclassmembers class * extends android.webkit.WebViewClient { public void *(android.webkit.WebView, jav.lang.String); } #---------------------------------------------------------------------------- #---------------------------------------------------------------------------------------------------
混淆的過程分為 shrink->optinize->obfuscate->preverify
這些環節是可以選擇的。
#代表註釋
-keep 是保持某個類不被混淆。
assemble Task 任務 有兩個子任務 debug/release
所以混淆前需要對檔案進行簽名
反編譯APK
驗證檔案是否混淆成功
需要兩個軟體
dex2jar 將 dex—>jar
jd-gui 將jar->java
反編譯軟體 APKTool 可以將APK 反編譯成可以修改的smali
http://blog.csdn.net/kong92917/article/details/53468913
ubuntu 下將 指令碼檔案 和工具包 等配置環境變數