Android:Proguard配置,用于混淆类名和方法

时间:2016-08-05 15:12:05

标签: android obfuscation android-proguard

据我所知,有些课程不应该被混淆,而且他们的名字必须像“活动”一样持久存在。但是我希望我的代码中的其他类和包被重命名。 这里是应用程序文件夹中的build.gradle: apply plugin:'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "apt.eve.good.morning"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:support-v4:23.4.0'
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support:design:23.4.0'
}

我将这个proguard配置用于我的应用程序(app\proguard-rules.pro):

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-useuniqueclassmembernames
-verbose

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}
-allowobfuscations class *
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {

   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep

-keep @android.support.annotation.Keep class * {*;}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <methods>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}

它做了优化,但是当我在classses.dex中查看时,所有类名都保持不变。所以我想知道我在配置文件中遗漏了哪些内容/方法名称没有混淆?

P.S.1 我搜索了几个问题,但我无法想象这里有什么问题。

P.S.2 我已经正确配置了我的android工作室,并且在我发布的.apk文件中应用了对proguard配置的更改而没有任何问题。

3 个答案:

答案 0 :(得分:6)

确保检查混淆的.dex文件。

使用常见的gradle构建脚本,build/**文件夹可能包含几个未混淆的.dex / .class文件版本。

最终得到的.apk / .aar应该被混淆,所以如果你解压缩那个,并且这些类没有被混淆,那么某些东西并没有按预期工作。

正如OP指出的那样,验证[反汇编]工具是否正常工作也很重要。

从.apk查看.dex的二进制形式通常足以发现[un]混淆的符号(尝试使用未混淆的.class,即使在文本编辑器中,符号也很容易读取,在混淆.dex中符号链如&# 34; aa&#34;,&#34; ab&#34;,......通常也很明显。)

同时使用详细选项手动运行gradle proguard任务可能有助于识别是否运行了proguard以及文件是什么。

答案 1 :(得分:3)

基于您的gradle文件(minifyEnabled=true)和proguard配置。你似乎已经处于良好状态。

要快速确认您的应用程序是否对您的类进行了模糊处理,请在创建发布版本时检查生成的mapping.txt文件。此文件“提供原始和混淆的类,方法和字段名称之间的转换。”

这是一个阻碍hockeyapp库的mapping.txt示例:

net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a:
    java.util.Queue queue -> a
    boolean downloadRunning -> b
    67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a

可以在此处的“收缩代码和资源”一文中找到更多信息:https://developer.android.com/studio/build/shrink-code.html

答案 2 :(得分:1)

你们已经改变了

minifyEnabled=true

内幕应用 - &gt;的build.gradle?

 buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }