鸿蒙开发板EVB3568上的Android11启动时间优化:从源码修改到烧录测试全流程
鸿蒙开发板EVB3568上的Android11启动时间优化:从源码修改到烧录测试全流程
最近在捣鼓触觉智能的EVB3568开发板,这块板子核心是瑞芯微的RK3568,性能不错,但默认的Android 11系统开机时,那个“平板电脑正在启动”的提示界面总让人觉得启动过程慢了一拍。对于做产品预研或者追求极致体验的开发者来说,这几秒钟的等待时间,完全可以通过修改系统源码来“挤”出来。今天,我就把自己从定位代码、修改编译到最终烧录验证的全套实战经验分享出来,整个过程不涉及任何高深理论,就是一步步的手把手操作,适合那些想深入系统层、动手优化启动流程的硬件开发者和系统爱好者。
1. 理解Android启动流程与优化切入点
在动手修改代码之前,我们得先搞清楚Android系统从按下电源键到进入Launcher的整个旅程。这对于后续精准定位优化点至关重要。Android的启动过程大致可以分为几个阶段:Bootloader引导、Linux内核启动、Init进程初始化、Zygote孵化、SystemServer启动,最后才是各种系统服务和应用的启动。我们通常所说的“启动时间”,在用户感知层面,往往指的是从出现厂商Logo到进入主界面可操作的时间。
在Android 11上,系统为了提升用户体验,引入了一个名为 FallbackHome 的机制。当系统认为Home应用(比如Launcher)还没有准备好时,就会显示一个临时的占位界面,也就是我们看到的“平板电脑正在启动”的提示。这个设计的初衷是好的,避免用户面对黑屏或卡顿的尴尬。然而,在像EVB3568这样性能已经足够的硬件平台上,这个等待有时显得多余,尤其是当我们的Launcher启动速度本身已经优化得不错时,这个过渡界面反而成了拖累。
所以,我们的优化核心思路就很明确了:绕过或加速这个 FallbackHome 的显示过程。更直接一点,我们可以选择完全屏蔽它的显示,让系统在准备好后直接跳转到真正的Launcher。这样做能直接砍掉一段用户无意义的等待时间。
注意:修改系统级代码存在风险,务必在完全理解操作步骤并做好备份的前提下进行。建议首次操作时,在独立的开发环境或备用开发板上尝试。
2. 开发环境搭建与源码准备
工欲善其事,必先利其器。优化启动时间的第一步,是搭建一个可靠的Android源码编译环境。对于RK3568平台,触觉智能通常会提供完整的SDK开发包,里面包含了适配该开发板的内核、U-Boot以及Android系统源码。
2.1 硬件与软件环境清单
你需要准备以下资源:
- 硬件平台:触觉智能EVB3568开发板(基于RK3568)。RK3566平台的操作类似,但需确认源码适配性。
- 主机电脑:推荐使用Ubuntu 20.04 LTS或22.04 LTS操作系统。内存建议16GB以上,硬盘空间至少需要300GB(源码编译非常占用空间)。
- Android源码:从板卡供应商处获取针对EVB3568的Android 11 SDK源码包。
- 编译工具链:确保安装了必要的依赖包。可以通过以下命令快速安装(以Ubuntu为例):
sudo apt-get update
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3 openjdk-11-jdk
2.2 获取与同步源码
假设你已经从供应商处拿到了SDK压缩包,解压后进入源码根目录。首先,需要初始化编译环境:
source build/envsetup.sh
lunch
执行 lunch 后,会弹出一个菜单让你选择编译目标。对于EVB3568,你需要选择与 rk3568_r 相关的选项(例如 rk3568_r-userdebug)。userdebug版本带有root调试权限,更适合我们进行开发修改。
接下来,可以开始同步所有子仓库和预构建的二进制文件。这个过程耗时较长,取决于你的网速。
repo sync -c -j4
-j4 表示用4个线程同步,你可以根据自己CPU的核心数调整这个数字。
3. 定位与修改关键源码
环境准备好后,就进入最核心的代码修改环节。我们需要找到并修改负责显示“平板电脑正在启动”的Activity。
3.1 定位FallbackHome
在Android源码中,这个临时的占位界面由一个名为 FallbackHome 的Activity实现。它通常位于 packages/apps/Settings/ 目录下,因为从历史沿革看,这个功能被归类在设置相关的应用中。
使用你熟悉的代码编辑器或IDE(如VSCode、Android Studio)打开源码工程,导航至以下路径:
packages/apps/Settings/src/com/android/settings/FallbackHome.java
3.2 分析并实施修改
打开 FallbackHome.java 文件,我们需要关注其中的 mProgressTimeoutRunnable 这个Runnable对象。它的作用就是在超时后,执行显示启动进度界面的动画。
我们的目标是不显示这个界面。最干净利落的方式是注释掉整个界面初始化和动画启动的代码,同时保留其他必要的逻辑(比如保持屏幕常亮的标志,防止在启动过程中息屏)。
找到 mProgressTimeoutRunnable 的定义,通常它看起来像这样:
private final Runnable mProgressTimeoutRunnable = () -> {
View v = getLayoutInflater().inflate(
R.layout.fallback_home_finishing_boot, null /* root */);
setContentView(v);
v.setAlpha(0f);
v.animate()
.alpha(1f)
.setDuration(500)
.setInterpolator(AnimationUtils.loadInterpolator(
this, android.R.interpolator.fast_out_slow_in))
.start();
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
};
我们需要修改的,就是从创建View (inflate) 到启动动画 (start()) 之间的所有代码,只保留 getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 这一行。修改后的代码如下:
private final Runnable mProgressTimeoutRunnable = () -> {
// 注释掉界面初始化和动画代码,直接设置保持屏幕常亮
// View v = getLayoutInflater().inflate(
// R.layout.fallback_home_finishing_boot, null /* root */);
// setContentView(v);
// v.setAlpha(0f);
// v.animate()
// .alpha(1f)
// .setDuration(500)
// .setInterpolator(AnimationUtils.loadInterpolator(
// this, android.R.interpolator.fast_out_slow_in))
// .start();
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
};
修改要点解析:
- 多行注释:使用
/* */或//将不需要的代码块注释掉,而不是删除。这样便于未来需要时恢复。 - 保留关键标志:
FLAG_KEEP_SCREEN_ON标志非常重要,它确保在启动过程中屏幕不会因超时而熄灭。如果熄灭,反而会导致更糟糕的用户体验。 - 效果:经过这样修改后,
FallbackHomeActivity仍然会启动,但它不会再去加载和显示那个布局文件,也不会执行500毫秒的渐入动画。系统在后台继续准备Launcher,一旦Launcher就绪,便会立即跳转过去,中间没有了那个提示界面。
4. 编译与生成系统镜像
代码修改完成后,下一步就是将其编译进整个Android系统。RK3568平台的编译命令与标准AOSP略有不同,通常使用供应商提供的脚本或标准的 make 命令。
4.1 执行全量编译
在源码根目录下,执行编译命令。使用 -j 参数可以指定并行编译的作业数,这能极大缩短编译时间。这个数字通常设置为CPU核心数的1到2倍。
make -j12
如果你的电脑是8核16线程,使用 -j12 或 -j16 是比较高效的选择。编译过程会持续几十分钟到数小时,期间请保持电脑供电和网络稳定。
4.2 定位生成的镜像文件
编译成功后,我们需要的系统镜像文件会输出到 out/target/product/rk3568_r/ 目录下。对于启动优化,我们主要关心的是包含系统应用(如Settings)的镜像。
在Android 11及更高版本中,系统广泛使用了动态分区和 super 分区。我们修改的 Settings 应用被打包在 system 分区里,而 system 分区又是 super 镜像的一部分。因此,最终需要烧录的通常是 super.img 文件。
你可以在输出目录找到它:
out/target/product/rk3568_r/super.img
除了 super.img,同目录下还有 boot.img、vendor.img、dtbo.img 等。如果只是修改了应用层代码,通常只烧录 super.img 即可。但为了确保一致性,建议在首次验证时,根据供应商提供的烧录指南,决定是烧录单个镜像还是全套固件。
5. 烧录测试与效果验证
这是检验我们工作成果的最后一步,将编译好的镜像烧录到EVB3568开发板上,并实际测量启动时间的变化。
5.1 烧录镜像到开发板
触觉智能的RK3568开发板通常使用瑞芯微的 AndroidTool(Windows)或 upgrade_tool(Linux)进行烧录。这里以常见的操作为例:
- 连接开发板:使用Type-C数据线连接开发板的OTG口和电脑。
- 进入Loader模式:先按住开发板上的
Recovery键(或Maskrom键)不放,然后短按一下Reset键,最后松开Recovery键。此时,设备管理器应能识别到Rockusb Device。 - 执行烧录:
- Windows:打开
AndroidTool,选择编译生成的super.img等镜像文件,点击“执行”开始烧录。 - Linux:在终端运行命令,例如
sudo upgrade_tool ul super.img。
- Windows:打开
烧录完成后,开发板会自动重启。
5.2 启动时间测量与对比
如何科学地测量启动时间?这里有几个实用方法:
- 物理秒表:最原始但有效。从开发板完全断电后上电的那一刻开始计时,到屏幕出现Launcher主界面并且可以滑动操作时停止。多测几次取平均值。
- Logcat日志分析:通过
adb logcat抓取启动日志。在日志中搜索Displayed关键字,可以找到每个Activity从启动到显示完成所花费的时间。重点关注com.android.launcher3的显示时间。优化前后对比这个时间差。 - 系统跟踪(Systrace):这是更专业的方法。在编译时启用相关工具,可以生成详细的系统跟踪文件,可视化地看到启动过程中每个线程、每个CPU核的活动,精准定位瓶颈。
为了直观展示优化可能带来的变化,我们可以做一个简单的对比表格:
| 测试项 | 优化前(默认系统) | 优化后(修改代码) | 说明 |
|---|---|---|---|
| 上电到Logo显示 | ~2秒 | ~2秒 | 此阶段主要取决于Bootloader和内核,修改无影响。 |
| Logo到提示界面消失 | ~5秒 | ~0秒 | 提示界面被屏蔽,这段等待时间被消除。 |
| 提示界面消失到Launcher显示 | ~3秒 | ~3秒 | Launcher自身的加载时间,优化无直接影响。 |
| 用户感知总启动时间 | 约10秒 | 约5秒 | 优化效果显著,感知启动时间缩短约50%。 |
提示:实际缩短的秒数会因硬件性能、外设多少、系统负载等因素而有所不同。但屏蔽掉一个不必要的、带动画的界面,通常能带来数百毫秒到数秒的收益,这在追求快速开机的产品中是非常有价值的。
5.3 可能遇到的问题与排查
烧录新镜像后,如果遇到无法启动、卡Logo等问题,不要慌张,可以按以下思路排查:
- 检查编译目标:确认
lunch时选择的是正确的产品配置(rk3568_r)。 - 验证镜像完整性:尝试重新编译一次,或者只烧录
boot.img和super.img看是否正常。 - 查看内核日志:通过串口调试工具(如MobaXterm、PuTTY)连接开发板的UART调试口,查看内核启动阶段的打印信息,这里往往会有错误提示。
- 回退测试:重新烧录原始的、未修改的镜像,确认是否是硬件或其他配置问题。
修改 FallbackHome 本身风险较低,因为它不涉及核心系统服务。最坏的情况是修改有误导致该Activity崩溃,但系统通常会有其他机制保证最终能跳转到Launcher,只是体验可能不完美。
经过这一整套从源码修改到烧录验证的流程,你不仅成功优化了EVB3568开发板的Android 11启动时间,更重要的是,你掌握了深入Android系统层进行定制化修改的基本方法。这套方法论可以迁移到其他优化场景,比如精简预装应用、修改默认设置、调整系统动画速度等。下次当你觉得系统某个地方“不顺眼”或者“不够快”时,你就知道该从哪里入手去改变它了。
更多推荐
所有评论(0)