2

我有以下语句proguard-rules.pro来删除生产 apk 中的日志记录:

-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(...);
}

这具有删除以下语句的效果:

Log.d(TAG, "setup finished");

现在让我们考虑以下语句:

Log.d(TAG, "setup finished with status " + client.getStatus());

到目前为止,我的假设是该Log.d()语句将被删除,因此client.getStatus()永远不会被调用。

具体来说,如果client碰巧是,null那么我的假设是不会有NullPointerException.

但现在我不太确定。也许编译器看起来更像下面的语句:

int status = client.getStatus();
Log.d(TAG, "setup finished with status " + status);

现在该client.getStatus()语句执行并NullPointerException 可能产生结果。

实际情况如何?

注意:我现在实际上使用的是 R8 而不是 ProGuard。

4

1 回答 1

0

好的,所以这对我来说是一个惊喜,可能对其他人(@Antoniossss)来说也是一个惊喜,但似乎在 a 内部执行的语句Log.d() 执行,尽管 ProGuard/R8 被配置为删除所有Log.d()语句。

因此,即使将 ProGuard/R8 配置为删除所有Log.d()语句,以下将导致NullPointerException

String myString = null;
Log.d(TAG, "myString length: " + myString.length());

因此,将来我会记得Log在查看我的代码以NullPointerException从我的开发者控制台中找到 a 的来源时更仔细地检查这些陈述,而不是假设它们不可能是原因而忽略它们。

于 2019-07-25T16:12:08.667 回答