【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)

简介: 【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)

文章目录

一、 方法追踪代码模板

二、 追踪 Launch 页面的 onCreate 方法执行情况

1. 示例项目

2. SD 卡访问权限问题 ( 动态权限申请 )

3. MainActivity onCreate 方法追踪及动态权限申请

三、 查看 SD 卡根目录的 trace 文件

四、 Android Studio 中分析该 Trace 文件





一、 方法追踪代码模板


调用 Debug.startMethodTracing(traceFile.getAbsolutePath()) 开始追踪分析方法执行情况 , 传入文件路径作为参数 , 当执行 Debug.stopMethodTracing() 方法时 , 会将方法追踪信息保存到 traceFile.getAbsolutePath() 代表的文件路径中 ;


在下面的代码中 , 方法追踪信息被保存到了 SD 卡下的 Method_Trace 文件中 ;




1. 方法追踪使用流程 :



① 创建 File 对象 : 方法的执行信息 , 将被保存到该 File 文件中 ;


File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");


② 开始方法追踪 : 在该方法中 , 需要传入上述 File 文件的绝对路径 , 才能向该 File 文件中保存方法执行信息 ;


Debug.startMethodTracing(traceFile.getAbsolutePath());


③ 停止方法追踪 : 调用该方法后 , 结束追踪 , 可以将 File 文件导出 , 并在 Android Studio 工具中分析方法执行情况 ;


Debug.stopMethodTracing();



2. 代码示例 :


// 1. 将追踪信息存放到该文件中
File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");
// 2. 开启方法追踪
Debug.startMethodTracing(traceFile.getAbsolutePath());
// TODO 要追踪的内容
// 3. 停止方法追踪
Debug.stopMethodTracing();





二、 追踪 Launch 页面的 onCreate 方法执行情况




1. 示例项目


1 . 示例项目 : 以上一个项目直播推流的 MainActivity 为例 , 在该 Launch Activity 的 onCreate 方法中 , 添加上述方法追踪信息 , 追踪方法执行情况 , 项目地址 han1202012 / RTMP_Pusher ;




2. SD 卡访问权限问题 ( 动态权限申请 )


1. 权限问题 : 我用的是 Google Pixel 2 手机作为测试机 , 使用的是 Android 10 系统 , 此时出现动态权限问题 ;



2. SD 卡访问权限 : Debug.startMethodTracing(traceFile.getAbsolutePath()) 方法作用是将方法追踪信息写出到 SD 卡的文件中 , 因此这里必须 动态申请 SD 卡的访问权限 ;



3. 静态声明权限 : 在 AndroidManifest.xml 文件中添加 SD 卡的访问权限 : 最后两个是 SD 卡访问权限 ;


<!-- 前 4 个权限是读写权限 -->
<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" />
<!-- 最后两个权限是 SD 卡访问权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />


4. 动态权限申请 : MainActivity 中使用相关权限之前 , 必须先动态申请权限 , 否则无法进行方法追踪 ;



注意 : 动态权限申请 , 必须要在 Debug.startMethodTracing 方法之前调用 , 否则开始方法追踪在没有 SD 卡访问权限的情况下执行 , 直接崩溃 ;




3. MainActivity onCreate 方法追踪及动态权限申请


下面代码中有 ★ 的代码是方法追踪相关代码 ; 添加了 3 33 行方法追踪相关代码 ;


动态权限申请代码 : 其中 [   31 , 71   ] [ \, 31 , 71 \,][31,71] 行区间内的代码是动态权限申请相关代码 ;


方法追踪代码 : 第 88 , 90 , 124 88 , 90 , 12488,90,124 行代码是方法追踪相关代码 ;



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;
    /**
     * 需要获取的权限列表
     */
    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
    };
    /**
     * 动态申请权限的请求码
     */
    private static final int PERMISSION_REQUEST_CODE = 888;
    /**
     * 动态申请权限
     */
    @RequiresApi(api = Build.VERSION_CODES.M)
    private void initPermissions() {
        if (isLacksPermission()) {
            //动态申请权限 , 第二参数是请求吗
            requestPermissions(permissions, PERMISSION_REQUEST_CODE);
        }
    }
    /**
     * 判断是否有 permissions 中的权限
     * @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)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        /*
            此时应用首界面启动完成, 将主题恢复成其它主题
            此处也可以根据不同的设置, 为应用设置不同的主题
         */
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        // 初始化权限
        initPermissions();
        // ★ 1. 将追踪信息存放到该文件中
        File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");
        // ★ 2. 开启方法追踪
        Debug.startMethodTracing(traceFile.getAbsolutePath());
        setContentView(R.layout.activity_main);
        mSurfaceView = findViewById(R.id.surfaceView);
        // 创建直播推流器, 用于将采集的视频数据推流到服务器端
        // 800_000 代表 800K 的码率
        mLivePusher = new LivePusher(this,
                640, 480, 800_000, 10,
                Camera.CameraInfo.CAMERA_FACING_BACK);
        // 设置 Camera 采集的图像本地预览的组件, 在 mSurfaceView 界面先绘制摄像头
        // 此处要为 SurfaceHolder 设置 SurfaceHolder.Callback 回调 , 通过里面的回调函数
        // 驱动整个推流开始
        mLivePusher.setPreviewDisplay(mSurfaceView.getHolder());
        findViewById(R.id.button_play).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // rtmp://123.56.88.254/myapp/0
                // 0 相当于 直播的 密码
                // 配置好服务器后, 记录 IP 地址, 替换 123.56.88.254 IP 地址
                // rtmp://123.56.88.254/myapp/mystream 地址推流后
                // 可以直接在 RTMP 服务器端的主页, 使用 JWPlayer 观看直播内容
                // 网页地址是 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 文件


应用启动完毕后 , onCreate 方法执行完毕 , 该方法追踪文件就会在 SD 卡根目录生成 ;


回顾下存放方法追踪信息的文件创建过程 , 将 Trace 信息存储到了 SD 卡根目录的 Method_Trace 文件中 ;


// ★ 1. 将追踪信息存放到该文件中
File traceFile = new File(Environment.getExternalStorageDirectory(), "Method_Trace");


image.png





四、 Android Studio 中分析该 Trace 文件


直接将该文件拖入 Android Studio 中即可 ;


image.png

目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1565 4
|
7月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
998 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
8月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
556 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
JavaScript Linux 网络安全
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
4508 77
|
12月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
456 1
|
网络协议 Linux Android开发
深入探索Android系统架构与性能优化
本文旨在为读者提供一个全面的视角,以理解Android系统的架构及其关键组件。我们将探讨Android的发展历程、核心特性以及如何通过有效的策略来提升应用的性能和用户体验。本文不包含常规的技术细节,而是聚焦于系统架构层面的深入分析,以及针对开发者的实际优化建议。
490 21
|
Android开发 开发者
Android性能优化——内存管理的艺术
Android性能优化——内存管理的艺术
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
2341 1
|
XML Android开发 数据安全/隐私保护
android 11后文件读写访问权限申请
android 11后文件读写访问权限申请
1351 0