据我所知,有些课程不应该被混淆,而且他们的名字必须像“活动”一样持久存在。但是我希望我的代码中的其他类和包被重命名。
这里是应用程序文件夹中的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配置的更改而没有任何问题。
答案 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'
}
}