(通用)Android App代碼混淆終極解決方案【轉】

來源:互聯網
上載者:User

標籤:class   代碼   size   方案   copy   ica   epc   eof   ack   

App雖然沒有那麼的高大上,但是代碼的混淆是代表了程式員對App的責任心, 也是對App安全的一點點保證。今天我會將自己做Android混淆的過程和體會分享給大家,也避免大家少走彎路,少跳坑。

本篇部落格混淆基於Android Studio的IDE開發環境。

其實在android Studio中做混淆,基本就是對Proguard-rules.pro檔案的操作。混淆的過程也是有規律可循的。下面我將分幾個部分來分別介紹混淆過程。

(1)如何開啟混淆。

(2)混淆的公用部分。

(3)需要我們不混淆的代碼。

(4)libs下的第三方Jar包的混淆方式。

(5)complie的第三方Jar包的混淆方式。

(6)代碼注釋的混淆方式。

ok,大家準備好了嗎?下面我就以流水賬的方式與大家分別介紹啦!(O(∩_∩)O 哈哈~)

1.如何開啟混淆

開始混淆很簡單,Android Studio中找到你的項目module的build.gradle,如所示:

 

將minifyEnabled設定為true就ok。

2.公用部分

在混淆的過程中,有一部分是固定不變的。下面我將列出保持不變的模組,只需將代碼Copy即可。

 

#1.基本指令區-optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontskipnonpubliclibraryclassmembers-dontpreverify-verbose-ignorewarning-printmapping proguardMapping.txt-optimizations !code/simplification/cast,!field/*,!class/merging/*-keepattributes *Annotation*,InnerClasses-keepattributes Signature-keepattributes SourceFile,LineNumberTable#2.預設保留區-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);}#3.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);}

 

以上就是固定不變的部分。

3.需要我們不混淆的代碼

不混淆用關鍵字-keep來修飾。不混淆的部分大概分為如下幾個模組:

(1)實體類,json解析類

(2)第三方jar包

(3)js和webview的調用模組

(4)與反射相關的類和方法

大概就是以上幾個模組,下面來看不混淆的代碼:

 

#1.實體類
-keep class com.xx.xx.entity.** { *; }

#2.第三方包
#eventBus-keepattributes *Annotation*-keepclassmembers class ** {    @org.greenrobot.eventbus.Subscribe <methods>;}-keep enum org.greenrobot.eventbus.** { *; }-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    <init>(java.lang.Throwable);}

#3.與js互相調用的類 沒有可不寫
#4.反射相關的類和方法
-keep class com.xx.xx.xx.xx.view.** { *; }-keep class com.xx.xx.xx.xx.xx.** { *; }

 

4.libs下的第三方Jar包的混淆方式
保留libs下的jar包的方式也很簡單,同樣是使用-keep關鍵字:
找到libs目錄,開啟相對於的jar檔案,找到對應的包名,然後添加如下代碼:

-keep class 包名.** { *; }
5.complie的第三方Jar包的混淆方式
complie的第三方Jar包的混淆方式和libs下的相同,只需要開啟:

開啟對應的引用jar檔案,然後同樣使用

-keep class 包名.** { *; }
6.代碼注釋的混淆方式
我們在項目中肯定用到過有注釋方式的代碼,例如小刀(butterknife)。需要使用@Bind來修飾變數。此時保留這種注釋需要如下代碼:
-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }-keepclasseswithmembernames class * {    @butterknife.* <fields>;}-keepclasseswithmembernames class * {    @butterknife.* <methods>;}

emm...自己說一句,如果butterknife版本較低時可能要把第三行換成

-keep class **$$ViewInjector{ *; }

 

(通用)Android App代碼混淆終極解決方案【轉】

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.