Android 如何在源码中添加 Product
1. 什么是 Product
在 App 的开发中,我们要去打渠道包,根据不同应用市场的要求打包出不同的 apk 包。
同样的道理,Android 的系统源码,经过简单的配置,可以打包出不同的系统镜像,用于不同的产品。例如rk3326_q,rk3566_t ,rk3568 均源于瑞芯微平台。
Android 系统源码是通过配置文件来实现 “分包” 的,配置文件将我们的源码配置为了不同的 Product,每一个 Product 适用于特定的硬件产品,这一系列的配置文件我们称为 Product。
2. AOSP 中预制的 Product
我们在编译源码之前需要执行 lunch :
lunch
You're building on Linux
Lunch menu... pick a combo:
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_coral_car-userdebug
16. aosp_crosshatch-userdebug
17. aosp_crosshatch_car-userdebug
18. aosp_flame-userdebug
19. aosp_marlin-userdebug
20. aosp_sailfish-userdebug
21. aosp_sargo-userdebug
22. aosp_taimen-userdebug
23. aosp_walleye-userdebug
24. aosp_walleye_test-userdebug
25. aosp_x86-eng
26. aosp_x86_64-eng
27. beagle_x15-userdebug
28. car_x86_64-userdebug
29. fuchsia_arm64-eng
30. fuchsia_x86_64-eng
31. hikey-userdebug
32. hikey64_only-userdebug
33. hikey960-userdebug
34. hikey960_tv-userdebug
35. hikey_tv-userdebug
36. m_e_arm-userdebug
37. mini_emulator_arm64-userdebug
38. mini_emulator_x86-userdebug
39. mini_emulator_x86_64-userdebug
40. poplar-eng
41. poplar-user
42. poplar-userdebug
43. qemu_trusty_arm64-userdebug
44. uml-userdebug
Which would you like? [aosp_arm-eng]
这里的每一个选项就是一个 Product, AOSP 预制了很多 Product。对应于 x86_64 模拟器,我们选择的是 aosp_x86_64-eng。
AOSP 中 Product 配置文件保存在以下两个目录:
- build/target:aosp 提供的 product 配置文件保存在这个目录下,我们选择的 aosp_x86_64-eng Product 就配置在这个目录下。
- device:芯片及方案厂商提供的 product 配置文件保存在这个目录下
先使用 tree 命令查看 build/target 基本的目录结构:
tree . -L 2
.
├── board
│ ├── Android.mk
│ ├── BoardConfigEmuCommon.mk
│ ├── BoardConfigGsiCommon.mk
│ ├── BoardConfigMainlineCommon.mk
│ ├── BoardConfigModuleCommon.mk
│ ├── BoardConfigPixelCommon.mk
│ ├── emulator_arm
│ ├── emulator_arm64
│ ├── emulator_x86
│ ├── emulator_x86_64
│ ├── emulator_x86_64_arm64
│ ├── emulator_x86_arm
│ ├── generic
│ ├── generic_64bitonly_x86_64
│ ├── generic_arm64
│ ├── generic_x86
│ ├── generic_x86_64
│ ├── generic_x86_64_arm64
│ ├── generic_x86_arm
│ ├── go_defaults_512.prop
│ ├── go_defaults_common.prop
│ ├── go_defaults.prop
│ ├── gsi_arm64
│ ├── gsi_system_ext.prop
│ ├── gsi_system_ext_user.prop
│ ├── mainline_arm64
│ ├── mainline_sdk
│ ├── mainline_x86
│ ├── mainline_x86_64
│ ├── mainline_x86_arm
│ ├── module_arm
│ ├── module_arm64
│ ├── module_x86
│ ├── module_x86_64
│ └── ndk
├── OWNERS
└── product
├── AndroidProducts.mk
├── aosp_64bitonly_x86_64.mk
├── aosp_arm64.mk
├── aosp_arm.mk
├── aosp_base.mk
├── aosp_base_telephony.mk
├── aosp_product.mk
├── aosp_x86_64.mk
├── aosp_x86_arm.mk
├── aosp_x86.mk
├── base.mk
├── base_product.mk
├── base_system_ext.mk
├── base_system.mk
├── base_vendor.mk
├── cfi-common.mk
├── core_64_bit.mk
├── core_64_bit_only.mk
├── core_minimal.mk
├── core_no_zygote.mk
├── default_art_config.mk
├── developer_gsi_keys.mk
├── empty-preloaded-classes
├── empty-profile
├── emulated_storage.mk
├── emulator.mk
├── emulator_system.mk
├── emulator_vendor.mk
├── full_base.mk
├── full_base_telephony.mk
├── full.mk
├── full_x86.mk
├── generic.mk
├── generic_no_telephony.mk
├── generic_ramdisk.mk
├── generic_system_arm64.mk
├── generic_system.mk
├── generic_system_x86_64.mk
├── generic_system_x86_arm.mk
├── generic_system_x86.mk
├── generic_x86.mk
├── go_defaults_512.mk
├── go_defau