从零构建Android 12:AOSP源码编译实战与避坑指南
1. 环境准备搭建Ubuntu编译环境编译Android 12源码需要一台性能强劲的Linux机器我推荐使用Ubuntu 20.04 LTS版本。这个版本不仅长期支持而且对AOSP编译的兼容性最好。我的开发机是一台32核64GB内存的工作站配了1TB SSD。如果你用的是普通PC建议至少16GB内存和200GB可用磁盘空间。首先需要安装基础依赖包。这里有个坑不同Ubuntu版本需要的依赖包略有差异。对于Ubuntu 18.04及以上版本执行以下命令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 python特别注意Python版本问题。AOSP编译同时需要Python 2和Python 3环境但Ubuntu 20.04默认只带Python 3。我建议这样处理sudo apt-get install python2 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2这样可以通过update-alternatives --config python随时切换默认Python版本。编译时repo工具需要Python 3而部分构建脚本仍依赖Python 2这种配置最灵活。2. 配置Repo工具与源码同步Android源码使用Repo管理多个Git仓库。国内用户建议使用清华镜像加速下载mkdir ~/bin PATH~/bin:$PATH curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo chmod ax ~/bin/repo在~/.bashrc中添加以下环境变量export REPO_URLhttps://mirrors.tuna.tsinghua.edu.cn/git/git-repo/初始化代码仓库时我推荐使用特定版本分支而非主分支。Android 12.0.0_r47是个稳定版本mkdir android-12.0.0_r47 cd android-12.0.0_r47 repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-12.0.0_r47同步代码时-j参数不是越大越好。根据你的网络带宽合理设置一般4-8即可repo sync -j4同步过程可能耗时数小时。如果中断可以重复执行sync命令继续下载。我曾遇到同步失败的情况删除.repo/projects目录后重试解决了问题。3. 解决编译环境常见问题交换空间不足是最常见的编译失败原因。Android 12完整编译需要大量内存如果物理内存不足需要配置足够的swap空间sudo fallocate -l 20G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile将以下内容添加到/etc/fstab使配置永久生效/swapfile swap swap defaults 0 0Java环境配置也很关键。Android 12需要OpenJDK 8sudo apt-get install openjdk-8-jdk sudo update-alternatives --config java # 确保选择Java 8如果遇到unsupported reloc 43错误是因为某些工具链组件与高版本Glibc不兼容。解决方法export LD_LIBRARY_PATH4. 选择编译目标与开始构建初始化构建环境source build/envsetup.sh lunchlunch时会列出数十个编译目标。对于模拟器测试我推荐aosp_x86_64-eng标准x86_64模拟器sdk_phone_x86_64带Google Apps的模拟器如果列表中没有sdk_phone_x86_64需要修改build/make/target/product/AndroidProducts.mk添加sdk_phone_x86_64-eng \开始编译make -j$(nproc) 21 | tee build.log-j参数设置为CPU核心数最佳。建议将编译输出重定向到日志文件方便排查错误。常见编译错误处理ninja: build stopped: subcommand failed通常表示资源不足尝试减少-j参数值No space left on device需要清理磁盘空间至少保留200GB可用clang: error: unable to execute command: Killed内存不足增加swap空间5. 运行与测试编译结果编译成功后启动模拟器emulator -no-snapshot -no-audio -no-window-no参数可以加速启动。首次启动会比较慢因为要创建用户数据镜像。如果遇到Could not open userdata-qemu.img错误可能是因为编译目标选择不当。确保lunch时选择了带-eng后缀的目标。对于真机测试需要解锁bootloaderadb reboot bootloader fastboot flashing unlock fastboot flashall -w刷机前务必备份数据-w参数会擦除用户数据。我曾在Nexus 5X上测试时遇到基带不兼容的问题后来刷入对应版本的radio.img解决。6. 内核编译与定制AOSP默认使用预编译内核。如果需要自定义内核可以单独编译goldfish内核git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git cd goldfish git checkout origin/android-goldfish-4.14 make ARCHx86_64 x86_64_defconfig make ARCHx86_64 -j$(nproc)编译完成后替换out/target/product/generic_x86_64/kernel文件即可。我曾尝试优化内核参数结果导致模拟器启动失败所以修改内核配置时要谨慎。7. 高效开发技巧增量编译修改代码后只需执行m命令比完整make快很多模块编译使用mmm命令编译单个模块如mmm frameworks/base快速生成镜像make snod可以快速打包修改后的系统镜像代码搜索cgrep搜索C/C代码jgrep搜索Java代码resgrep搜索资源文件我习惯将常用命令存入~/.bashrcalias mmake -j$(nproc) alias mmmake -j$(nproc)8. 疑难问题解决方案问题1模拟器启动时报ERROR: x86 emulation requires hardware acceleration解决方法确认BIOS中已启用VT-x/AMD-V虚拟化安装KVMsudo apt-get install qemu-kvm sudo adduser $USER kvm启动时添加-accel参数emulator -accel kvm问题2adb devices列表为空可能原因没有正确配置USB调试缺少udev规则解决方法echo SUBSYSTEMusb, ATTR{idVendor}18d1, MODE0666 | sudo tee /etc/udev/rules.d/51-android.rules sudo udevadm control --reload-rules问题3编译时出现Python语法错误这是因为repo工具与Python版本不兼容。强制使用Python 3export REPO_PYTHON/usr/bin/python3经过三天的不懈努力我终于在自定义硬件上成功运行了编译的Android 12系统。最大的教训是一定要预留足够的磁盘空间我第一次编译就因为在85%时磁盘写满而前功尽弃。建议使用df -h命令定期检查磁盘使用情况。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2550040.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!