Profile有什么用?
它可以使用普通的實時檢測內(nèi)存、CPU、NETWORK的使用情況。
也可以用它的高級用法,來檢測各個方法的啟動速度。
Profile的高級用法,默認只有Android8.0之后才能使用,但是我們在Android8.0之前也可以操作使用。
Profile的高級用法中,有四個類型:
類型 作用
Call Chart 根據(jù)時間線查看調(diào)用棧,便于觀察每次調(diào)用是何時發(fā)生的
Flame Chart(就是我們的火焰圖) 根據(jù)耗時百分比查看調(diào)用棧,便于發(fā)現(xiàn)總耗時很長的調(diào)用鏈
Top Down Tree 查看記錄數(shù)據(jù)中所有方法調(diào)用棧,便于觀察其中每一步所消耗的精確時間。
Bottom Up Tree 相對于Top Down Tree,能夠更方便查看耗時方法如何被調(diào)用
Android8.0+使用步驟:
點擊app,選擇Edit Configurations

[圖片上傳中...(image.png-45eaf0-1605028914804-0)]
到了Run/Debug Configurations頁面,點擊app,再點擊Profiling,然后勾選Start recording CPU activity on startup,然后選擇想要監(jiān)控的內(nèi)容,最后應(yīng)用

然后點擊Profile 'app'即可運行

運行出來之后,可以在自己想要的位置點擊停止監(jiān)測,即可生成相應(yīng)的內(nèi)容

最后生成的內(nèi)容

Android8.0-使用步驟:
因為要自己生成文件,注意要先去申請相關(guān)權(quán)限:
<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");
}
}
在結(jié)束檢測的地方添加:
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即可,運行結(jié)束之后,我們可以直接在AS的右下角找到并點擊DeviceFileExplorer,然后可以得到我們的文件列表,從文件列表的SDcard文件夾中得到生成的enjoy.trace,雙擊即可得到我們的內(nèi)容

雙擊后即可得到我們想要的內(nèi)容

StrictMode
StrictMode是一個開發(fā)人員工具,它可以檢測出我們可能無意中做的事情,并將它們提請我們注意,以便我們能夠修復(fù)它們。
StrictMode最常用于捕獲應(yīng)用程序主線程上的意外磁盤或網(wǎng)絡(luò)訪問。幫助我們讓磁盤和網(wǎng)絡(luò)操作遠離主線程,可以使應(yīng)用程序更加平滑、響應(yīng)更快
一般寫在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() //未關(guān)閉的Closable對象泄露
.penaltyLog() //違規(guī)打印日志
.penaltyDeath() //違規(guī)崩潰
.build());
}
}