2016-08-05 81 views
5

据我所知,有些类不应该被模糊处理,而且它们的名称也必须像“活动”一样保留下来。不过,我希望我的代码中的其他类和包被重命名。 这里是build.gradle应用程序文件夹中: 应用插件: 'com.android.application'Android:用于混淆类名称和方法的Proguard配置

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 studio,并且对proguard配置所作的更改在我的发布的.apk文件中无任何问题。

+0

发表您的gradle这个build文件 – petey

+0

你在哪里检查混淆的结果呢?我不是100%确定的,但我认为在我的项目中,混淆的'.dex'文件位于'build/intermediates/transforms/dex/**'中,'build/**'中的任何其他类/ dex看起来都像在混淆之前输出构建步骤。最终,生成的'.apk' /'.aar'应该被模糊处理,所以如果你正在解压那个,并且这些类没有被模糊处理,那么某些东西不能按预期工作。 – Ped7g

+0

@ Ped7g我使用dex2jar将我的apk内的dex转换为jar文件。然后,我使用[jd-gui](http://jd.benow.ca/#jd-gui-overview)来反编译jar文件,当我检查代码中没有名称混淆。所有班级和包裹都保持同名。 – VSB

回答

6

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

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

最终,生成的.apk/.aar文件应该被模糊处理,所以如果您要解压缩那个文件并且这些类没有被模糊处理,那么某些东西不能按预期工作。

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

从.apk查看.dex的二进制形式通常足以发现[un]混淆符号(尝试使用未混淆的.class,即使在文本编辑器中,该符号也易于阅读,在混淆的.dex符号链中, aa“,”ab“,...也经常可见)。

还手动运行gradle proguard任务以及详细选项可能有助于识别proguard是否运行以及哪些文件。

+0

皮特伊建议检查地图文件好得多,只要确保它是新鲜的(修改datetime == cca。build),并且您可以轻松检查所有混淆的符号(并按照预期搜索“敏感”符号以验证它们是否被模糊化)。无需任何其他工具即可获得混淆成功的详细概述。 (和我的二进制方法可以用来验证.apk真的包含预期的结果,因为映射文件表明...如果你真的偏执狂)。 – Ped7g

1

你已经改变

minifyEnabled=true 

里面的应用程序 - >的build.gradle?

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

基于你的gradle文件(minifyEnabled=true)和proguard配置。你看起来已经很好。

要快速确认您的应用混淆了您的类,请在制作发布版本时检查生成的mapping.txt文件。此文件“提供了原始和混淆的类,方法和字段名称之间的转换。”

这里是一个映射的例子。TXT是obsfucates一个hockeyapp库:

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