基于Ubuntu24.04,下载并编译Android12系统源码 (二)

打印 上一主题 下一主题

主题 1017|帖子 1017|积分 3051

1. 前言

上篇文章,我们基于Ubuntu24.04,已经成功下载下来了Android12的源码,这篇文章我们会接着上文,基于Ubuntu24.04来编译Android源码。
2. 编译源码

2.1 了解源码编译的名词



  • Makefile : Android平台的一个编译系统,其实就是用Makefile写出来的一个独立的项目,定义了编译的规则,实现了自动化编译。不但要把分散在数百个git库中的代码整合起来,统一编译,而且把产物分门别类地输出到一个目录。打包成手机的Room,还可以生成应用开辟时所使用的SDK,NDK等等,因此采取Makefile编写的编译系统, 也可以称之为Makefile编译系统。
  • Android.mk : 是Makefile编译系统的一部门,Android.mk是Android编译情况下的一个特别的makefile文件,他是经过Android编译系统处理的,Android.mk中定义了一个模块必要的参数,使模块随着平台编译。通俗来讲,就是告诉编译系统,以什么样的规则编译源代码,并生成对应的目的文件。
  • Ninja : 致力于速率的小型编译系统,假如把其他编译系统看做是高级编程语言,那么Ninja就是汇编,使用Ninja的主要目的就是由于其编译速率非常快。
  • Soong : 谷歌用来替代Makefile编译系统,负责解析Android.bp文件,并将其转化为Ninja文件。
  • Blueprint : 用来解析Android.bp文件,翻译成Ninja语法的一个文件
  • kati : google专门为Android开辟的一个小型的项目,基于Golang和C++,目的是把Android.makefile转化为Ninja文件。
  • Android.bp : 用来替换Android.mk的一个配置文件
2.1.1 Android.mk / Ninja / Soong / Blueprint / kati /Android.bp 的概念之间的联系


2.2 准备编译情况

使用build目录中的envsetup.sh脚本来初始化情况,这个脚本会引入其他的一些执行脚本。
  1. source build/envsetup.sh
复制代码
完成初始化情况的一个操纵
  1. make clobber
复制代码
选择编译的目的,是envsetup.sh中定义的一个命令,用来让用户选择编译的目的
  1. lunch
复制代码
比如会表现出,这些可选的编译项
  1. You're building on Linux
  2. Lunch menu... pick a combo:
  3.      1. aosp_arm-eng
  4.      2. aosp_arm64-eng
  5.      3. aosp_blueline-userdebug
  6.      4. aosp_blueline_car-userdebug
  7.      5. aosp_bonito-userdebug
  8.      6. aosp_bonito_car-userdebug
  9.      7. aosp_car_arm-userdebug
  10.      8. aosp_car_arm64-userdebug
  11.      9. aosp_car_x86-userdebug
  12.      10. aosp_car_x86_64-userdebug
  13.      11. aosp_cf_arm64_auto-userdebug
  14.      12. aosp_cf_arm64_phone-userdebug
  15.      13. aosp_cf_x86_64_phone-userdebug
  16.      14. aosp_cf_x86_auto-userdebug
  17.      15. aosp_cf_x86_phone-userdebug
  18.      16. aosp_cf_x86_tv-userdebug
  19.      17. aosp_coral-userdebug
  20.      18. aosp_coral_car-userdebug
  21.      19. aosp_crosshatch-userdebug
  22.      20. aosp_crosshatch_car-userdebug
  23.      21. aosp_flame-userdebug
  24.      22. aosp_flame_car-userdebug
  25.      23. aosp_sargo-userdebug
  26.      24. aosp_sunfish-userdebug
  27.      25. aosp_taimen-userdebug
  28.      26. aosp_trout_arm64-userdebug
  29.      27. aosp_trout_x86-userdebug
  30.      28. aosp_walleye-userdebug
  31.      29. aosp_walleye_test-userdebug
  32.      30. aosp_x86-eng
  33.      31. aosp_x86_64-eng
  34.      32. arm_krait-eng
  35.      33. arm_v7_v8-eng
  36.      34. armv8-eng
  37.      35. armv8_kryo385-eng
  38.      36. beagle_x15-userdebug
  39.      37. beagle_x15_auto-userdebug
  40.      38. car_x86_64-userdebug
  41.      39. db845c-userdebug
  42.      40. fuchsia_arm64-eng
  43.      41. fuchsia_x86_64-eng
  44.      42. hikey-userdebug
  45.      43. hikey64_only-userdebug
  46.      44. hikey960-userdebug
  47.      45. hikey960_tv-userdebug
  48.      46. hikey_tv-userdebug
  49.      47. pixel3_mainline-userdebug
  50.      48. poplar-eng
  51.      49. poplar-user
  52.      50. poplar-userdebug
  53.      51. qemu_trusty_arm64-userdebug
  54.      52. silvermont-eng
  55.      53. uml-userdebug
  56.      54. yukawa-userdebug
  57.      55. yukawa_sei510-userdebug
复制代码
这里选项名称的含义


  • build : 表现编译出的镜像,可以运行在什么情况
  • aosp : 代表Android的一个开源项目
  • arm/x86等 : 表现运行在ARM/X86处理器的架构上
BUILDTYPE 指的是编译类型,有以下三种:


  • user : 用来正式发布到市场的版本,权限受限,如没有root权限,不能 dedug,adb默认处于停用状态。
  • userdebug : 在user版本的基础上开放了root权限和debug权限,adb默认处于启用状态。一般用于调试真机。
  • eng :开辟工程师的版本,拥有最大的权限(root等),具有额外调试工具的开辟配置。一般用于模拟器。
这里我们要运行在模拟器上,所以可以选30
2.3 举行编译

然后举行编译
  1. make -j 6
复制代码
  假如装备的内存不敷或性能不敷,同时执行的任务数,即-j可以设置的小一下,比如设置为1或2,只不过编译的时间会变久。
  最终会在 out/target/product/generic_x86/日录生成了三个重要的镜像文件:system.img、userdata.img、ramdisk.img。


  • system.img:系统镜像,里面包罗了Android系统主要的目录和文件,通过init.c举行解析并mount挂载到/system目录下。
  • userdata.img:用户镜像,是Android系统中存放用户数据的通过init.c举行解析并mount挂载到/data目录下。
  • ramdisk.img:根文件系统镜像,包罗一些启动Android系统的重要文件,比如init.rc。
表现出如下信息,就表明编译成功了 : Build completed successfully

2.4 运行假造机

编译完成后,执行emulator
命令运行假造机
  1. emulator
复制代码

   遇到的问题 : ubuntu emulator
第一次启动起来了,第二次却提示找不到命令
办理办法 : ubuntu 打开Android模拟器(Android源码编译)提示:emulator
:未找到命令
  3. 单编

mm指的是只编译当前目录的模块,不编译所有模块。
当我们只修改了指定目录下的模块时,就可以使用这个命令,从而加快编译速率。
3.1 进入指定目录,执行mm命令

  1. //进入指定目录
  2. cd packages/apps/settings
  3. //执行mm命令
  4. mm
复制代码

3.2 编译成功

表现出如下信息,就表明编译成功了 : Build completed successfully

除了Settings.odex文件,还会在out/target/product/generic_x86/system/priv-app/Settings日录下生生成Settings.apk
3.3 其他单编命令

此外另有以下命令可以举行单编 :


  • mmm : 编译指定目录下的模块,不编译它所依赖的其它模块。
  • mma : 编译当前目录下的模块及其依赖项。
  • mmma : 编译指定路径下所有模块,并且包罗依赖,
3.4 单编完成后,怎么查看效果 ?



  • 方式一 : 可以在编译完成后,借助 adb install -r apk 路径直接将⽣成的 apk ⽂件安装到装备上,假如不是 APK,直接 push 对应的⽂件。
  • 方式二 : 可以编译好完成后,再使⽤ make systemimage ,重新⽣成 system.img,再运⾏模拟器也可。
   详见 : 单编完成后,怎么查看效果 ?
  3.4.1 怎样查找文件

查找文件 -> 编译产物 out/target/
  1. find <起始目录> -name <文件名>
复制代码
  比如可能位于 /out/target/product/generic_x86/system/system_ext/priv-app/Settings/Settings.apk
  3.5 单编表现成功后,运行安卓模拟器,并没有见效

可以带上参数-wipe-data
  1. emulator
  2. -wipe-data
复制代码
  详见 : Android源码单独编译某个模块
  4. 其他

4.1 工具

查看源码


  • Android Studio for Platform
  • 下载地址 : https://developer.android.google.cn/studio/platform?hl=en
4.2 repo 下载源码中途中断

使用git fetch命令:‌假如repo sync命令在下载过程中中断,‌可以实验进入.repo/projects/prebuild目录,‌并执行git fetch命令来继续同步未完成的源码。‌这种方法适用于在下载过程中遇到网络问题或其他缘故起因导致下载中断的情况。‌
4.3 参考

手把手教你编译和调试AOSP源码
带你玩转编译Android系统源码!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表