我想检查一下DexGuard是如何工作的,但它似乎没有免费试用版.
DexGuard可以加密Android应用程序吗?或者只是简单地混淆代码?DexGuard加密如何工作?如果您可以在反编译之前和之后提供使用DexGuard运行的示例应用程序的代码,那就太棒了.
当我在项目中启用Dexguard时,我遇到了来自Fabric Crashlytics的崩溃报告的问题.
我在项目中启用了Dexguard,效果非常好.然后我按照本页中的说明添加了所提到的配置,以使Fabric对我的堆栈跟踪进行去混淆并显示正确的崩溃报告.以下是我在主模块中应用fabric和dexguard插件的方法build.gradle
:
apply plugin: 'com.android.application'
apply plugin: 'dexguard'
apply plugin: 'io.fabric'
Run Code Online (Sandbox Code Playgroud)
以下是我proguard-project.txt
文件中的配置:
# Fabric
#############################################################################
-keepattributes *Annotation*,SourceFile,LineNumberTable
-keep public class * extends java.lang.Exception
-keepresourcexmlelements manifest/application/meta-data@name=io.fabric.ApiKey
-keep class com.crashlytics.** { *; }
-dontwarn com.crashlytics.**
#############################################################################
Run Code Online (Sandbox Code Playgroud)
以下是我proguard-project.txt
在发布版本中的使用方法:
buildTypes{
debug{
proguardFile getDefaultDexGuardFile('dexguard-debug-shrink.pro')
proguardFile 'proguard-project.txt'
}
release{
proguardFile getDefaultDexGuardFile('dexguard-release.pro')
proguardFile 'proguard-project.txt'
proguardFile 'dexguard-project.txt'
if(new File("$projectDir/../local.properties").exists()){
signingConfig signingConfigs.release
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是当在发布版本中遇到崩溃时,发生崩溃的文件名将丢失,但其他所有内容都正常工作,并且堆栈跟踪几乎是可以理解的.这是一个崩溃报告示例:
正如您在崩溃报告中看到的那样,堆栈跟踪中只缺少文件名.行号和方法名称等其他描述完全正常.
虽然使用完整的方法名称ir.X.ui.XMainActivity.throwSomething
和前面的行号Unknown Source
,但我可以得出错误发生的文件名,我希望我的堆栈跟踪显示文件名并完全描述自己.我尝试了很多选项和许多试验和错误,但问题仍然存在.
有什么我想念的吗?我怎么解决这个问题?
我正在使用8.1.0.7
Dexguard版本1.21.7
,Fabric插件版本2.9.0 …
android stack-trace dexguard crashlytics-android google-fabric
我想对任何标有kotlin internal
可见性修饰符的类进行预测(混淆).
Kotlin internal
类在JVM上是公共的,因此它们在Java源代码中是可见的和可用的.我不希望这些类被使用或出现在自动完成中,所以我想对它们进行模糊处理以阻止它们的使用.
我可以将什么样的规则适用于目标internal
类?
我正在将一个项目从Ant转移到Gradle,但有些东西我无法理解.
FACTS
在构建发布APK(即混淆)后,我注意到应用程序崩溃严重.错误可以通过以下方式总结:
java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
Run Code Online (Sandbox Code Playgroud)
调试(即非混淆)APK工作正常,所以我猜测它与我的ProGuard/DexGuard配置有关.
我试图通过添加以下语句来保持类引用:
-keep class com.mypackage.MyCustomView
Run Code Online (Sandbox Code Playgroud)
因此,发布APK工作得很好.然后我做了一些研究,我尝试了更具体的ProGuard/DexGuard配置:
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
Run Code Online (Sandbox Code Playgroud)
它也有效,而且与课程无关.
题
我想知道:
回答
@Blundell的答案基本上是正确的.结果我错过了build.gradle
配置中的一行:
android {
...
buildTypes {
debug {
...
}
release {
proguardFile getDefaultDexGuardFile('dexguard-release.pro') …
Run Code Online (Sandbox Code Playgroud) android proguard android-custom-view android-gradle-plugin dexguard
如何使用DexGuard来混淆我的apk?我知道如何启用proguard及其自定义.谁能建议一个好的教程?
您好我正在研究Android应用程序,其中我需要执行几个https Web服务,所以我的所有webservice URL和Web API KEY都在代码加服务器的IP地址.当任何人对我的应用程序进行逆向工程时,那个人可以获得我的Web服务URL以及API KEY然后可以使用rest客户端轻松命中它.
如何确保任何攻击者无论如何都无法得到我在其中定义的WEB API KEY strings.xml
<string name="WEB_API_KEY">XXXXXXXXXXXXXXXXXXXXXXXXXXX</string>
Run Code Online (Sandbox Code Playgroud)
提前致谢.
将Dexguard从7.0.12更新到7.1.22后,我在枚举开关上遇到崩溃。
这仅在Dexguard在我们的项目上运行时才会发生(我想这是由Proguard问题引起的)。
如果我使用硬编码值,则不会发生崩溃。
当然,我想避免使用硬编码值。
发生的崩溃如下
java.lang.NoClassDefFoundError: Failed resolution of: Lif;
Run Code Online (Sandbox Code Playgroud)
这发生在陈述的行上switch(type) {
(见下文)
应用程序崩溃的一些示例代码(假设MyEnum是课程的Enum):
MyEnum type = MyEnum.SomeValue;
switch (type) {
case SomeValue:
// Do something
Log.i("Tag", "Hello world!");
break;
}
Run Code Online (Sandbox Code Playgroud)
假设的序数值MyEnum.SomeValue
为1。
如果我更改case SomeValue:
为case 1:
预期的效果。
我不知道为什么会发生此崩溃。我试图添加这些Proguard规则。
-keep enum * { *; }
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
Run Code Online (Sandbox Code Playgroud)
但这不能解决问题。
我刚刚检查了映射文件,所有枚举名称都保留了。现在,我对所发生的事情一无所知。
my.identifier.MyEnum -> my.identifier.MyEnum:
my.identifier.MyEnum SomeValue -> SomeValue
my.identifier.MyEnum[] $VALUES -> $VALUES
6:6:my.identifier.MyEnum[] …
Run Code Online (Sandbox Code Playgroud) 关于flexjson库,我在使用dexguard时遇到问题。尝试使用JSONDeserializer反序列化时,我不断收到以下错误。
**09-15 20:46:10.271 10901-11552/** **A/art: sart/runtime/class_linker.cc:3430] Check failed: klass->IsProxyClass()**
Run Code Online (Sandbox Code Playgroud)
在Android发布apks中进行混淆后,是否有人有适当的规则让flexjson正常工作?
与gson lib类似。
我已将我的Android项目升级为使用最新的Android Studio 3.0功能.从那时起,我在每个Gradle同步上收到以下警告消息:
警告:您使用的其中一个插件支持Java 8语言功能.要尝试Android插件中内置的支持,请从build.gradle中删除以下内容:apply plugin:'dexguard'要了解详情,请访问https://d.android.com/r/tools/java-8-support -message.html
如果我转到链接的网址,我可以看到:
如果Android Studio检测到您的项目使用的是Jack,Retrolambda或DexGuard,则IDE会使用这些工具提供的Java 8支持.
有Jack和Retrolambda的迁移文档,但DexGuard没有.
我的问题是:
我正在运行Android Studio 3.0和DexGuard 8.0.16
我想知道什么是最强大的混淆工具(以避免反向工程):
谢谢。
dexguard ×10
android ×8
proguard ×7
encryption ×1
enums ×1
flexjson ×1
java ×1
kotlin ×1
obfuscation ×1
r8 ×1
security ×1
ssl ×1
stack-trace ×1