Android Studio Gradle proguard - 只混淆实际的应用代码而不是第三方库
Android Studio Gradle proguard - only obfuscate the actual app code and not third libraries
自从我反编译了我的应用程序后,我注意到所有成员 类 都很容易阅读和理解,所以我的目标是让反编译应用程序的人更难阅读代码。
我做的第一步是改变我的 gradle 文件:
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-myapp.txt'
}
文件 proguard-myapp.txt
位于我的项目中。
我的项目使用了以下内容:
dependencies {
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.google.code.gson:gson:2.4'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.google.android.gms:play-services-ads:9.2.1'
compile 'com.github.lecho:hellocharts-library:1.5.8@aar'
compile('com.crashlytics.sdk.android:crashlytics:2.6.1@aar') {
transitive = true;
}
}
我一直在玩 proguard 规则,但我测试得越多,它就越失控。
我添加了以下规则:
-dontshrink
-dontoptimize
#charts
-keep class lecho.lib.hellocharts.** { *; }
#support library
-dontwarn android.support.**
-keep class android.support.** { *; }
#ads
-keep public class com.google.android.gms.ads.** {
public *;
}
-keep public class com.google.ads.** {
public *;
}
#gson
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
#Crashlytics
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-keep class io.fabric.sdk.** { *; }
我的问题是:
- 是否可以仅 obfuscate/optimize 或任何名称,仅我在应用程序中实际使用的文件,即我编写的文件,而将所有其他库保持原样?我的意思是,只重命名、优化我的 类 和我的文件,而忽略 crashlytics、admob、支持库?
2.I 已尝试仅添加为规则:
-keep class !com.mypackage.**{*;}
虽然代码在反编译时看起来不错,但应用程序无法正常工作。
这似乎不是一个正确的答案,但我找到了我编译的应用程序无法运行的原因。
经过大量尝试找出问题所在,我终于让它工作了。
GSON 在这个答案中似乎 需要保留 类 才能正常工作。
在保留我的 类 与 Gson 相关的对象后,它起作用了。
自从我反编译了我的应用程序后,我注意到所有成员 类 都很容易阅读和理解,所以我的目标是让反编译应用程序的人更难阅读代码。
我做的第一步是改变我的 gradle 文件:
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-myapp.txt'
}
文件 proguard-myapp.txt
位于我的项目中。
我的项目使用了以下内容:
dependencies {
compile 'com.android.support:support-v4:24.2.1'
compile 'com.android.support:design:24.2.1'
compile 'com.google.code.gson:gson:2.4'
compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.google.android.gms:play-services-ads:9.2.1'
compile 'com.github.lecho:hellocharts-library:1.5.8@aar'
compile('com.crashlytics.sdk.android:crashlytics:2.6.1@aar') {
transitive = true;
}
}
我一直在玩 proguard 规则,但我测试得越多,它就越失控。
我添加了以下规则:
-dontshrink
-dontoptimize
#charts
-keep class lecho.lib.hellocharts.** { *; }
#support library
-dontwarn android.support.**
-keep class android.support.** { *; }
#ads
-keep public class com.google.android.gms.ads.** {
public *;
}
-keep public class com.google.ads.** {
public *;
}
#gson
# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# For using GSON @Expose annotation
-keepattributes *Annotation*
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
# Prevent proguard from stripping interface information from TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer
#Crashlytics
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
-keep class io.fabric.sdk.** { *; }
我的问题是:
- 是否可以仅 obfuscate/optimize 或任何名称,仅我在应用程序中实际使用的文件,即我编写的文件,而将所有其他库保持原样?我的意思是,只重命名、优化我的 类 和我的文件,而忽略 crashlytics、admob、支持库?
2.I 已尝试仅添加为规则:
-keep class !com.mypackage.**{*;}
虽然代码在反编译时看起来不错,但应用程序无法正常工作。
这似乎不是一个正确的答案,但我找到了我编译的应用程序无法运行的原因。
经过大量尝试找出问题所在,我终于让它工作了。 GSON 在这个答案中似乎 需要保留 类 才能正常工作。 在保留我的 类 与 Gson 相关的对象后,它起作用了。