Android Studio直接运行影响启动性能

简介: Android Studio的instant run会影响启动时间

Android Studio直接运行影响启动性能

之前eclipse时代,测试空应用启动性能时,都是直接在IDE中启动,这样修改起来方便。
到了Android Studio时代,这个习惯被我保持下来了。
结果就被Instant Run功能给小小坑了一下。

从性能日志上看,发现空应用在handleBindApplication的时候,在MTK6753芯片上费时60多毫秒,展讯9832芯片上超过100毫秒。
而空应用,既没有Application的onCreate,又没有installProvider之类的,要花这么长时间很奇怪。

后来打印了一下backtrace,原来是这样的:

01-01 01:25:42.280 W/ContextWrapper(12427):     at android.content.ContextWrapper.attachBaseContext(ContextWrapper.java:67)
01-01 01:25:42.280 W/ContextWrapper(12427):     at com.android.tools.fd.runtime.BootstrapApplication.attachBaseContext(BootstrapApplication.java:244)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.Application.attach(Application.java:188)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.Instrumentation.newApplication(Instrumentation.java:1021)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.Instrumentation.newApplication(Instrumentation.java:1003)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.LoadedApk.makeApplication(LoadedApk.java:586)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5054)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.ActivityThread.-wrap1(ActivityThread.java)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1564)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.os.Handler.dispatchMessage(Handler.java:111)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.os.Looper.loop(Looper.java:205)
01-01 01:25:42.280 W/ContextWrapper(12427):     at android.app.ActivityThread.main(ActivityThread.java:5865)
01-01 01:25:42.280 W/ContextWrapper(12427):     at java.lang.reflect.Method.invoke(Native Method)
01-01 01:25:42.280 W/ContextWrapper(12427):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
01-01 01:25:42.280 W/ContextWrapper(12427):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:734)

原来InstantRun的时候,安装的应用的Application是com.android.tools.fd.runtime.BootstrapApplication,这个Application重载了attachBaseContext,正是这个重载的方法耗费了这么长的时间。
Application的attach方法是个hide的方法:

183    /**
184     * @hide
185     */
186    /* package */ final void attach(Context context) {
187        attachBaseContext(context);
188        mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;
189    }
```

attach会调用到当前Application的attachBaseContext,正常的attachBaseContext方法是这样的:
比如ContextThemeWrapper的attachBaseContext,就是对基类的调用:

50 @Override
51 protected void attachBaseContext(Context newBase) {
52 super.attachBaseContext(newBase);
53 }

而ContextWrapper的attachBaseContext是这样的:

65 protected void attachBaseContext(Context base) {
66 if (mBase != null) {
67 throw new IllegalStateException("Base context already set");
68 }
69 mBase = base;
70 }

所以,没有重载的普通类,在attachBaseContext这一步几乎不花时间。

## 解决方案
目录
相关文章
|
20天前
|
算法 数据处理 Android开发
掌握安卓性能优化的秘诀:电池寿命与运行效率的提升
【10月更文挑战第6天】 本文深入探讨了安卓应用开发中的性能优化技巧,重点分析了影响电池寿命和运行效率的关键因素,并提供了针对性的优化策略。通过代码优化、资源管理、后台任务处理等方法,开发者可以显著提升应用的续航能力和流畅度。同时,结合具体案例,展示了如何在实际开发中应用这些技巧,确保应用在各种场景下都能保持高效运行。本文旨在为安卓开发者提供实用的性能优化指导,助力其打造更优质的应用体验。
32 2
|
3月前
|
移动开发 监控 前端开发
构建高效Android应用:从优化布局到提升性能
【7月更文挑战第60天】在移动开发领域,一个流畅且响应迅速的应用程序是用户留存的关键。针对Android平台,开发者面临的挑战包括多样化的设备兼容性和性能优化。本文将深入探讨如何通过改进布局设计、内存管理和多线程处理来构建高效的Android应用。我们将剖析布局优化的细节,并讨论最新的Android性能提升策略,以帮助开发者创建更快速、更流畅的用户体验。
62 10
|
3月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
201 1
|
26天前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
119 2
|
2月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
102 9
|
2月前
|
安全 Android开发 数据安全/隐私保护
安卓与iOS的对决:移动操作系统的性能与创新
在当今智能手机市场,安卓和iOS两大操作系统一直处于竞争状态。本文将深入探讨它们在性能、安全性和用户体验方面的不同,并分析这些差异如何影响用户的选择。
51 3
|
2月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
61 5
|
3月前
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
49 1
|
3月前
|
Android开发
Android Studio: 解决Gradle sync failed 错误
本文介绍了解决Android Studio中出现的Gradle同步失败错误的步骤,包括从`gradle-wrapper.properties`文件中获取Gradle的下载链接,手动下载Gradle压缩包,并替换默认下载路径中的临时文件,然后重新触发Android Studio的"Try Again"来完成同步。
982 0
Android Studio: 解决Gradle sync failed 错误