Profile有什么用?
它可以使用普通的实时检测内存、CPU、NETWORK的使用情况。
也可以用它的高级用法,来检测各个方法的启动速度。
Profile的高级用法,默认只有Android8.0之后才能使用,但是我们在Android8.0之前也可以操作使用。
Profile的高级用法中,有四个类型:
类型 作用
Call Chart 根据时间线查看调用栈,便于观察每次调用是何时发生的
Flame Chart(就是我们的火焰图) 根据耗时百分比查看调用栈,便于发现总耗时很长的调用链
Top Down Tree 查看记录数据中所有方法调用栈,便于观察其中每一步所消耗的精确时间。
Bottom Up Tree 相对于Top Down Tree,能够更方便查看耗时方法如何被调用
Android8.0+使用步骤:
点击app,选择Edit Configurations
[图片上传中...(image.png-45eaf0-1605028914804-0)]
到了Run/Debug Configurations页面,点击app,再点击Profiling,然后勾选Start recording CPU activity on startup,然后选择想要监控的内容,最后应用
然后点击Profile 'app'即可运行
运行出来之后,可以在自己想要的位置点击停止监测,即可生成相应的内容
最后生成的内容
Android8.0-使用步骤:
因为要自己生成文件,注意要先去申请相关权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在开始检测的地方,添加Debug.startMethodTracing("enjoy")
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Debug.startMethodTracing("enjoy");
}
}
在结束检测的地方添加:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {//onWindowFocusChanged表示获取到焦点,即页面可交互
super.onWindowFocusChanged(hasFocus);
Debug.stopMethodTracing();
}
}
然后直接运行app即可,运行结束之后,我们可以直接在AS的右下角找到并点击DeviceFileExplorer,然后可以得到我们的文件列表,从文件列表的SDcard文件夹中得到生成的enjoy.trace,双击即可得到我们的内容
双击后即可得到我们想要的内容
StrictMode
StrictMode是一个开发人员工具,它可以检测出我们可能无意中做的事情,并将它们提请我们注意,以便我们能够修复它们。
StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问。帮助我们让磁盘和网络操作远离主线程,可以使应用程序更加平滑、响应更快
一般写在Application.onCreate的super.onCreate前面
public class MyApplication extends Application {
@Override
public void onCreate() {
if (BuildConfig.DEBUG) {
//线程检测策略
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads() //读、写操作
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects() //Sqlite对象泄露
.detectLeakedClosableObjects() //未关闭的Closable对象泄露
.penaltyLog() //违规打印日志
.penaltyDeath() //违规崩溃
.build());
}
}