【Android AOSP实战】从源码到车载模拟器:Android14定制、应用预装与AVD镜像全流程解析

张开发
2026/4/17 0:09:44 15 分钟阅读

分享文章

【Android AOSP实战】从源码到车载模拟器:Android14定制、应用预装与AVD镜像全流程解析
1. Android14源码获取与环境搭建第一次接触AOSP源码的朋友可能会被庞大的代码库吓到但实际操作起来并没有想象中复杂。我去年为某车企定制车载系统时完整走过Android14的编译流程这里分享几个关键要点。源码下载推荐使用国内镜像站速度能提升5-10倍。清华镜像站是我最常用的选择具体操作如下repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest \ -b android-14.0.0_r54 --depth1 repo sync -c --no-tags repo start master --all这里有个小技巧--depth1参数可以大幅减少下载量只获取最新代码而非完整历史记录。对于车载系统开发来说这能节省至少50GB的磁盘空间。不过要注意如果需要查看历史提交记录就不能用这个参数了。编译环境配置是另一个容易踩坑的地方。建议使用Ubuntu 20.04 LTS系统内存至少16GB32GB更佳。我试过在16GB内存的机器上编译经常因为内存不足导致编译失败。关键依赖安装命令sudo apt-get install git-core gnupg flex bison build-essential zip curl \ zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 lib32ncurses5-dev \ lib32z1-dev libssl-dev libxml2-utils xsltproc unzip编译车载模拟器镜像时lunch命令的选择很关键。车载开发需要选择特定的targetsource build/envsetup.sh lunch sdk_car_x86_64-ap2a-userdebug make -j16这里的-j16参数要根据你的CPU核心数调整一般设置为逻辑处理器数的1.5倍效果最佳。我用的AMD 5950X16核32线程设置为24时编译速度最快整个过程大约需要2小时。2. 应用预装模块开发实战车载系统最特殊的需求就是预装应用。不同于手机应用商店车载应用需要深度集成到系统中。我在开发车载导航系统时总结出几个关键步骤。首先在AOSP源码树下创建预装应用目录结构vendor/rain/apps/SampleApp/ ├── Android.mk ├── Sample.apk └── libs/ └── arm64-v8a/ └── libnative.so这里有个细节如果应用包含JNI库必须将so文件按ABI分类存放。我遇到过因为so文件路径错误导致应用闪退的情况调试了整整一天才发现问题。Android.mk的编写是核心环节这个配置文件决定了应用如何被集成到系统中LOCAL_PATH: $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE : SampleApp LOCAL_MODULE_CLASS : APPS LOCAL_CERTIFICATE : platform LOCAL_MODULE_TAGS : optional LOCAL_DEX_PREOPT : true LOCAL_MODULE_PATH : $(TARGET_OUT_PRODUCT_APPS) LOCAL_SRC_FILES : ./Sample.apk LOCAL_MULTILIB : 64 JNI_LIBS : $(foreach FILE,$(shell find $(LOCAL_PATH)/libs/ -name *.so), \ $(eval JNI_LIBS $(FILE))) LOCAL_PREBUILT_JNI_LIBS : $(subst $(LOCAL_PATH),,$(JNI_LIBS)) include $(BUILD_PREBUILT)关键参数说明LOCAL_CERTIFICATE : platform表示使用系统签名LOCAL_DEX_PREOPT : true启用预优化提升启动速度LOCAL_MULTILIB : 64指定64位支持完成配置后需要在product配置中添加这个模块。编辑build/make/target/product/handheld_product.mk文件PRODUCT_PACKAGES \ SampleApp \这里有个经验之谈修改product配置前最好先备份我曾经因为配置错误导致整个系统无法启动不得不重新编译。3. AVD镜像编译与优化技巧Android14的AVD镜像编译命令有了新变化这也是我最近才发现的。与Android13之前的版本不同现在只需要一条命令make emu_img_zip这个命令会生成完整的车载模拟器镜像包输出路径在out/target/product/emulator_car64_x86_64/sdk-repo-linux-system-images.zip编译过程中可能会遇到磁盘空间不足的问题。我的解决方案是使用df -h监控磁盘使用情况设置TMPDIR环境变量指向大容量分区定期清理out/target/product/emulator_car64_x86_64/obj目录为了优化模拟器启动速度我通常会做这些调整在device/generic/car/common/products/car.mk中移除不必要的预装应用修改frameworks/base/core/res/res/values/config.xml中的配置参数调整system/core/rootdir/init.rc中的服务启动顺序实测下来经过优化的车载模拟器启动时间可以从原来的45秒缩短到20秒左右这对开发效率提升非常明显。4. 自定义AVD镜像的部署与使用编译好的镜像需要正确部署才能被Android Studio识别。我总结了一套标准化流程解压镜像到SDK目录unzip sdk-repo-linux-system-images.zip -d ~/Android/Sdk/system-images/android-car-34/x86_64配置package.xml文件关键步骤localPackage pathsystem-images;android-car-34;x86_64 obsoletefalse type-details xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:typens12:sysImgDetailsType api-level34/api-level base-extensiontrue/base-extension tag idgoogle_apis/id displayGoogle APIs/display /tag vendor idRain/id displayRains Demo Emulator, Android14, Car/display /vendor abix86_64/abi /type-details revision major13/major /revision display-nameGoogle APIs Intel x86_64 Atom System Image/display-name uses-license refandroid-sdk-arm-dbt-license/ /localPackageAndroid Studio中的配置技巧创建AVD时选择x86_64架构内存设置建议2048MB以上开启Use Host GPU选项提升图形性能在Advanced Settings中调整摄像头和传感器模拟参数我在实际项目中发现车载模拟器的横屏模式需要特殊配置。在config.ini中添加以下参数效果更好hw.lcd.width1920 hw.lcd.height720 hw.lcd.density160 skin.name1920x720 skin.path1920x7205. 车载特性开发与调试车载系统有一些独特的开发需求我在项目中积累了一些实用经验。首先是多显示屏支持。车载系统通常有中控屏和仪表盘两个显示区域需要在frameworks/base/services/core/java/com/android/server/wm/DisplayPolicy.java中修改显示策略// 设置主显示屏 mDefaultDisplayDefaultWidth 1920; mDefaultDisplayDefaultHeight 720; // 设置副显示屏 mSecondaryDisplayDefaultWidth 800; mSecondaryDisplayDefaultHeight 480;其次是车载特有的输入事件处理。在frameworks/base/services/core/java/com/android/server/input/InputManagerService.java中可以拦截和处理旋钮、方向盘按键等特殊输入设备的事件。调试车载音频系统时这个命令非常有用adb shell dumpsys audio它可以显示当前所有音频设备的连接状态和配置参数。我常用它来诊断蓝牙音频和FM收音机模块的问题。车载系统的电源管理也很特殊。修改frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java可以实现点火开关机逻辑低电压保护快速启动模式6. 性能优化与问题排查在车载环境下系统稳定性比手机要求更高。以下是我总结的几个关键优化点内存优化修改system/core/libmeminfo/libmeminfo.cpp调整内存回收策略在frameworks/base/core/jni/android_os_Debug.cpp中优化内存统计使用adb shell procrank监控进程内存占用启动速度优化adb shell setprop debug.sf.nobootanimation 1 adb shell setprop persist.sys.dalvik.vm.lib.2 libart.soCPU调度优化echo performance /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor常见问题排查命令# 查看系统日志 adb logcat -b all -v threadtime # 检查系统属性 adb shell getprop # 监控系统资源 adb shell top -m 10 -d 1 -n 5我遇到过一个典型问题模拟器启动后触摸屏无响应。解决方法是在内核配置中启用CONFIG_INPUT_EVDEVy选项并重新编译内核镜像。

更多文章