Android應用開發之代碼混淆_Android

來源:互聯網
上載者:User

混淆器(ProGuard)

混淆器通過刪除從未用過的代碼和使用晦澀名字重新命名類、欄位和方法,對代碼進行壓縮,最佳化和混淆。結果是一個比較小的.apk檔案,該檔案比較難進行逆向project。因此,當你的應用程式對安全敏感(要求高),比如當你授權應用程式的時候,混淆器是一種重要的保護手段。   

混淆器被整合在android 構建系統中,所以你不必手動調用它。同一時候混淆器僅在公布模式下進行構建應用程式的時候才會執行起來,所以在偵錯模式下構建程式時,你不必處理混淆代碼。讓混淆器執行起來是可選擇的,可是推薦選上。

1. 改動project.properties

  # This file is automatically generated by Android Tools.  # Do not modify this file -- YOUR CHANGES WILL BE ERASED!  #  # This file must be checked in Version Control Systems.  #  # To customize properties used by the Ant build system edit  # "ant.properties", and override values to adapt the script to your  # project structure.  #  # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):  #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt  # Project target.  target=android-19

    將proguard.config前面的凝視去掉

2. 改動proguard-project.txt

  # To enable ProGuard in your project, edit project.properties  # to define the proguard.config property as described in that file.  #  # Add project specific ProGuard rules here.  # By default, the flags in this file are appended to flags specified  # in ${sdk.dir}/tools/proguard/proguard-android.txt  # You can edit the include path and order by changing the ProGuard  # include property in project.properties.  #  # For more details, see  #  http://developer.android.com/guide/developing/tools/proguard.html  # Add any project specific keep options here:  # If your project uses WebView with JS, uncomment the following  # and specify the fully qualified class name to the JavaScript interface  # class:  #-keepclassmembers class fqcn.of.javascript.interface.for.webview {  #  public *;  #}

    假設在程式中使用了第三方的`jar`包,在混淆後導致出錯,這時我們須要在proguard-project.txt中去進行對應的配置,來讓其在混淆時不要混淆對應的jar包。對改設定檔裡的相關配置解釋例如以下:

```java  -keep public class * extends android.app.Activity  【不進行混淆類名的類,保持其原類名和包名】  -keep public abstract interface com.asqw.android.Listener{  public protected <methods>; 【全部public protected的方法名不進行混淆】  }  -keep public class com.asqw.android{  public void Start(java.lang.String); 【對該方法不進行混淆】  }  -keepclasseswithmembernames class * { 【對全部類的native方法名不進行混淆】  native <methods>;  }  -keepclasseswithmembers class * { 【對全部類的指定方法的方法名不進行混淆】  public <init>(android.content.Context, android.util.AttributeSet);  }  -keepclassmembers class * extends android.app.Activity {【對全部類的指定方法的方法名不進行混淆】  public void *(android.view.View);  }  -keepclassmembers enum * {【對枚舉類型enum的全部類的下面指定方法的方法名不進行混淆】  public static **[] values();  public static ** valueOf(java.lang.String);  }  -keep class * implements android.os.Parcelable {【對實現了Parcelable介面的全部類的類名不進行混淆,對其成員變數為Parcelable$Creator類型的成員變數的變數名不進行混淆】  public static final android.os.Parcelable$Creator *;  }  -keepclasseswithmembers class org.jboss.netty.util.internal.LinkedTransferQueue {【對指定類的指定變數的變數名不進行混淆】    volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node head;    volatile transient org.jboss.netty.util.internal.LinkedTransferQueue$Node tail;    volatile transient int sweepVotes;  }  -keep public class com.unionpay.** {*; }【對com.unionpay包下全部的類都不進行混淆,即不混淆類名,也不混淆方法名和變數名】```    

經過上面這兩部之後反編譯後就能混淆了,可是四大組件還在,為什麼四大組件還在呢,由於四大組件是在資訊清單檔裡進行配置的,假設混淆後就不能依據資訊清單檔的配置去尋找了。    

假設對於一些自己的代碼中要想提供出來讓別人通過反射調用的方法時,我們不想讓部分代碼被混淆,或者是我們使用別人提供的第三方jar包,由於第三方的jar包一般都是已經混淆過的,我們要是再混淆就會報錯了,所以我們要保證這些內容不用混淆,這裡我們僅僅需改動這個檔案,然後加上後面的一句話,他就不會混淆我們給出的內容   

-keepattributes *Annotation*     -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.BackupAgent-keep public class * extends android.preference.Preference-keep public class * extends android.support.v4.app.Fragment-keep public class * extends android.app.Fragment-keep public class com.android.vending.licensing.ILicensingService-keep class com.itheima.mobilesafe.engine.AppInfoProvider-keep class net.youmi.android.** {*;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.