鸿蒙开发板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);
};

修改要点解析:

  1. 多行注释:使用 /* */ 或 // 将不需要的代码块注释掉,而不是删除。这样便于未来需要时恢复。
  2. 保留关键标志:FLAG_KEEP_SCREEN_ON 标志非常重要,它确保在启动过程中屏幕不会因超时而熄灭。如果熄灭,反而会导致更糟糕的用户体验。
  3. 效果:经过这样修改后,FallbackHome Activity仍然会启动,但它不会再去加载和显示那个布局文件,也不会执行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)进行烧录。这里以常见的操作为例:

  1. 连接开发板:使用Type-C数据线连接开发板的OTG口和电脑。
  2. 进入Loader模式:先按住开发板上的 Recovery 键(或 Maskrom 键)不放,然后短按一下 Reset 键,最后松开 Recovery 键。此时,设备管理器应能识别到 Rockusb Device。
  3. 执行烧录:
    • Windows:打开 AndroidTool,选择编译生成的 super.img 等镜像文件,点击“执行”开始烧录。
    • Linux:在终端运行命令,例如 sudo upgrade_tool ul super.img。

烧录完成后,开发板会自动重启。

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等问题,不要慌张,可以按以下思路排查:

  1. 检查编译目标:确认 lunch 时选择的是正确的产品配置(rk3568_r)。
  2. 验证镜像完整性:尝试重新编译一次,或者只烧录 boot.img 和 super.img 看是否正常。
  3. 查看内核日志:通过串口调试工具(如MobaXterm、PuTTY)连接开发板的UART调试口,查看内核启动阶段的打印信息,这里往往会有错误提示。
  4. 回退测试:重新烧录原始的、未修改的镜像,确认是否是硬件或其他配置问题。

修改 FallbackHome 本身风险较低,因为它不涉及核心系统服务。最坏的情况是修改有误导致该Activity崩溃,但系统通常会有其他机制保证最终能跳转到Launcher,只是体验可能不完美。

经过这一整套从源码修改到烧录验证的流程,你不仅成功优化了EVB3568开发板的Android 11启动时间,更重要的是,你掌握了深入Android系统层进行定制化修改的基本方法。这套方法论可以迁移到其他优化场景,比如精简预装应用、修改默认设置、调整系统动画速度等。下次当你觉得系统某个地方“不顺眼”或者“不够快”时,你就知道该从哪里入手去改变它了。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐