Android App 发布版本带日志的问题
2015-09-08 14:24
375 查看
我们在进行Android App 开发的时候经常会使用 Log 这个类来进行 logcat 日志输出。但是这样的输出日志,如果带入发布包内对外发布出去了,会导致程序运行信息暴露给第三方。
一般情况下,大家在网上会查到一个通过 proguard 这个混淆工具来自动删除对 Log的 api 调用的代码。
但是最近发现这个方法在目前的工程中不生效了,从而导致发布包依然有这个问题。在网上翻越了包括 ProGuard Usage 的一些线上资料以后,在 StackOverflow 上找到了相关的解释。
From http://proguard.sourceforge.net/index.html#manual/usage.html, it says
–assumenosideffects is “Only applicable when optimizing”.
-${sdk.dir}/tools/proguard/proguard-android.txt says: “Optimization is turned off by default. Dex does not like code run through the ProGuard optimize and preverify steps”.
http://researcharea.blogspot.com/2012/04/assumenosideeffects-not-working-in.html
也就是说assumenosideefcts 这个标识真正生效是在 proguard 工具在 optimizing 阶段。而Android 官方默认把这个过程给禁用了。所以这个方法默认是不生效的。
所以查阅 sdk 中的 proguard-android.txt 中的注释知道了。需要将默认配置文件从 proguard-android.txt 切换为 proguard-android-optimize.txt ,而不是直接将 optimizing 置为可用。
一般情况下,大家在网上会查到一个通过 proguard 这个混淆工具来自动删除对 Log的 api 调用的代码。
proguard_rules.pro -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(...); }
但是最近发现这个方法在目前的工程中不生效了,从而导致发布包依然有这个问题。在网上翻越了包括 ProGuard Usage 的一些线上资料以后,在 StackOverflow 上找到了相关的解释。
From http://proguard.sourceforge.net/index.html#manual/usage.html, it says
–assumenosideffects is “Only applicable when optimizing”.
-${sdk.dir}/tools/proguard/proguard-android.txt says: “Optimization is turned off by default. Dex does not like code run through the ProGuard optimize and preverify steps”.
http://researcharea.blogspot.com/2012/04/assumenosideeffects-not-working-in.html
也就是说assumenosideefcts 这个标识真正生效是在 proguard 工具在 optimizing 阶段。而Android 官方默认把这个过程给禁用了。所以这个方法默认是不生效的。
所以查阅 sdk 中的 proguard-android.txt 中的注释知道了。需要将默认配置文件从 proguard-android.txt 切换为 proguard-android-optimize.txt ,而不是直接将 optimizing 置为可用。
然而
我个人觉得还是不要轻易改变 sdk 默认的设置,所以我的解决方案是在Log 这个类上封装了一个 wrapper ,其中包含一个标识。如果标识为发布版本,则不调用 Log 进行输出。 wrapper 大概是下面这样实现。public class DebugLog { private static final boolean ENABLE = BuildType.type == BuildType.RELEASE; public static int d(String tag, String msg){ return ENABLE ? Log.d(tag, msg) : 0; } }
相关文章推荐
- Android内存泄露案例分析
- android:tint
- 微信开发准备工作
- Android --ListView模板
- Vysor 在电脑上控制android手机屏幕 镜像
- Unity 3D 第三更
- Android开发之使用viewpager实现图片轮播(二)
- 关注我的微信公众帐号小q机器人(xiaoqrobot)
- iOS---WebView执行JS方法时传Json串做参数的一个坑!
- 微信公众平台开发接口PHP SDK完整版
- ANDROID 工程导入报 NO RESOURCE FOUND 一类编译错误的解决
- Unity 3D第二更
- android API Demos 路径
- 【转】 Android 各种常规图标尺寸
- Android apk动态加载机制的研究(二):资源加载和activity生命周期管理
- android Telephony结构
- ios localization
- web.xml中webAppRootKey
- 解决Android中xml文件Graphical Layout显示和真机运行显示不相同问题
- Unity 3D 第一更