【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)
文章目錄
- 一、 方法追蹤代碼模板
- 二、 追蹤 Launch 頁(yè)面的 onCreate 方法執(zhí)行情況
- 1. 示例項(xiàng)目
- 2. SD 卡訪問(wèn)權(quán)限問(wèn)題 ( 動(dòng)態(tài)權(quán)限申請(qǐng) )
- 3. MainActivity onCreate 方法追蹤及動(dòng)態(tài)權(quán)限申請(qǐng)
- 三、 查看 SD 卡根目錄的 trace 文件
- 四、 Android Studio 中分析該 Trace 文件
一、 方法追蹤代碼模板
調(diào)用 Debug.startMethodTracing(traceFile.getAbsolutePath()) 開(kāi)始追蹤分析方法執(zhí)行情況 , 傳入文件路徑作為參數(shù) , 當(dāng)執(zhí)行 Debug.stopMethodTracing() 方法時(shí) , 會(huì)將方法追蹤信息保存到 traceFile.getAbsolutePath() 代表的文件路徑中 ;
在下面的代碼中 , 方法追蹤信息被保存到了 SD 卡下的 Method_Trace 文件中 ;
1. 方法追蹤使用流程 :
① 創(chuàng)建 File 對(duì)象 : 方法的執(zhí)行信息 , 將被保存到該 File 文件中 ;
File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");② 開(kāi)始方法追蹤 : 在該方法中 , 需要傳入上述 File 文件的絕對(duì)路徑 , 才能向該 File 文件中保存方法執(zhí)行信息 ;
Debug.startMethodTracing(traceFile.getAbsolutePath());③ 停止方法追蹤 : 調(diào)用該方法后 , 結(jié)束追蹤 , 可以將 File 文件導(dǎo)出 , 并在 Android Studio 工具中分析方法執(zhí)行情況 ;
Debug.stopMethodTracing();2. 代碼示例 :
// 1. 將追蹤信息存放到該文件中 File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace"); // 2. 開(kāi)啟方法追蹤 Debug.startMethodTracing(traceFile.getAbsolutePath());// TODO 要追蹤的內(nèi)容// 3. 停止方法追蹤 Debug.stopMethodTracing();二、 追蹤 Launch 頁(yè)面的 onCreate 方法執(zhí)行情況
1. 示例項(xiàng)目
1 . 示例項(xiàng)目 : 以上一個(gè)項(xiàng)目直播推流的 MainActivity 為例 , 在該 Launch Activity 的 onCreate 方法中 , 添加上述方法追蹤信息 , 追蹤方法執(zhí)行情況 , 項(xiàng)目地址 han1202012 / RTMP_Pusher ;
2. SD 卡訪問(wèn)權(quán)限問(wèn)題 ( 動(dòng)態(tài)權(quán)限申請(qǐng) )
1. 權(quán)限問(wèn)題 : 我用的是 Google Pixel 2 手機(jī)作為測(cè)試機(jī) , 使用的是 Android 10 系統(tǒng) , 此時(shí)出現(xiàn)動(dòng)態(tài)權(quán)限問(wèn)題 ;
2. SD 卡訪問(wèn)權(quán)限 : Debug.startMethodTracing(traceFile.getAbsolutePath()) 方法作用是將方法追蹤信息寫出到 SD 卡的文件中 , 因此這里必須 動(dòng)態(tài)申請(qǐng) SD 卡的訪問(wèn)權(quán)限 ;
3. 靜態(tài)聲明權(quán)限 : 在 AndroidManifest.xml 文件中添加 SD 卡的訪問(wèn)權(quán)限 : 最后兩個(gè)是 SD 卡訪問(wèn)權(quán)限 ;
<!-- 前 4 個(gè)權(quán)限是讀寫權(quán)限 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><!-- 最后兩個(gè)權(quán)限是 SD 卡訪問(wèn)權(quán)限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />4. 動(dòng)態(tài)權(quán)限申請(qǐng) : MainActivity 中使用相關(guān)權(quán)限之前 , 必須先動(dòng)態(tài)申請(qǐng)權(quán)限 , 否則無(wú)法進(jìn)行方法追蹤 ;
注意 : 動(dòng)態(tài)權(quán)限申請(qǐng) , 必須要在 Debug.startMethodTracing 方法之前調(diào)用 , 否則開(kāi)始方法追蹤在沒(méi)有 SD 卡訪問(wèn)權(quán)限的情況下執(zhí)行 , 直接崩潰 ;
3. MainActivity onCreate 方法追蹤及動(dòng)態(tài)權(quán)限申請(qǐng)
下面代碼中有 ★ 的代碼是方法追蹤相關(guān)代碼 ; 添加了 333 行方法追蹤相關(guān)代碼 ;
動(dòng)態(tài)權(quán)限申請(qǐng)代碼 : 其中 [31,71][ \, 31 , 71 \,][31,71] 行區(qū)間內(nèi)的代碼是動(dòng)態(tài)權(quán)限申請(qǐng)相關(guān)代碼 ;
方法追蹤代碼 : 第 88,90,12488 , 90 , 12488,90,124 行代碼是方法追蹤相關(guān)代碼 ;
package kim.hsl.rtmp;import android.Manifest; import android.content.pm.PackageManager; import android.hardware.Camera; import android.os.Build; import android.os.Bundle; import android.os.Debug; import android.os.Environment; import android.view.SurfaceView; import android.view.View; import android.widget.TextView;import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity;import java.io.File;public class MainActivity extends AppCompatActivity {/*** 顯示圖像的 SurfaceView 組件*/private SurfaceView mSurfaceView;/*** 直播推流器*/private LivePusher mLivePusher;/*** 需要獲取的權(quán)限列表*/private String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.INTERNET,Manifest.permission.MODIFY_AUDIO_SETTINGS,Manifest.permission.RECORD_AUDIO,Manifest.permission.CAMERA};/*** 動(dòng)態(tài)申請(qǐng)權(quán)限的請(qǐng)求碼*/private static final int PERMISSION_REQUEST_CODE = 888;/*** 動(dòng)態(tài)申請(qǐng)權(quán)限*/@RequiresApi(api = Build.VERSION_CODES.M)private void initPermissions() {if (isLacksPermission()) {//動(dòng)態(tài)申請(qǐng)權(quán)限 , 第二參數(shù)是請(qǐng)求嗎requestPermissions(permissions, PERMISSION_REQUEST_CODE);}}/*** 判斷是否有 permissions 中的權(quán)限* @return*/@RequiresApi(api = Build.VERSION_CODES.M)public boolean isLacksPermission() {for (String permission : permissions) {if(checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED){return true;}}return false;}@RequiresApi(api = Build.VERSION_CODES.M)@Overrideprotected void onCreate(Bundle savedInstanceState) {/*此時(shí)應(yīng)用首界面啟動(dòng)完成, 將主題恢復(fù)成其它主題此處也可以根據(jù)不同的設(shè)置, 為應(yīng)用設(shè)置不同的主題*/setTheme(R.style.AppTheme);super.onCreate(savedInstanceState);// 初始化權(quán)限initPermissions();// ★ 1. 將追蹤信息存放到該文件中File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");// ★ 2. 開(kāi)啟方法追蹤Debug.startMethodTracing(traceFile.getAbsolutePath());setContentView(R.layout.activity_main);mSurfaceView = findViewById(R.id.surfaceView);// 創(chuàng)建直播推流器, 用于將采集的視頻數(shù)據(jù)推流到服務(wù)器端// 800_000 代表 800K 的碼率mLivePusher = new LivePusher(this,640, 480, 800_000, 10,Camera.CameraInfo.CAMERA_FACING_BACK);// 設(shè)置 Camera 采集的圖像本地預(yù)覽的組件, 在 mSurfaceView 界面先繪制攝像頭// 此處要為 SurfaceHolder 設(shè)置 SurfaceHolder.Callback 回調(diào) , 通過(guò)里面的回調(diào)函數(shù)// 驅(qū)動(dòng)整個(gè)推流開(kāi)始mLivePusher.setPreviewDisplay(mSurfaceView.getHolder());findViewById(R.id.button_play).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// rtmp://123.56.88.254/myapp/0// 0 相當(dāng)于 直播的 密碼// 配置好服務(wù)器后, 記錄 IP 地址, 替換 123.56.88.254 IP 地址// rtmp://123.56.88.254/myapp/mystream 地址推流后// 可以直接在 RTMP 服務(wù)器端的主頁(yè), 使用 JWPlayer 觀看直播內(nèi)容// 網(wǎng)頁(yè)地址是 http//123.56.88.254:8080/String rtmpServerAddress = "rtmp://123.56.88.254/myapp/mystream";mLivePusher.startLive(rtmpServerAddress);((TextView)findViewById(R.id.textViewUrl)).setText("推流地址 : " + rtmpServerAddress);}});// ★ 3. 停止方法追蹤Debug.stopMethodTracing();} }
三、 查看 SD 卡根目錄的 trace 文件
應(yīng)用啟動(dòng)完畢后 , onCreate 方法執(zhí)行完畢 , 該方法追蹤文件就會(huì)在 SD 卡根目錄生成 ;
回顧下存放方法追蹤信息的文件創(chuàng)建過(guò)程 , 將 Trace 信息存儲(chǔ)到了 SD 卡根目錄的 Method_Trace 文件中 ;
// ★ 1. 將追蹤信息存放到該文件中 File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");四、 Android Studio 中分析該 Trace 文件
直接將該文件拖入 Android Studio 中即可 ;
總結(jié)
以上是生活随笔為你收集整理的【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Android 性能优化】应用启动优化
- 下一篇: 【Android 性能优化】应用启动优化