Android Studio Gradle proguard - 只混淆实际的应用程序代码而不是第三方库

标签 android android-gradle-plugin proguard android-proguard

自从我反编译我的应用程序后,我注意到所有成员、类都很容易阅读和理解,所以我的目标是让反编译应用程序的人更难阅读代码。

我做的第一步是改变我的 graddle 文件:

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;
    }
}

我一直在玩混淆规则,但我测试得越多,它就越失控。

我添加了以下规则:

-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.** { *; }

我的问题是:

  1. 是否可以只混淆/优化或任何所谓的混淆/优化,只有我在应用程序中实际使用的文件,我编写的文件,而让所有其他库保持原样?我的意思是,只重命名、优化我的类和文件,而忽略 crashlytics、admob、支持库?

2.我试过只添加规则:

-keep class !com.mypackage.**{*;}

虽然代码在反编译时看起来不错,但应用程序无法正常运行。

最佳答案

这似乎不是一个正确的答案,但我找到了我编译的应用程序无法运行的原因。

经过大量尝试找出问题所在,我终于让它工作了。 在这个答案中似乎是 GSON https://stackoverflow.com/a/30982197/379865需要保留类(class)才能正常工作。 在为与 Gson 相关的对象保留我的类之后,它就可以工作了。

关于Android Studio Gradle proguard - 只混淆实际的应用程序代码而不是第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39526737/

相关文章:

android - 如何在android中使用ffmpeg在一个视频中添加多个gif水印

android - 使用AdscendMedia SDK构建Gradle

java - Proguard 破坏 Flyway 数据库迁移

java - 带有可序列化对象的 IOException

java - 使用带有gradle的proguard创建混淆的应用程序jar时出现重复的zip条目

Android 在 Dialog 中覆盖 onKeyDown

android - 错误 :Execution failed for task 'app:generateDebugBuildConfig'

javascript - 适用于 Android 的 React Native 日期和时间选择器不起作用

android - Android Gradle错误-任务 ':app:dexDebug'的执行失败

android - 更新时删除应用程序数据