-
-
Android 源码编译
-
发表于: 2023-5-3 22:18 7867
-
环境配置
环境 | 配置 |
---|---|
VMware | 16.1.1 build-17801498 |
Ubuntu | Ubuntu 20.04.2 LTS |
物理机内存 | 32G |
虚拟机内存 | 16G |
物理机储存 | 2T |
虚拟机内存 | 1T |
目标机型 | Pixel 4 |
目标版本 | Android 10 |
备注:内存建议最少16G,否则大概率编译失败,物理储存建议预留600G,笔者这边编译后就 300+,随便几个快照后就 500+
配置基本同步包
下载源码
1 2 3 | mkdir ~ / bin cd ~ / bin wget https: / / mirrors.ustc.edu.cn / aosp - monthly / aosp - latest.tar |
计算源码md5
1 | md5sum aosp - latest.tar |
访问网址检查源码md5
1 | https: / / mirrors.ustc.edu.cn / aosp - monthly / aosp - latest.tar.md5 |
解压源码
1 | tar - xvf aosp - latest.tar |
配置 git
安装git
1 | sudo apt - get install git |
配置 git 邮箱
1 | git config - - global user.email 211527456 @qq.com |
配置 git 用户名
1 | git config - - global user.name "lxz" |
配置 repo
把环境变量添加到 bashrc 中,在 linux 系统中,如果希望命令永久生效就需要写到 bashrc 中,因为每次重启系统会自动执行 bashrc 中的命令
1 | echo "PATH=~/bin:\$PATH" >> ~ / .bashrc |
如果我们不想重启系统,可以手动执行一下 bashrc
1 | source ~ / .bashrc |
安装 curl
1 | sudo apt - get install curl |
将 repo 下载到 ~/bin/repo
1 | curl - sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 - d > ~ / bin / repo |
设置可执行权限
1 | chmod a + x ~ / bin / repo |
导出一个临时环境变量,该环境变量关闭 shell 即失效
1 | export REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo' |
也可以直接设置个永久的
1 2 | echo "REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'" >> ~ / .bashrc source ~ / .bashrc |
配置 python
1 | sudo ln - s / usr / bin / python3. 8 / usr / bin / python |
执行 repo init,这遇到个大坑,建议拉取 android-10.0.0_r9 版本,之前拉取 r33 遇到一大堆问题
1 2 | cd ~ / bin / aosp / repo init - u git: / / mirrors.ustc.edu.cn / aosp / platform / manifest - b android - 10.0 . 0_r9 |
开始同步
1 | repo sync |
遇到报错
1 2 3 | error: Unable to fully sync the tree. error: Downloading network changes failed. Try re - running with "-j1 --fail-fast" to exit at the first error. |
1 | repo sync - j1 - - fail - fast |
安装 JDK
命令如下
1 2 3 | sudo add - apt - repository ppa:openjdk - r / ppa sudo apt - get update sudo apt - get install openjdk - 8 - jdk |
安装其他依赖
命令如下
1 | 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 libncurses5 |
执行驱动脚本
下载对应的驱动程序,相关链接在下方
1 2 | https: / / source.android.com / docs / setup / about / build - numbers?hl = zh_cn https: / / developers.google.com / android / drivers?hl = zh - cn #flameqq1c.191205.016.a1 |
拷贝下载的驱动文件到 ~/bin/aosp 目录下并解压
1 2 | tar - zxvf qcom - flame - qd1a. 190821.011 .c4 - 6f7c02a5 .tgz tar - zxvf google_devices - flame - qd1a. 190821.011 .c4 - bd22abf2.tgz |
执行解压出来的两个脚本, 需要注意到是回车到 8.e 左右,需要按照提示输入 I ACCEPT
1 | . / extract - qcom - flame.sh |
1 | . / extract - google_devices - flame.sh |
查看内核是否存在,源码下载完后最好看下里面有没有你手机对应的设备内核如果没有,需要另外下载或者编译,内核所在路径可以在下方链接的文档中找到对应表
1 | https: / / source.android.google.cn / setup / build / building - kernels #id-version |
配置 jvm 和 wasp
建议修改jvm和wasp的默认存储空间,否则编译时容易遇到报错
1 2 3 4 5 | FAILED: [W][ 2023 - 04 - 15T09 : 03 : 20 - 0700 ][ 75058 ] void cmdline::logParams(nsjconf_t * )(): 250 Process will be UID / EUID = 0 in the global user namespace, and will have user root - level access to files [W][ 2023 - 04 - 15T09 : 03 : 20 - 0700 ][ 75058 ] void cmdline::logParams(nsjconf_t * )(): 260 Process will be GID / EGID = 0 in the global user namespace, and will have group root - level access to files 11 : 34 : 07 ninja failed with: exit status 137 #### failed to build some targets (02:31:58 (hh:mm:ss)) #### |
配置 jvm
解决方案为打开 build/soong/java/config/config.go 文件,将 JavacHeapSize 改为虚拟机内存一半的大小
1 | sudo gedit ~ / bin / abuild / soong / java / config / config.go |
1 2 3 | / / 把 2048 修改为 4096 关闭当前编译Terminal窗口, / / 另新建一个Terminal窗口再编译即可,不需要删除out再编译 pctx.StaticVariable( "JavacHeapSize" , "2048M" ) |
配置 swap
查看当前 swap 空间
1 | free - h |
1 2 3 | total used free shared buff / cache available Mem: 15Gi 1.0Gi 13Gi 2.0Mi 1.2Gi 14Gi Swap: 2.0Gi 0B 2.0Gi |
关闭 swap 空间
1 | sudo swapoff / swapfile |
调整 swapfile 到 8GB
1 | sudo fallocate - l 8G / swapfile |
设置 swapfile 为 swap 空间
1 2 | sudo chmod 600 / swapfile sudo mkswap / swapfile |
启动 swap 空间
1 | sudo swapon / swapfile |
查看当前 swap 空间是否为 8G
1 | free - h |
1 2 3 | total used free shared buff / cache available Mem: 15Gi 1.0Gi 13Gi 2.0Mi 1.2Gi 14Gi Swap: 8.0Gi 0B 8.0Gi |
编译源码
清除之前编译的数据,在同一份源码中可以编译不同的机型,在编译不同机型是需要执行这个命令,编译相同机型则可以不执行此命令
1 | make clobber |
导出环境变量
1 | source build / envsetup.sh |
在导出环境变量后我们可以使用 lunch 命令查看当前可编译的选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | root@ubuntu:~ / bin / aosp # lunch You're building on Linux Lunch menu... pick a combo: [W][ 2023 - 04 - 15T08 : 15 : 15 - 0700 ][ 12673 ] void cmdline::logParams(nsjconf_t * )(): 250 Process will be UID / EUID = 0 in the global user namespace, and will have user root - level access to files [W][ 2023 - 04 - 15T08 : 15 : 15 - 0700 ][ 12673 ] void cmdline::logParams(nsjconf_t * )(): 260 Process will be GID / EGID = 0 in the global user namespace, and will have group root - level access to files 1. aosp_arm - eng 2. aosp_arm64 - eng 3. aosp_blueline - userdebug 4. aosp_bonito - userdebug 5. aosp_car_arm - userdebug 6. aosp_car_arm64 - userdebug 7. aosp_car_x86 - userdebug 8. aosp_car_x86_64 - userdebug 9. aosp_cf_arm64_phone - userdebug 10. aosp_cf_x86_64_phone - userdebug 11. aosp_cf_x86_auto - userdebug 12. aosp_cf_x86_phone - userdebug 13. aosp_cf_x86_tv - userdebug 14. aosp_coral - userdebug 15. aosp_crosshatch - userdebug 16. aosp_flame - userdebug 17. aosp_marlin - userdebug 18. aosp_sailfish - userdebug 19. aosp_sargo - userdebug 20. aosp_taimen - userdebug 21. aosp_walleye - userdebug 22. aosp_walleye_test - userdebug 23. aosp_x86 - eng 24. aosp_x86_64 - eng 25. beagle_x15 - userdebug 26. car_x86_64 - userdebug 27. fuchsia_arm64 - eng 28. fuchsia_x86_64 - eng 29. hikey - userdebug 30. hikey64_only - userdebug 31. hikey960 - userdebug 32. hikey960_tv - userdebug 33. hikey_tv - userdebug 34. m_e_arm - userdebug 35. mini_emulator_arm64 - userdebug 36. mini_emulator_x86 - userdebug 37. mini_emulator_x86_64 - userdebug 38. poplar - eng 39. poplar - user 40. poplar - userdebug 41. qemu_trusty_arm64 - userdebug 42. uml - userdebug Which would you like? [aosp_arm - eng] |
此时我们发现没有 eng 的版本,所以这里还需要手动修改配置文件,路径为 /aosp/device/google/coral/AndroidProducts.mk,注意这里的 flame 是谷歌手机的甜品标识,可能不是你所使用手机的标识,因为一个映像是可以对应多个手机的,所以得多找找,这里添加两个选项
1 2 3 4 5 | COMMON_LUNCH_CHOICES : = \ aosp_coral - userdebug \ aosp_flame - userdebug \ aosp_flame - eng \ aosp_flame - user \ |
回到 aosp 目录,重新导出环境变量
1 | source build / envsetup.sh |
再次执行 lunch 命令,可以发现
1 | make - j16 |
1 2 | 09 : 01 : 59 ninja failed with: exit status 1 make: * * * [build / make / core / main.mk: 21 : run_soong_ui] Error 1 |
1 | export LC_ALL = C |
刷机
linux 下刷机
安装adb
1 2 3 | sudo su apt - get install android - tools - adb apt install fastboot |
ununtu 中的 platform-tools 版本比较低,此时刷机会报错,所以此时我们需要更新 platform-tools,具体方法是到下载最新的 platform-tools,解压到共享文件夹中(我这里是共享文件夹,也可以从别的地方拷贝),然后进入ubuntu 进入管理员模式执行下方命令,将 platform-tools 拷贝到 /usr/lib/android-sdk 目录下即可
1 | cp - r / mnt / hgfs / share / platform - tools / usr / lib / android - sdk |
设置临时环境变量
1 | export ANDROID_PRODUCT_OUT = / home / lxz / bin / aosp / out / target / product / flame |
也可以把这个环境变量直接设置成永久的
1 2 | echo "ANDROID_PRODUCT_OUT=/home/lxz/bin/aosp/out/target/product/flame" >> ~ / .bashrc source ~ / .bashrc |
查看下是否设置成功
1 | echo $ANDROID_PRODUCT_OUT |
刷机
1 2 | adb reboot bootloader fastboot flashall - w |
windows下刷机
将桌面添加到环境变量
变量名:ANDROID_PRODUCT_OUT
变量值:C:\Users\Administrator\Desktop
将 ununtu /home/lxz/bin/aosp/out/target/product/flame 目录中 android.info.txt 以同目录中的所有 .img 文件全部拷贝到 windows 桌面,这里说一下,我的这个目录里当时没有 vendor.img,我当时有执行驱动脚本,按理说应该有的,所以我手动将 /home/lxz/bin/aosp/vendor/google_devices/coral/proprietary 中的 vendor.img 拷贝了出来,还有同目录下的 radio.img 和 bootloader.img 也一起拷贝出来,这俩好像是用不到,但先拷贝再说
这里在后续的测试发现 android-10.0.0_r33 才会出现上述的问题,之后在拉取 android-10.0.0_r9 时并没有上述问题,应该是版本的问题
使手机进入 fastboot 模式
1adb reboot bootloader
开始刷机
1fastboot flashall
-
w
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]Pixel6 降级记录 4061
- [原创]AndroidManifest 二进制解析笔记 13738
- [原创] Android 签名对抗攻略 15177
- Android10 内核编译笔记 16850
- Android 源码编译 7868