android 代码优化:关闭输出日志

android关闭日志

我们在开发时,经常会输出各种日志来debug代码。但是等到应用发布的apk运行时不希望它输出日志。

关闭输出日志Log.v(),Log.i(),Log.w(),Log.v(),Log.e()等

原理:

那么我们可以通过proguard来删除各种日志输出代码。然后导出apk时,将会过滤掉日志代码。

通过配置proguard,将类android.util.Log的方法给置为为无效代码。(proguard是一个代码优化的工具,也可以混淆代码)

assumenosideeffects

assumenosideeffects,assume no side effects;假定无效;该属性也就是标识无效代码。我们就是通过这个参数来让proguard删除日志代码。

assumenosideeffects的官方解释:

In the optimization step, ProGuard will then remove calls to such methods, if it can determine that the return values aren‘t used.ProGuard will analyze your program code to find such methods automatically.It will not analyze library code, for which this option can therefore be useful.

In general, making assumptions can be dangerous; you can easily break the processed code. Only use this option if you know what you‘re doing!

如下:

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

使用这个配置时,一定要注意-dontoptimize,配置。

don‘t optimize 不要优化;将会会关闭优化,导致日志语句不会被优化掉。所以不能有这个配置

如何关闭日志:

我的项目目录: 

1)打开proguard-------修改project.properties文件。

在project.properties文件最后行添加:proguard.config=proguard

如我的project.properties文件:

target=android-18

proguard.config=proguard-project.txt

2)配置proguard-------修改proguard配置文件,

如:我的配置文件是:proguard-project.txt

配置为:

-keepclassmembers class * extends android.app.Activity {

public void *(android.view.View);

}

-keep class * implements android.os.Parcelable {

public static final android.os.Parcelable$Creator *;

}

-dontwarn android.support.**

-keepclassmembers class **.R$* {

public static ;

}

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

}

3)导出关闭日志的apk

proguard,在导出apk的时候才会优化代码,生成优化后的apk。(完成代码混淆也是在导出apk,proguard将代码混淆后生成apk)

通过如上两个步骤,配置project.properties文件和proguard.properties文件;那么项目就配置好了。可以直接导出签名apk,该apk不会输出日志,我们用LogCat是看不到该apk的日志。

测试

源码1)

?


1

2

3

4

5

6

7

8

public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Log.e("MainActivity", "log" );

    }

}

通过生成的apk反编译出如下代码1-1)

?


1

2

3

4

5

6

7

8

public class MainActivity extends Activity

{

  protected void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    setContentView(2130903040);

  }

}

运行LogCat中没有输出日志。

很明显Log.e("MainActivity","log" );被优化掉了

源码2)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

public class MainActivity extends Activity {

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Log.e("MainActivity", "log " + test());

    }

    

    private String test(){

        Toast.makeText(this, "test", Toast.LENGTH_SHORT).show();

        return "jjyy";

    }

}

通过生成的apk反编译出如下代码2-1)

?


1

2

3

4

5

6

7

8

9

10

11

12

public class MainActivity extends Activity

{

  protected void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    setContentView(2130903040);

    //如下是test()函数的代码

    StringBuilder localStringBuilder = new StringBuilder("log ");

    Toast.makeText(this, "test", 0).show();

    localStringBuilder.append("jjyy").toString();

  }

}

运行LogCat中没有输出日志。但是弹出toast。

很明显Log.e();被优化掉了,但是test()方法依然被保留了,

源码3):

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class MainActivity extends Activity {

    int i = 0;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Log.e("MainActivity", "log" + test() );

        Toast.makeText(this, "i = " + i, Toast.LENGTH_SHORT).show();    //i == 1;

    }

    private String test(){

        i++;

        return "test" + i;

    }

}

通过生成的apk反编译出如下代码3-1)

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class MainActivity extends Activity

{

  private int a = 0;    //proguard将代码混淆后变量i变为了a

  protected void onCreate(Bundle paramBundle)

  {

    super.onCreate(paramBundle);

    setContentView(2130903040);

    //Log.e()代码被删除了,但是调用test()函数里的i++被直接优化到这里

    StringBuilder localStringBuilder = new StringBuilder("log");   

    this.a = (1 + this.a);

    localStringBuilder.append("test" + this.a).toString();

    Toast.makeText(this, "i = " + this.a, 0).show();

  }

}

运行LogCat中没有输出日志。但是弹出toast 显示字符串 : "i = 1"

很明显Log.e();被优化掉了,但是test()方法依然被保留了,

来自:http://www.2cto.com/kf/201403/287453.html

时间: 2024-08-30 06:18:42

android 代码优化:关闭输出日志的相关文章

对于Android系统Log输出日志的封装LogUtils

MainActivity如下: package cc.cn.logutil; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 对于Android系统Log输出日志的封装LogUtils * 1 可修改LogUtils中的LEVEL值觉得哪些级别的日志可以输出. * 所以方便选择性输出日志或者屏蔽日志输出 * 2 输出的日志除了本想输出的信息外还包含了该日志输出时所属 * 的线程,类,方法名,已经在该方法

Android Studio控制台输出日志太多清空

在使用Android studio的时候,有时候会由于手机输出的日志太多,导致控制台瞬间清空,尤其是遇见一些FATAL Exception时候,瞬间控制台就被清空了,根本捕获不到,导致其他调试的日志也被清空. 这时候,你就需要LogBoy来帮助你调试了. 你需要: 本地配置Python环境 & 引入LogBoy库到自己工程 & 启动python脚本 你收获: 可以在本地浏览器捕获你输出的日志,调试更方便 你可以访问:LogBoy主页

Android adb logcat输出日志显示不全解决方案

在终端中使用adb logcat打印服务器json数据,如果返回数据过大超过4000字节(4K)即会截断不显示 原因:logcat在对于message的内存分配大概是4k左右.所以超过的内容都直接被丢弃; 解决方案:切分超过4k的message,使用多个Log.i输出 public static void showLog(String str) { str = str.trim(); int index = 0; int maxLength = 4000; String finalString;

Android O版本自定义日志输出目录

Android原生系统默认情况下,log是不输出到文件的,这样对于只能用模拟器进行开发实验的人来说,不是很方便. 当然android默认不输出log到文件也是考虑到输入日志到文件会引起性能问题. 下面提供一种将日志定向到文件的方法 修改system/core/logcat/logcatd.rc文件,在文件的最后添加如何代码: # define my log directory service applogcat /system/bin/logcat -v threadtime -r 4096 -

Android 使用Log4j把日志写入SD卡,动态修改输出文件名称

一.Log4j简单使用 1. 下载log4j.jar http://logging.apache.org/log4j/2.x/ 2. 创建Java代码 public class Loggers { public static Logger logger = Logger. getLogger(Loggers. class); public static void init() { try { PatternLayout patternLayout = new PatternLayout(); p

Android输出日志Log类

android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e().根据首字母分别对应VERBOSE,DEBUG,INFO,WARN,ERROR. 1.Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("",""); 2.Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Log

查看与输出日志信息

查看与输出日志信息: 1.优先级级别从高到低: Error > Warning > Info > Debug > Verbose 2.日志输出的3种方式: (1)       Log.i (2)       System.out.println (3)       System.err.println 3.实践: 1 package com.example.test; 2 3 import android.test.AndroidTestCase; 4 import android

Android的logcat输出

Android的Logcat是一个很方便的调试工具,但是log的输出又分为好几种,介于以后的学习中都会用到Log,今天提前深入了解一下: ? ? 在Android系统中,verbose和debug信息在程序被调试时显示:Information.warn.error和assert在debug和release版的应用程序中都会显示: 类android.util.Log包含了几个静态方法,这些静态方法按照递增的级别输出日志信息:这些级别分别是ERROR.?WARN. INFO. DEBUG. VERB

cmd命令行中logcat输出日志中文乱码

在命令行使用adb logcat命令直接输出日志中文内容显示乱码,原因是中文系统中cmd命令行窗口默认的编码是GBK,而LogCat打印的日志是UTF-8编码,所以adb logcat命令输出的中文内容显示乱码. 修改cmd命令行窗口字符编码即可解决logcat日志中文显示乱码问题: 1.cmd命令行窗口字符编码切换为UTF-8,命令行中执行:chcp 65001 2.修改cmd窗口字体属性,在命令行标题栏上点击右键,选择”属性”->”字体”,将字体修改为”Lucida Console”,点击确