Strictmode 修改,优化

 

1.  跑全模块monkey, 或者单独模块monkey

2. 代码中开启 strictmode --在网上看到的相应文章很多,需要写代码比较麻烦


//全模块
monkey  --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --throttle 500 -v -v -v -s 500 500000 2>/sdcard/error.txt 1>/sdcard/info.txt
monkey  --ignore-crashes --ignore-timeouts --ignore-native-crashes --monitor-native-crashes --throttle 1000  -v -v -v -s 800 380000 2>/sdcard/error.txt 1>/sdcard/info.txt"


//指定模块
monkey -p com.android.settings  --ignore-crashes --ignore-timeouts --kill-process-after-error  --ignore-security-exceptions --monitor-native-crashes  --throttle 1500 -v -v -v -s 800  70000 2>/sdcard/error.txt 1>/sdcard/info.txt
monkey -p com.android.settings  --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 1000 -v -v -v -s 500 180000 2>/sdcard/error.txt 1>/sdcard/info.txt


//手动停止monkey指令
adb shell kill -9 `adb shell ps | grep "com.android.commands.monkey" | awk '{print $2}'`

跑完monkey之后,导出  dropbox log

adb pull /data/system/dropbox/

 

然后分析里面的
leaks (附件duration_all.txt)
Duration-Millis时间长(附件leak_all.txt)
IO违例 Duration-Millis时间长(附件duration.txt)

......


比如以下leaks,如果确实没有释放的话,累积之后就会因为leaks引发系列问题。

Process: com.android.xxx 
...
java.lang.Throwable: Explicit termination method 'close' not called 
at dalvik.system.CloseGuard.open(CloseGuard.java:223) 
at android.content.ContentResolver$CursorWrapperInner.<init>(ContentResolver.java:2928) 
at android.content.ContentResolver.query(ContentResolver.java:782) 
at android.content.ContentResolver.query(ContentResolver.java:705) 
at android.content.ContentResolver.query(ContentResolver.java:663) 
at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:79) 
..
A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.

再比如如下IO违例,不恰当的逻辑容易导致在系统负载较高时候的ANR
Process: com.android.xxx 
PID: 2043 
Flags: 0x3888be45 
Package: com.android.xxx v1 (1.0) 
Duration-Millis: 2089 

android.os.StrictMode$StrictModeDiskReadViolation: policy=18874375 violation=2 
..
at com.android.internal.policy.PhoneWindow.getDecorView(PhoneWindow.java:2081) 
at com.android.clone.AppCloneSettings.onCreate(AppCloneSettings.java:100)


1.  白名单添加问题, 使用recent的一键清理后, 内存使用还是高居不下,白名单需要修改的问题
2.  Persist进程
    630,521K: Persistent 
    134,882K: com.android.facelock
3.  art compile mode 优化
    (android O)默认为quicken 模式。
    android O quicken mode 和 speed mode 的差距和影响 

4. cpu 调频策略优化  android o 与 之前有差别

 

其他方式导出 dropbox的log  

转载  https://blog.csdn.net/qq_20956737/article/details/79443279

  问题来了,dropbox文件目录路径一般是/data/system/dropbox/,开发时我们当然能直接把日志拉出来。但是,外面用的正式版的机器我们是没有读取这个目录的权限的,即使你拥有系统权限也不行。所以想着怎么在程序中直接把dropbox日志直接输出来。

    后来找到android了一个跟dropbox日志紧密联系的类:DropboxManager.

    DropboxManager中文介绍可以参考这篇博客:DropboxManager介绍

第一步:获取DropboxManager

    api英文原文是:You can obtain an instance of this class by calling {@link android.content.Context#getSystemService} with {@link android.content.Context#DROPBOX_SERVICE}.代码:

DropboxManager dropboxManager = (DropboxManager ) mContext.getSystemService(Context.DROPBOX_SERVICE);
第二步:获取dropbox信息

    DropboxManager中有一个类Entry,该Entry在api中的定义是:A single entry retrieved from the drop box. 通过这个Entry我们就可以获取到dropbox的日志信息(嘿嘿,开心)。

    其实说明白点就是:每个Entry对应的就是一个tag的系统日志(上面推荐博客中介绍到的tag,如crash,anr,strict_mode等等)。既然重点都在这个Entry上,那我们来理一理它。首先看他的参数。

其中我们要用到的就是前面三个:mTag对应的就是我们上说的系统日志的tag;mTimeMillis对应的是Entry创建的时间,这个我们后面会用到,必要参数;mData中包含的就是我们要的数据了。

    那么我们怎么获取Entry呢?不急,DropboxManager中给你提供了方法:getNextEntry(String tag, long msec)。其中tag上面说的很详细了,传null代表所有tag;msec代表系统这个时间点后创建的Entry。所以这个方法获取到的就是指定tag、指定时间点后创建的第一个Entry。

    好了,Entry我们已经获取到了,接下来说说怎么从Entry获取我们需要的日志信息。Entry类中有一个方法是String getText(int maxBytes),直接返回的就是String,深得我心啊。就是说你直接就可以获取到对应entry中的日志信息了。具体是怎么实现的我就不说了,去看api,很简单。

    接下来你只需要对这个String进行操作就行了,可以写到本地文件中,也可以打印到普通日志中。看你喜欢。下面贴一下我的完整代码:

import android.content.Context;
 
import android.os.DropBoxManager;
 
import android.os.Environment;
 
import android.util.Log;
 
import java.io.IOException;
 
public class DropboxOutputManager {
 
private static final StringTAG ="DropboxPrintManager";
 
private static final int MAX_BYTES =8192 *100;
 
// DropBoxManager 是 Android 在 Froyo(API level 8) 引入的用来持续化存储系统数据的机制,
 
// 主要用于记录 Android 运行过程中, 内核, 系统进程, 用户进程等出现严重问题时的 log,
 
// 可以认为这是一个可持续存储的系统级别的 logcat.
 
 private DropBoxManagerdropBoxManager;
 
/**
 
   * [dropbox文件生成路径]
 
   */
 
private StringoutputPath = Environment.getExternalStorageDirectory().getPath() +"/log/dropbox.log";
 
private static DropboxOutputManagersInstance;
 
private DropboxOutputManager() {
 
    //通过用参数 DROPBOX_SERVICE 调用 getSystemService(String) 来获得这个服务
 
     dropBoxManager = (DropBoxManager) mContext.getSystemService(Context.DROPBOX_SERVICE);
 
}
 
public static DropboxOutputManagergetInstance() {
 
    if (sInstance ==null) {
 
        synchronized (DropboxOutputManager.class) {
 
            if (sInstance ==null) {
 
                sInstance =new DropboxOutputManager();
 
            }
 
         }
 
    }
 
    return sInstance;
 
}
 
/**
 
   * 打印日志信息
 
   */
 
public boolean printDropboxLog()throws IOException {
 
    // 我们要输出所有的dropbox信息,所以时间点从0开始
 
    long time =0;
 
    String text ="";
 
     DropBoxManager.Entry entry;
 
     while ((entry = getEntry(time)) !=null) {
 
            //这里给它加个标签
 
            text = entry.getTag() +"  " + entry.getText(MAX_BYTES) +"\r\n";
 
            time = entry.getTimeMillis();
 
            //直接打印出来,当然你可以在这里把text写到文件中去
 
            Log.d("whh", text);
 
            // 这里一定要记得关闭
 
            if (entry !=null) {
 
                entry.close();
 
            }
 
    }
 
    return true;
 
}
 
/**
 
   * 获取指定时间点后的第一个entry,不指定tag
 
   */
 
private DropBoxManager.EntrygetEntry(long time) {
 
    // 需要在AndroidManifest中增加android.permission.READ_LOGS权限
 
     DropBoxManager.Entry entry =dropBoxManager.getNextEntry(null, time);
 
      return entry;
 
 }
 
}

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空白的泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值