Liên hệ
android java

Sử dụng ProGuard để bảo vệ và tối ưu ứng dụng Android

Cấu hình ProGuard làm rối mã nguồn chống dịch ngược và bảo mật, tối ưu ứng dụng Android với Android Studio

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.**

Vui lòng đăng ký ủng hộ kênh