1. 程式人生 > >簽名-程式碼混淆Progurard-反編譯

簽名-程式碼混淆Progurard-反編譯

簽名

路徑/檔名+.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 下將 指令碼檔案 和工具包  等配置環境變數