如何在Android应用程序的发布版本中删除Log.d()调用?

f47*_*071 3 android android-proguard

我注意到我的发布版本,我在eclipse中通过以下方式制作:

Android工具 - >导出已签名的应用程序包...

我的proguard-project.txt包含:

-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}
Run Code Online (Sandbox Code Playgroud)

然而,如果我在设备上运行应用程序并使用CatLog查看日志,我会看到所有Log.d(),Log.v()消息都不应该存在.还有别的东西我应该设置吗?我花了很多时间在谷歌搜索,但没有关于该主题的明确指示.我找到的大多数事情都是有类似问题但没有解决方案的人.

laa*_*lto 16

确保您的proguard配置没有-dontoptimize.这是proguard优化器,它删除了"没有副作用"的方法调用.

SDK默认proguard-android.txt包含-dontoptimize在其中.请proguard-android-optimize.txt改用,不要添加-dontoptimize项目特定的proguard配置.

请您说明我可以阅读有关该主题的一些消息来源.如果它当然存在.

好吧,对于初学者-assumenosideeffects,列在文档中的优化选项下.

还有一件事是,我已经读过使用proguard-android-optimize.txt会导致某些设备出现问题.所以,这是一种类型的捕获22情况.

Proguard一般可能有副作用.您需要彻底测试您的proguard处理的应用程序.


如果您想在不使用proguard的情况下从发布版本中删除日志记录,您可以添加

if (BuildConfig.DEBUG)
Run Code Online (Sandbox Code Playgroud)

在每个日志记录调用之前BuildConfig,Gradle Android插件生成的构建配置在哪里.由于DEBUG存在编译时常量,因此Java编译器认为条件在发布配置中永远不会为真,并且不会在条件块内发出字节码.


sch*_*sch 5

你试过这个吗?

-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** v(...);
public static *** i(...);
public static *** w(...);
public static *** e(...);
    }
Run Code Online (Sandbox Code Playgroud)