Giới thiệu ProGuard
ProGuard là công cụ tích hợp sẵn trong Android Studio, với các tính năng giúp cho mã nguồn ứng dụng của bạn thu gọn lại (để dễ phân phối), làm rối (để chống dịch ngược, vì tên các hàm, biến ... bị đổi tên khó đọc), cuối cùng là nó tối ưu để ứng dụng chạy nhanh hơn. Bạn được khuyến cáo nên sử dụng ProGuard trong cả môi trường đang phát triển lẫn sản phẩm phát hành, nếu chỉ sử dụng ở sản phẩm phát hành mà bỏ qua sử dụng nó khi chạy thử có thể tăng khả năng ứng dụng bị crash không mong muốn ...
Cấu hình sử dụng ProGuard
Thật đơn giản, bạn mở build.gradle của dự án ra và thêm nội dụng như sau (nếu chưa có):
android { //.. buildTypes { release { //Thêm một khối debug nếu muốn minifyEnabled true //Thu gọn code, false nếu không dùng useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
Có thể thêm cả ProGuard cho debug ví dụ:
android { //.. buildTypes { release { //Thêm một khối debug nếu muốn minifyEnabled true //Thu gọn code, false nếu không dùng useProguard true //Làm rối code proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { minifyEnabled true useProguard false //Không làm rối code proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
Loại bỏ các tài nguyên (Resource) không dùng tới
Các tài nguyên không dùng tới có thể được loại bỏ (cần sử dụng cùng với minifyEnabled true) bằng cách thêm vào shrinkResources true
, ví dụ:
android { //.. buildTypes { release { shrinkResources true minifyEnabled true useProguard true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
proguard-rules.pro
Trong các đoạn cấu hình sử dụng ProGuard ở trên, đều có chỉ ra một file có tên proguard-rules.pro, đó là file cấu hình thêm về cách thức hoạt động cho ProGuard
Khi ProGuard làm rối code, nó đổi tên các class, nhiều class tham khảo từ bên thứ 3 cũng bị chuyển đổi, nên có thể dẫn tới lỗi. Trong trường hợp muốn không làm rối một lớp nào đó bạn dùng cấu hình keep, ví dụ trong file: proguard-rules.pro
-keep class com.facebook.** { *; }
Với mã trên, sẽ giữ lại các lớp, phương thức com.facebook.** {*}
Ví dụ phổ biến về proguard-rules.pro
-printmapping mapping.txt -verbose -dontoptimize -dontpreverify -dontshrink -dontskipnonpubliclibraryclassmembers -dontusemixedcaseclassnames -keepparameternames -renamesourcefileattribute SourceFile -keepattributes *Annotation* -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod -keep class * extends android.app.Activity -assumenosideeffects class android.util.Log { public static *** d(...); public static *** v(...); } -keep class com.facebook.** { *; } -keep class com.androidquery.** { *; } -keep class com.google.** { *; } -keep class org.acra.** { *; } -keep class org.apache.** { *; } -keep class com.mobileapptracker.** { *; } -keep class com.nostra13.** { *; } -keep class net.simonvt.** { *; } -keep class android.support.** { *; } -keep class com.nnacres.app.model.** { *; } -keep class com.facebook.** { *; } -keep class com.astuetz.** { *; } -keep class twitter4j.** { *; } -keep class com.actionbarsherlock.** { *; } -keep class com.dg.libs.** { *; } -keep class android.support.v4.** { *; } -keep class com.bluetapestudio.templateproject.** { *; } -keep class com.yourideatoreality.model.** { *; } -keep interface com.yourideatoreality.model.** { *; } -keep class com.bluetapestudio.** { *; } -keep interface com.bluetapestudio.** { *; } # Suppress warnings if you are NOT using IAP: -dontwarn com.nnacres.app.** -dontwarn com.androidquery.** -dontwarn com.google.** -dontwarn org.acra.** -dontwarn org.apache.** -dontwarn com.mobileapptracker.** -dontwarn com.nostra13.** -dontwarn net.simonvt.** -dontwarn android.support.** -dontwarn com.facebook.** -dontwarn twitter4j.** -dontwarn com.astuetz.** -dontwarn com.actionbarsherlock.** -dontwarn com.dg.libs.** -dontwarn com.bluetapestudio.templateproject.** -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # The official support library. -keep class android.support.v4.app.** { *; } -keep interface android.support.v4.app.** { *; } # Library JARs. #-keep class de.greenrobot.dao.** { *; } #-keep interface de.greenrobot.dao.** { *; } # Library projects. -keep class com.actionbarsherlock.** { *; } -keep interface com.actionbarsherlock.** { *; } #Keep native -keepclasseswithmembernames class * { native <methods>; } -dontwarn okio.** -dontwarn javax.annotation.Nullable -dontwarn javax.annotation.ParametersAreNonnullByDefault -dontwarn com.squareup.okhttp.**