我正在为Android开发应用程序并使用Proguard来混淆代码.
目前我正在使用ProGuard配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.android.vending.licensing.ILicensingService
Run Code Online (Sandbox Code Playgroud)
要维护布局XML上使用的自定义组件名称:
-keep public class custom.components.**
Run Code Online (Sandbox Code Playgroud)
要删除调试日志:
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
}
Run Code Online (Sandbox Code Playgroud)
为了避免更改布局onClick上调用的方法名称:
-keepclassmembers class * {
public void onClickButton1(android.view.View);
public void onClickButton2(android.view.View);
public void onClickButton3(android.view.View);
}
-keepclasseswithmembernames class …Run Code Online (Sandbox Code Playgroud) 我一直在混淆我的应用程序很长一段时间,我采用了以下设置,就像咒语一样,因为它们是谷歌的推荐
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
Run Code Online (Sandbox Code Playgroud)
然而,有一天我错误地评论了这一行,该应用程序正确构建,并"显然"工作.我做了很多测试,无法让它崩溃.
所以我想知道是否需要那些禁用的优化设置......
proguard.cfg指示以保留相关问题类别的应用程序等.与此问题相关的大多数答案都有相互矛盾的信息,并且与相当旧的API版本有关.
逐一:
我发现了一个关于Google网上论坛的讨论 ,他们说simplification/arithmethic在Android Donut之后不需要SDK.我假设,我可以安全地启用此优化.
看起来proguard在开启此优化的项目中做得很好:
[proguard] Number of vertically merged classes: 296
[proguard] Number of horizontally merged classes: 445
Run Code Online (Sandbox Code Playgroud)
除了堆栈跟踪不正确之外还有其他副作用吗?我的意思是,与应用程序崩溃相关的副作用而不是调试问题.我发现了这个相关的问题,但不能得出结论是否安全.
我在 ProGuard的作者回答的这个问题中读到这些问题是为了避免使用较旧的Proguard版本的错误.那么在Proguard 5.1上激活它们是否安全?
我遇到了一个问题,即开发人员控制台中的堆栈跟踪与代码不匹配.行号显着关闭,并且必须在跟踪中的方法将不会存在于控制台的跟踪中.例如(简化的控制台跟踪):
at getBitmapSize
at getBitmapBytes
at onActivityResult
Run Code Online (Sandbox Code Playgroud)
但是在代码中它必须采用这条路径:
onActivitResult -> handleSaveImage -> getBitmapBytes -> getBitmapSize
Run Code Online (Sandbox Code Playgroud)
这段代码多年来没有变化,因此不需要使用错误的mapping.txt.以某种方式应用proguard是删除应用程序中的结构.那可能吗?它不会映射回来吗?
在转向proguard之前,我从未在堆栈跟踪中看到丢失方法.
还有什么我应该知道的关于让行号匹配?
我已经设定:
-keepattributes SourceFile,LineNumberTable
Run Code Online (Sandbox Code Playgroud)
这几乎是有效的.他们只是没有正确排队.
我设置了一个测试,将NPE放在可预测的内联点上.
(优化)logcat错误具有正确的行号,并且仅为了清晰而分开的方法明显是行间的.通过正确的行号,一切都更加明显.
(未优化)获得相同的堆栈跟踪,除了跟踪中的其他方法.行号再次正确.
我不明白为什么开发人员控制台跟踪的行号错误,但这就是它难以理解的原因.它们不仅在一个文件中关闭,而且在所有文件中都关闭,因此它只是一个令人困惑的混乱,尤其是在您有多个异常处理(如i/o)的任何地方.
我将未经优化的应用程序提交到Play商店,现在堆栈跟踪排队.当你依赖Play堆栈跟踪时,我建议不要在复杂的应用程序中使用优化.