【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )

简介: 【Android 性能优化】应用启动优化 ( 安卓应用启动分析 | ActivityThread 主函数分析 | 应用初始化 | 启动优化项目 )

文章目录

一、 应用入口函数 ActivityThread 主函数 main

二、 ActivityThread 类 attach 方法 ( 应用加载 )

三、 ActivityThread 类 handleBindApplication 方法 ( 应用创建 )

四、 启动优化项目





一、 应用入口函数 ActivityThread 主函数 main


1 . 执行应用主函数 : Launcher 应用与 Zygote 进程进行通信后 , 通知 Zygote 进程 fork 一个新的进程 , 该新进程中通过 System Server 执行 ActivityThread , 执行 ActivityThread 中的主函数 ;



2 . Android 应用主函数简介 : 安卓应用的 main 函数定义在 ActivityThread.java 中 , 该主函数被封装起来了 , Android 应用在编译之后 , 是需要被打包到 apk 安装文件中的 , 这是整个应用的入口函数 , 这个入口文件就是 ActivityThread.java 类 ;


安卓应用主函数 : Android 开发者开发安卓应用时 , 是不需要自己定义主函数的 , 由开发环境自动生成 ;

苹果应用主函数 : iOS 开发者开发苹果应用程序时 , 需要自己写主函数 ;


3 . Java 栈内操作 : 在 Java 栈区域 , 会实例化 Application , 调用 Application 的 onCreate 方法 , 然后开启主界面 Activity ; 这些操作都是在 ActivityThread 中完成的 ;



4 . 应用入口主函数部分代码示例 : 下面代码是 ActivityThread 部分代码 , 省略 1 11 万行代码 , 只展示下主函数 ;


public final class ActivityThread {
    public static void main(String[] args) {
      // 主函数中先初始化 Looper MessageQueue 
      // 将主线程转为 Looper 线程 
      // 这也是在 Activity 中可以直接定义 Handler 就可以使用的原因 
        Looper.prepareMainLooper();
  // 这是主线程 
        ActivityThread thread = new ActivityThread();
        thread.attach(false);
        if (sMainThreadHandler == null) {
            sMainThreadHandler = thread.getHandler();
        }
        Looper.loop();
    }
}


该代码路径为 \frameworks\base\core\java\android\app\ActivityThread.java , 这是 Android 应用的入口主函数定义文件






二、 ActivityThread 类 attach 方法 ( 应用加载 )


1 . attach 方法引入 : 在上述 ActivityThread 类中的 main 函数中 , 创建 ActivityThread 对象 , 并调用了该对象的 attach 方法 , 下面开始分析该方法的源码 ;


   

ActivityThread thread = new ActivityThread();
        thread.attach(false);


在 attach 方法中 , 开启应用 , 加载 application 应用 , 然后加载 Activity 界面 ;




2 . 加载 Application 应用过程 :



① 获取进程引用 : 首先获取进程引用 IActivityManager mgr , 此处涉及进程通信 , IActivityManager 是进程的引用 , 可以与其它进程进行通信 ;


// ActivityThread.java
final IActivityManager mgr = ActivityManagerNative.getDefault();


② 绑定 Application 应用 : 调用 IActivityManager 对象的 attachApplication 方法 , 调用该方法后 , 通过跨进程通信方式回调 ActivityThread 中的 handleBindApplication 方法 , 这个操作是由系统回调的 , 主要操作是初始化应用 Application ;


// ActivityThread.java
mgr.attachApplication(mAppThread);


3 . ActivityThread.java 中的 attach 方法代码 : 展示部分代码细节 , 详细的类 , 去查看 ActivityThread.java 源码 ;


// ActivityThread.java
    private void attach(boolean system) {
    // mgr 是进程 , 涉及到进程间通信 , IActivityManager 是进程的引用
            final IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
              // 绑定 Application 应用
              // 调用该方法后 , 通过进程方式回调 ActivityThread 中的 handleBindApplication 方法
              // 这个操作是由系统回调的 
              // 主要操作是初始化应用 Application
                mgr.attachApplication(mAppThread);
            } catch (RemoteException ex) {
                // Ignore
            }
    }


该代码路径为 \frameworks\base\core\java\android\app\ActivityThread.java , 这是 Android 应用的入口主函数定义文件






三、 ActivityThread 类 handleBindApplication 方法 ( 应用创建 )


handleBindApplication 处理 Application 应用绑定方法 , 这是创建 Application 应用核心过程 ;



1 . 方法调用者 : 该方法是由进程回调的 , 回调时传入的 AppBindData data 参数 , 包含了所有应用相关信息 , 如创建位置 , 包名 ;


// ActivityThread.java
private void handleBindApplication(AppBindData data) {
}


2 . 创建应用核心代码 : 从进程中传入的 AppBindData data 参数的 info 信息中获取 Application 应用 , 这是获取应用的核心方法 ;


( 此时该 Application 是一个空的应用 , 还没有执行 onCreate 方法 )


// ActivityThread.java
Application app = data.info.makeApplication(data.restrictedBackupMode, null);
mInitialApplication = app;


3 . 执行应用 Application 的 onCreate 方法 : 下面的代码会触发执行 Application 的 onCreate 方法 ;


// ActivityThread.java
mInstrumentation.callApplicationOnCreate(app);


4 . Instrumentation 的 callApplicationOnCreate 方法 : 很简单的调用方法 , 直接调用 Application 的 onCreate 方法 ;


// Instrumentation.java
    public void callApplicationOnCreate(Application app) {
        app.onCreate();
    }


该代码所在文件路径为 \frameworks\base\core\java\android\app\Instrumentation.java



5 . ActivityThread 类 handleBindApplication 方法部分源码参考 :


// ActivityThread.java
    private void handleBindApplication(AppBindData data) {
        // ... 省略 1 万行代码
        // Allow disk access during application and provider setup. This could
        // block processing ordered broadcasts, but later processing would
        // probably end up doing the same disk access.
        // 允许磁盘在应用和 provider 创建时访问 . 
        // 该操作可能阻塞处理有序广播 , 但是稍后处理会完毕后 , 会允许同样的磁盘访问 ; 
        final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
        try {
            // If the app is being launched for full backup or restore, bring it up in
            // a restricted environment with the base application class.
            // 进程中传入的 AppBindData data 参数 , 包含了 Application 应用
            // 这是创建 Application 的过程
            Application app = data.info.makeApplication(data.restrictedBackupMode, null);
            mInitialApplication = app;
            try {
              // 执行 Application 的 onCreate 方法
                mInstrumentation.callApplicationOnCreate(app);
            } catch (Exception e) {
                if (!mInstrumentation.onException(app, e)) {
                    throw new RuntimeException(
                        "Unable to create application " + app.getClass().getName()
                        + ": " + e.toString(), e);
                }
            }
        } finally {
            StrictMode.setThreadPolicy(savedPolicy);
        }
    }



该代码路径为 \frameworks\base\core\java\android\app\ActivityThread.java , 这是 Android 应用的入口主函数定义文件







四、 启动优化项目


在 Launcher 应用点击图标后 , 启动应用 , 系统为应用开启进程 , 分配内存的步骤是无法干预的 , 开发者能做启动优化的地方只有两个位置 , 一个是 Application 的 onCreate 方法 , 另一个是 Activity 的 onCreate 方法 ;



1 . Application 的 onCreate 方法 : 在应用的 Application 创建时 , 需要调用 Application 中的 onCreate 方法 , 这里面绝对不能有耗时操作 , 直接影响到 ActivityThread 中初始化 Application 步骤的消耗时间 ;



2 . Activity 的 onCreate 方法 : 一般在 Activity 界面中 , 需要加载 xml 布局文件 , 显示布局文件中的画面 ;


目录
相关文章
|
3月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
334 4
|
12天前
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
70 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
2天前
|
JavaScript 搜索推荐 Android开发
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
22 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
|
2天前
|
数据采集 JavaScript Android开发
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
24 7
【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
|
14天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
115 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
12天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
35 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
27天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
76 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
存储 监控 API
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
87 11
|
3月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
113 21

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 10
    Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)