android - 使用 Proguard 在 Android 中禁用日志
问题描述
我添加了 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() 不起作用。
解决方案
显然使用这个
-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(...);
}
推荐阅读
- plotly - 未捕获的错误:“情节”的脚本错误 http://requirejs.org/docs/errors.html#scripterror
- antlr - 监听器返回一个 Arraylist/String
- list - Prolog谓词解压缩列表
- javascript - Promise 的 .then 和 .catch 如何在后台工作?
- c++ - 什么 git 策略来维护上游存储库不欢迎的代码
- java - 一对多插入前休眠更新
- python - cx_Freeze 6.6 和 winpython 有问题吗?
- javascript - 是否可以添加垂直线来选择折线图上的当前数据?
- google-apps-script - JSSoup - SyntaxError: Unexpected token '<' Apps 脚本
- python - 如何使用函数中的数据框并返回响应以下载 csv 文件 - Flask