项目GitHub 本文要点
- `Debug.startMethodTracing();`【在`需要监控的代码块`前添加(注意它有四个重载方法)】
- `Debug.stopMethodTracing();`【在`需要监控的代码块`后添加】
- 生成的调试文件在sd卡:Android/data/packagename/files
- **上次在内存优化的实战中,**
跟踪Api调用
**、**线程运行
**情况,生成**Html报告
**;- `python systrace.py -t 10 [other-options][categories]`
- 可以参考[CSDN某博客](https://links.jianshu.com/go?to=https%3A%2F%2Fblog.csdn.net%2Fsongzi1228%2Farticle%2Fdetails%2F97893123%23systrace); 或
自动检测
**出来主线程当中**违例
**的一些情况,
同时按照**代码的配置
**给出**相应的反应
**。- **线程检测策略【****`StrictMode.setThreadPolicy()`****】:**
private boolean DEV_MODE = true;
private void initStrictMode() {
if (DEV_MODE) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()// or .detectAll() for all detectable problems
.penaltyLog() //在Logcat 中打印违规异常信息
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects()
.setClassInstanceLimit(NewsItem.class, 1)
.detectLeakedClosableObjects() //API等级11
.penaltyLog()
.build());
}
}
DEV_MODE
**标志位:
只有在线下开发的环境时将之设置为true,才会使进程打开**StrictMode
**;StrictMode
**便会进行相应的检测和反应;penaltyLog()
**【penalty n.惩罚,刑罚,害处】是出现违规后用log打印出来,即指定**StrictMode
**的响应方式,**
StrictMode
**除了打印log的方式,**
还有其他响应方式,
如**penaltyDeath()
**可以让APP直接崩溃掉,
penaltyDialog()
**可以弹出一个Dialog等!!!!!!!!!**
log的响应方式
**):/**
* 模拟内存泄露的Activity
*/
public class MemoryLeakActivity extends AppCompatActivity implements CallBack{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memoryleak);
ImageView imageView = findViewById(R.id.iv_memoryleak);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.splash);
imageView.setImageBitmap(bitmap);
CallBackManager.addCallBack(this);
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.penaltyLog()
.build());
findViewById(R.id.iv_memoryleak).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
writeToExternalStorage();
}
});
}
/**
* 文件系统的操作
*/
public void writeToExternalStorage() {
try {
File externalStorage = Environment.getExternalStorageDirectory();
File mbFile = new File(externalStorage, "xxx.txt");
if (mbFile.exists()){
mbFile.createNewFile();
}
OutputStream output = new FileOutputStream(mbFile, true);
output.write("www.wooyun.org".getBytes());
output.flush();
output.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
CallBackManager.removeCallBack(this);
}
@Override
public void dpOperate() {
// do sth
}
}
Dialog
**的响应方式:**
以上IO违例的原因就是**
在主线程做了IO操作了
**, 这显然是不行的,需要开一个子线程给它整!
public class TestApp extends Application {
static MemoryLeakActivity i = new MemoryLeakActivity();
static MemoryLeakActivity j = new MemoryLeakActivity();
@Override
public void onCreate() {
super.onCreate();
//实例限制检测 测试
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.setClassInstanceLimit(MemoryLeakActivity.class, 1)
.detectLeakedClosableObjects() //API等级11
.penaltyLog()
.build());
}
}