carloscn / blog

My blog
Apache License 2.0
119 stars 34 forks source link

[android] 01_Android_搭建Kernel开发环境 #198

Open carloscn opened 11 months ago

carloscn commented 11 months ago

1. 构建Android系统

1.1 源代码下载

因为国外地址可能访问不了或者访问速度慢,我们需要添加国内数据源:

sudo gedit /etc/apt/sources.list

把清华源复制到源列表,之前的源不要动

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

保存之后:

sudo apt-get update sudo apt-get upgrade

配置好国内的数据源之后,我们就可以开始源代码的下载了,网速要尽量快,因为AOSP的源代码光压缩包就有441G。

谷歌给的网站 https://source.android.com/docs/security/features/trusty/download-and-build?hl=zh-cn 的网络不好。我们可以使用清华镜像:

可访问 https://cs.android.comhttps://github.com/aosp-mirror 在线搜索及浏览 AOSP 源码。

参考 Google 教程 https://source.android.com/setup/build/downloading,https://android.googlesource.com/ 全部使用 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/ 代替即可。

由于 AOSP 镜像造成CPU/内存负载过重,限制了并发数量,因此建议:

mkdir ~/bin

PATH=~/bin:$PATH

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo

chmod a+x ~/bin/repo 或者使用tuna的git-repo镜像

使用每月更新的初始化包 由于首次同步需要下载约 60GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。

下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

使用方法如下:

curl -OC - https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包 tar xf aosp-latest.tar

cd AOSP # 解压得到的 AOSP 工程目录

这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录

repo sync # 正常同步一遍即可得到完整目录或 repo sync -l 仅checkout代码

此后,每次只需运行 repo sync 即可保持同步。 我们强烈建议您保持每天同步,并尽量选择凌晨等低峰时间

传统初始化方法 建立工作目录:

mkdir WORKING_DIRECTORY

cd WORKING_DIRECTORY 初始化仓库:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest 如果提示无法连接到 gerrit.googlesource.com,请参照git-repo的帮助页面的更新一节。

如果需要某个特定的 Android 版本(列表):

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-4.0.1_r1 同步源码树(以后只需执行这条命令来同步):

建立 AOSP 镜像需要占用约 850G 磁盘。

1.2 编译AOSP

Note, 根据一些教程提供的经验值可能需要编译6个小时以上,实际编译1~2个小时;

安装依赖库,AOSP编译需要依赖很多库,而这些Ubuntu系统可能没有自带,因此我们需要提前安装,避免编译到一半报错浪费时间。 参考: https://source.android.com/docs/setup/start/initializing?hl=zh-cn

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

初始化编译环境,执行编译命令:

source build/envsetup.sh

输入lunch

$ lunch

You're building on Linux

Lunch menu .. Here are the common combinations:
     1. aosp_arm-trunk_staging-eng
     2. aosp_arm64-trunk_staging-eng
     3. aosp_barbet-trunk_staging-userdebug
     4. aosp_bluejay-trunk_staging-userdebug
     5. aosp_bluejay_car-trunk_staging-userdebug
     6. aosp_bramble-trunk_staging-userdebug
     7. aosp_bramble_car-trunk_staging-userdebug
     8. aosp_cf_arm64_auto-trunk_staging-userdebug
     9. aosp_cf_arm64_phone-trunk_staging-userdebug
     10. aosp_cf_riscv64_phone-trunk_staging-userdebug
     11. aosp_cf_x86_64_auto-trunk_staging-userdebug
     12. aosp_cf_x86_64_auto_mdnd-trunk_staging-userdebug
     13. aosp_cf_x86_64_foldable-trunk_staging-userdebug
     14. aosp_cf_x86_64_only_phone_hsum-trunk_staging-userdebug
     15. aosp_cf_x86_64_pc-trunk_staging-userdebug
     16. aosp_cf_x86_64_phone-trunk_staging-userdebug
     17. aosp_cf_x86_64_tv-trunk_staging-userdebug
     18. aosp_cf_x86_phone-trunk_staging-userdebug
     19. aosp_cf_x86_tv-trunk_staging-userdebug
     20. aosp_cheetah-trunk_staging-userdebug
     21. aosp_cheetah_car-trunk_staging-userdebug
     22. aosp_cheetah_hwasan-trunk_staging-userdebug
     23. aosp_cloudripper-trunk_staging-userdebug
     24. aosp_coral-trunk_staging-userdebug
     25. aosp_coral_car-trunk_staging-userdebug
     26. aosp_felix-trunk_staging-userdebug
     27. aosp_flame-trunk_staging-userdebug
     28. aosp_flame_car-trunk_staging-userdebug
     29. aosp_lynx-trunk_staging-userdebug
     30. aosp_oriole-trunk_staging-userdebug
     31. aosp_oriole_car-trunk_staging-userdebug
     32. aosp_panther-trunk_staging-userdebug
     33. aosp_panther_car-trunk_staging-userdebug
     34. aosp_panther_hwasan-trunk_staging-userdebug
     35. aosp_raven-trunk_staging-userdebug
     36. aosp_raven_car-trunk_staging-userdebug
     37. aosp_ravenclaw-trunk_staging-userdebug
     38. aosp_redfin-trunk_staging-userdebug
     39. aosp_redfin_car-trunk_staging-userdebug
     40. aosp_redfin_vf-trunk_staging-userdebug
     41. aosp_slider-trunk_staging-userdebug
     42. aosp_sunfish-trunk_staging-userdebug
     43. aosp_sunfish_car-trunk_staging-userdebug
     44. aosp_tangorpro-trunk_staging-userdebug
     45. aosp_tangorpro_car-trunk_staging-userdebug
     46. aosp_trout_arm64-trunk_staging-userdebug
     47. aosp_trout_x86_64-trunk_staging-userdebug
     48. aosp_whitefin-trunk_staging-userdebug
     49. aosp_x86-trunk_staging-eng
     50. aosp_x86_64-trunk_staging-eng
     51. arm_krait-trunk_staging-eng
     52. arm_v7_v8-trunk_staging-eng
     53. armv8-trunk_staging-eng
     54. armv8_cortex_a55-trunk_staging-eng
     55. armv8_kryo385-trunk_staging-eng
     56. car_ui_portrait-trunk_staging-userdebug
     57. car_x86_64-trunk_staging-userdebug
     58. db845c-trunk_staging-userdebug
     59. gsi_car_arm64-trunk_staging-userdebug
     60. gsi_car_x86_64-trunk_staging-userdebug
     61. hikey-trunk_staging-userdebug
     62. hikey64_only-trunk_staging-userdebug
     63. hikey960-trunk_staging-userdebug
     64. hikey960_tv-trunk_staging-userdebug
     65. hikey_tv-trunk_staging-userdebug
     66. poplar-trunk_staging-eng
     67. poplar-trunk_staging-user
     68. poplar-trunk_staging-userdebug
     69. qemu_trusty_arm64-trunk_staging-userdebug
     70. rb5-trunk_staging-userdebug
     71. riscv64-trunk_staging-eng
     72. sdk_car_arm64-trunk_staging-userdebug
     73. sdk_car_md_x86_64-trunk_staging-userdebug
     74. sdk_car_portrait_x86_64-trunk_staging-userdebug
     75. sdk_car_x86_64-trunk_staging-userdebug
     76. silvermont-trunk_staging-eng
     77. uml-trunk_staging-userdebug
     78. yukawa-trunk_staging-userdebug
     79. yukawa_sei510-trunk_staging-userdebug

Which would you like? [aosp_arm-trunk_staging-eng]
Pick from common choices above (e.g. 13) or specify your own (e.g. aosp_barbet-eng): 

这里选择73 或者在运行lunch时候直接指定参数:

lunch 73 or lunch sdk_car_md_x86_64-trunk_staging-userdebug

https://source.android.com/docs/setup/build/building?hl=zh-cn#choose-a-target

使用 lunch 选择要构建的目标。lunch product_name-build_variant 会选择 product_name 作为需要构建的产品,并选择 build_variant 作为需要构建的变体,然后将这些选择存储在环境中,以便供后续对 m 和其他类似命令的调用读取:

构建类型 使用情况
user 权限受限;适用于生产环境
userdebug 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng 具有额外调试工具的开发配置

https://source.android.com/docs/setup/build/running?hl=zh-cn#selecting-device-build

如需查看当前的启动设置,请运行以下命令: echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"

使用 m 构建所有内容。m 可以使用 -jN 参数处理并行任务。如果您没有提供 -j 参数,构建系统会自动选择您认为最适合您系统的并行任务计数。

m

1.3 运行模拟器

在编译完成之后,就可以通过以下命令运行Android模拟器了,命令如下:

source build/envsetup.sh
lunch(选择刚才你设置的目标版本,比如这里我选择的是31)
emulator

如果你是在编译完后立刻运行模拟器,由于我们之前已经执行过source及lunch命令了,因此现在你只需要执行命令就可以运行模拟器:

emulator

这里如果你的虚拟机没有开启虚拟化功能,是不能直接跑模拟器的,会报错,这时,需要关闭虚拟机,配置虚拟化选项(例如VMWARE中的这个配置)。

如果启动不来或者模拟器黑屏可以打开kernel的启动log:

$ emulator -verbose -show-kernel -shell

terminal: