AndroidAOSP基础(三)Android系统源码的整编和单编前⾔
在上⼀篇⽂章
中,我们顺利的将AOSP下载了下来,很多时候我们不仅仅需要去查看源码,还有以下的⼏个需求:
动态调试Android系统源码
定制Android系统
将最新版本的Android系统刷⼊到⾃⼰的Android设备中
将系统源码导⼊到Android Studio中
为了实现这些需求,就需要我们去编译系统源码。
1.编译系统概述
了解以下⼀些概念,会对Android编译系统有⼤概的了解。
Makefile
Android平台的编译系统,其实就是⽤Makefile写出来的⼀个独⽴项⽬。它定义了编译的规则,实现了“⾃动化编译”,不仅把分散在数百个Git库中的代码整合起来、统⼀编译, ⽽且还把产物分门别类地输出到⼀个⽬录,打包成⼿机ROM,还可以⽣成应⽤开发时所使⽤的SDK、NDK等。
因此,采⽤Makefile编写的编译系统,也可以称为Makefile编译系统。
Android.mk
Makefile编译系统的⼀部分,定义了⼀个模块的必要参数,使模块随着平台编译。通俗来讲就是告诉编译系统,以什么样的规则编译你的源代码,并⽣成对应的⽬标⽂件。
Ninja
Ninja是⼀个致⼒于速度的⼩型编译系统,如果把其他的编译系统看作⾼级语⾔,那么Ninja ⽬标就是汇编。
Soong
Soong是⾕歌⽤来替代此前的Makefile编译系统的替代品,负责解析Android.bp⽂件,并将之转换为Ninja⽂件
Blueprint
Blueprint⽤来解析Android.bp⽂件翻译成Ninja语法⽂件。
kati
kati是⾕歌专门为了Android⽽开发的⼀个⼩项⽬,基于Golang和C++。 ⽬的是把Android中的Makefile,转换成Ninja⽂件。
Android.bp
Android.bp,是⽤来替换Android.mk的配置⽂件。
Android.mk、Ninja、Soong、Blueprint、kati、Android.bp的概念之间的联系为:
Blueprint负责解析Android.bp⽂件内容,Blueprint类似⼀个处理相关语法的库⽂件,Soong则是定义具体如何处理相应的语法以及命令
实现。通俗来讲就是Soong借助于Blueprint定义的Android.bp语法,完成Android.bp的解析,最终转换成Ninja⽂件。
Makefile⽂件会通过kati转换为Ninja⽂件。
随着Android⼯程越来越⼤,采⽤Makefile的编译系统花费的时间也越来越长,因此⾕歌在Android 7.0开始引⼊了Ninja来编译系统,相
对于Makefile来说Ninja在⼤的项⽬管理中速度和并⾏⽅⾯有突出的优势。
Makefile默认⽂件名为Makefile或makefile,也常⽤.make或.mk作为⽂件后缀。 Ninja的默认⽂件名是build.ninja,其它⽂件以.ninja为后缀。Makefile与Ninja的区别在于, Makefile是设计来给开发编写的,⽽Ninja设计出来是给其它程序⽣成的。如果Makefile是Java语⾔,那么Ninja就是汇编语⾔。
2.编译源码的⽅式
Androd系统源码编译有很多种⽅式,主要有以下⼏种:
在Linux中直接进⾏系统源码编译(Android官⽅⽀持)
在Mac OS中直接进⾏系统源码编译(Android官⽅⽀持)
使⽤编译,⽀持Mac OS和Windows
其中需要注意的是,Docker的最低⽀持版本为Windows7,建议⽤Windows10环境下使⽤Docker,因为在Windows7种还需要借助Docker Toolbox和VirtualBox中的容器进⾏通信,效率相对低些。
考虑到⼤多数⼈的设备和上⼿难易程度,本为讲解在Linux中直接进⾏系统源码编译,如果你的系统不是Ubuntu,可以查看这篇⽂章。
3.准备编译环境
1.安装 jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
2.使⽤ ubuntu 14+,需要安装以下依赖包:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-co
3.设置处理器数量
在设置-->系统-->处理器选项,设置处理器数量,建议选择能设置的最⼤值,这⾥设置的是6。
4.源码整编
整编就是编译整个Android 源码,整编主要有三个步骤,下⾯分别就⾏介绍。
1.初始化环境
在AOSP的根⽬录,输⼊如下的命令:
source build/envsetup.sh
// 编译前删除build⽂件夹A
make clobber
android最新版使⽤ build⽬录中的envsetup.sh 脚本初始化环境,这个脚本会引⼊其他的执⾏脚本。
2. 选择编译⽬标
输⼊命令:
lunch
lunch命令是envsetup.sh⾥定义的⼀个命令,⽤来让⽤户选择编译⽬标。会有以下信息输出:
You're building on Linux
pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_mips-eng
4. aosp_mips64-eng
5. aosp_x86-eng
6. aosp_x86_64-eng
7. aosp_car_arm-userdebug
8. aosp_car_arm64-userdebug
9. aosp_car_x86-userdebug
10. aosp_car_x86_64-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. m_e_mips64-eng
14. m_e_mips-userdebug
15. mini_emulator_x86_64-userdebug
16. mini_emulator_x86-userdebug
17. uml-userdebug
18. aosp_cf_x86_auto-userdebug
19. aosp_cf_x86_phone-userdebug
20. aosp_cf_x86_tablet-userdebug
21. aosp_cf_x86_tablet_3g-userdebug
22. aosp_cf_x86_tv-userdebug
23. aosp_cf_x86_wear-userdebug
24. aosp_cf_x86_64_auto-userdebug
25. aosp_cf_x86_64_phone-userdebug
26. aosp_cf_x86_64_tablet-userdebug
27. aosp_cf_x86_64_tablet_3g-userdebug
28. aosp_cf_x86_64_tv-userdebug
29. aosp_cf_x86_64_wear-userdebug
30. cf_x86_auto-userdebug
31. cf_x86_phone-userdebug
32. cf_x86_tablet-userdebug
33. cf_x86_tablet_3g-userdebug
34. cf_x86_tv-userdebug
35. cf_x86_wear-userdebug
36. cf_x86_64_auto-userdebug
37. cf_x86_64_phone-userdebug
38. cf_x86_64_tablet-userdebug
39. cf_x86_64_tablet_3g-userdebug
40. cf_x86_64_tv-userdebug
41. cf_x86_64_wear-userdebug
42. aosp_marlin-userdebug
43. aosp_marlin_svelte-userdebug
44. aosp_sailfish-userdebug
45. aosp_walleye-userdebug
46. aosp_walleye_test-userdebug
47. aosp_taimen-userdebug
48. hikey-userdebug
49. hikey64_only-userdebug
50. hikey960-userdebug
Which would you like? [aosp_arm-eng]
意思就是要你选择编译⽬标的格式,编译⽬标的格式组成为BUILD-BUILDTYPE,⽐如aosp_arm-eng的BUILD为aosp_arm,BUILDTYPE 为eng。
其中BUILD表⽰编译出的镜像可以运⾏在什么环境,aosp代表Android开源项⽬,arm表⽰系统是运⾏在arm架构的处理器上。
更多参考。
BUILDTYPE 指的是编译类型,有以下三种:
user:⽤来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug,adb默认处于停⽤状态。
userdebug:在user版本的基础上开放了 root 权限和 debug 权限,adb默认处于启⽤状态。⼀般⽤于调试真机。
eng:开发⼯程师的版本,拥有最⼤的权限(root等),具有额外调试⼯具的开发配置。⼀般⽤于模拟器。
如果你没有Nexus设备,只想编译完后运⾏在模拟器查看,那么BUILD可以选择aosp_x86,BUILDTYPE选择eng,Which would you like? [aosp_arm-eng]后⾯直接输⼊对应序号5就可以。
也可以直接指定编译的⽬标:
lunch aosp_x86-eng
或者(不同的系统版本,序号的对应会有差别,建议不要直接⽤序号)
lunch 5
3. 开始编译
通过-jN参数来设置编译的并⾏任务数,以提⾼编译速度,在此前我的CPU核⼼数为6,这⾥N值最好选在6到12之间,这⾥我们设置6个并⾏任务进⾏编译:
make -j6
整编成功后会打印类似如下内容:
由于采⽤的是虚拟机整编,编译速度会慢⼀些,这⾥花费了2⼩时46分钟.
最终会在 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系统的重要⽂件,⽐如。
运⾏模拟器
在编译完成之后,就可以通过以下命令运⾏Android虚拟机了,命令如下:
source build/envsetup.sh
lunch 5
emulator
如果是在编译完后运⾏虚拟机,由于之前已经执⾏过source和lunch命令了,可以直接运⾏:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。