使用 Proguard 在 Android 中禁用日志
Posted
技术标签:
【中文标题】使用 Proguard 在 Android 中禁用日志【英文标题】:Disabling Logs in Android using Proguard 【发布时间】:2021-12-09 21:06:14 【问题描述】:我添加了 proguard 规则 -assumenosideeffects class android.util.Log public *;
所以我的发布版本没有日志。但在那之后,一个特定的方法停止工作:
SingleShotLocationProvider.requestSingleUpdate(PassagerActivity.this,
new SingleShotLocationProvider.LocationCallback()
@Override public void onNewLocationAvailable(SingleShotLocationProvider.GPSCoordinates location)
// Log.e("xxx",location.latitude + "/" +location.longitude);
map.setCenter(new GeoCoordinate(location.latitude, location.longitude, 0.0),
Map.Animation.NONE);
currentloc = new LatLng(location.latitude, location.longitude);
// loadingDialog.stopLoadingDialog();
new Thread(new Runnable()
public void run()
GeoCoderApi.getAdressfromLatLng(PassagerActivity.this , location ,new GeoCoderApi.AdressCallback()
@Override
public void onAdressAvailable(String adress)
// Log.e("xxxadress",adress);
addDepart.post(new Runnable()
public void run()
addDepart.setText(adress);
);
); ).start();
);
此方法获取 lat 和 lng 并从 google GeoCoder 获取地址。 当我删除 proguard 规则时,一切正常。甚至不知道它是如何相关的。我在 4 种不同的设备上尝试过。
编辑:
在这里你可以看到 map.center() 工作,我可以得到本地化它只是 addDepart.setText() 不起作用。
【问题讨论】:
【参考方案1】:显然使用这个
-assumenosideeffects class android.util.Log
*;
确实破坏了我的代码,因为
这条规则规定任何在 android.util.Log 及其 超类没有副作用。包括同步 在 Object 类上定义的方法。因为单一个超类 android.util.Log 是 java.lang.Object 。而且 Object#notify 非常多 有副作用。
所以要非常小心假设没有副作用,并始终考虑指定确切的签名,因为它也会影响超类。
改用这个:
-assumenosideeffects class android.util.Log
v(...);
d(...);
i(...);
w(...);
e(...);
println(...);
Source
【讨论】:
以上是关于使用 Proguard 在 Android 中禁用日志的主要内容,如果未能解决你的问题,请参考以下文章
构建android gradle项目时如何禁用proguard生成dump.txt
通过在Android中实现Proguard,使用JDBC在Asynctask中崩溃
通过在 Android 中实现 Proguard 在使用 JDBC 的 Asynctask 中应用程序崩溃
带有 Android 的 ProGuard:java.lang.NoSuchMethodError:android.util.Xml.asAttributeSet