AOSP 源码整编单编

AOSP 源码下载》完成后,就可以开编了。

整编

整编,顾名思义就是编译整个 Android 源码,最终 out 目录会生成几个重要的镜像文件,其中有 system.img、userdata.img、ramdisk.img 等,这些是可以刷机的。

初始化编译环境

项目目录,打开终端,输入命令:

source build/envsetup.sh

选择编译目标

命令:

lunch

输出:

You're building on LinuxLunch menu... pick a combo:     1. aosp_arm-eng     2. aosp_arm64-eng     3. aosp_blueline-userdebug     4. aosp_car_arm-userdebug     5. aosp_car_arm64-userdebug     6. aosp_car_x86-userdebug     7. aosp_car_x86_64-userdebug     8. aosp_cf_x86_64_auto-userdebug     9. aosp_cf_x86_64_phone-userdebug     10. aosp_cf_x86_64_tablet-userdebug     11. aosp_cf_x86_64_tablet_3g-userdebug     12. aosp_cf_x86_64_tv-userdebug     13. aosp_cf_x86_64_wear-userdebug     14. aosp_cf_x86_auto-userdebug     15. aosp_cf_x86_phone-userdebug     16. aosp_cf_x86_tablet-userdebug     17. aosp_cf_x86_tablet_3g-userdebug     18. aosp_cf_x86_tv-userdebug     19. aosp_cf_x86_wear-userdebug     20. aosp_crosshatch-userdebug     21. aosp_marlin-userdebug     22. aosp_sailfish-userdebug     23. aosp_taimen-userdebug     24. aosp_walleye-userdebug     25. aosp_walleye_test-userdebug     26. aosp_x86-eng     27. aosp_x86_64-eng     28. beagle_x15-userdebug     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. uml-userdebugWhich would you like? [aosp_arm-eng] 26

编译目标格式说明

编译目标的格式:BUILD-BUILDTYPE,比如上面的 poplar-eng 的 BUILD 是 poplar,BUILDTYPE 是 eng.

什么是 BUILD

BUILD 指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境。其中 aosp(Android Open Source Project)代表 Android 开源项目;arm 表示系统是运行在 arm 架构的处理器上,arm64 则是指 64 位 arm 架构处理器,x86 则表示 x86 架构的处理器,更多设备代码和编译目标参考官方文档。

什么是 BUILDTYPE

BUILDTYPE 则指的是编译类型,通常有三种:

  • user:用来正式发布到市场的版本,权限受限,如没有 root 权限,不能 dedug 等。

  • userdebug:在user版本的基础上开放了 root 权限和 debug 权限。

  • eng:代表 engineer,开发工程师的版本,拥有最大的权限(root等),具有额外调试工具的开发配置。

如果没有谷歌手机设备,可以选择 arm 或者 x86,我选择了 aosp_x86-eng,编译完后运行模拟器看看,因此这里选择序号 26。

开始编译

通过 make 指令进行代码编译:

make -j8

其中 -jN 参数表示处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。

查看计算机上的核心数:

cat /proc/cpuinfo | grep processorprocessor    : 0processor    : 1processor    : 2processor    : 3

可看到创建的虚拟机 CPU 核心共有 4 个,那么要实现最快的编译速度,可以使用介于 make -j4 到 make -j8 之间的命令。

不出意外,当看到:#### build completed successfully (03:55:24 (hh:mm:ss)) ####就整编成功了。

运行模拟器

整编完,网上很多都是说直接运行命令:emulator,但是我报以下错误了:

emulator: WARNING: Couldn't find crash service executable /media/ubuntu/disk/Project/AOSP9/prebuilts/android-emulator/linux-x86_64/emulator64-crash-serviceemulator: WARNING: system partition size adjusted to match image file (1080 MB > 800 MB)queryCoreProfileSupport: swap interval not foundfailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablefailed to create drawablegetGLES2ExtensionString: Could not make GLES 2.x context current!

第一个警告不管,第二个警告可以 emulator 加参数 -partition-size 2048解决,也可以不管,最后一个折腾了很久,可以加参数-gpu off,完整运行模拟器的命令:emulator -gpu off -partition-size 2048,这时应该又会报:

emulator: WARNING: Couldn't find crash service executable /media/ubuntu/disk/Project/AOSP9/prebuilts/android-emulator/linux-x86_64/emulator64-crash-serviceemulator: WARNING: system partition size adjusted to match image file (1338 MB > 800 MB)emulator: ERROR: Running multiple emulators with the same AVD is an experimental feature.Please use -read-only flag to enable this feature.

只能重启一下才能解决。

如果编译完成后启动模拟器时卡在黑屏,可以尝试编译其他的!

emulator 还有很多参数,可以用 emulator -help 查看,参数如下:

-sysdir <dir> 为模拟器在<dir>目录中搜索系统硬盘镜像-system <file> 为模拟器从<file>文件中读取初始化系统镜像-datadir <dir> 设置用户数据写入的目录-kernel <file> 为模拟器设置使用指定的模拟器内核-ramdisk <file> 设置内存RAM 镜像文件(默认为<system>/ramdisk.img)-image <file> 废弃,使用-system <file> 替代-init-data <file> 设置初始化数据镜像(默认为<system>/userdata.img)-initdata <file> 和"-init-data <file>"使用方法一致-data <file> 设置数据镜像(默认为<datadir>/userdata-qemu.img)-partition-size <size> system/data 分区容量大小(MB)-cache <file> 设置模拟器缓存分区镜像(默认为零时文件)-no-cache 禁用缓存分区-nocache 与"-no-cache"使用方法相同-sdcard <file> 指定模拟器SDCard 镜像文件(默认为<system>/sdcard.img)-wipe-data 清除并重置用户数据镜像(从initdata 拷贝)-avd <name> 指定模拟器使用Android 虚拟设备-skindir <dir> 设置模拟器皮肤在<dir>目录中搜索皮肤(默认为<system>/skins 目录)-skin <name> 选择使用给定的皮肤-no-skin 不适用任何模拟器皮肤-noskin 使用方法与"-no-skin"相同-memory <size> 物理RAM 内存大小(MB)-netspeed <speed> 设置最大网络下载、上传速度-netdelay <delay> 网络时延模拟-netfast 禁用网络形态-tarce <name> 代码配置可用-show-kernel 显示内核信息-shell 在当前终端中使用根Shell 命令-no-jni Dalvik 运行时禁用JNI 检测-nojni 使用方法与"-no-jni"相同-logcat <tag> 输出给定tag 的Logcat 信息-no-audio 禁用音频支持-noaudio 与"-no-audio"用法相同-audio <backend> 使用指定的音频backend-audio-in <backend> 使用指定的输入音频backend-audoi-out <backend> 使用指定的输出音频backend-raw-keys 禁用Unicode 键盘翻转图-radio 重定向无线模式接口到个性化设备-port <port> 设置控制台使用的TCP 端口-ports <consoleport>,<adbport> 设置控制台使用的TCP 端口和ADB 调试桥使用的TCP 端口-onion <image> 在屏幕上层使用覆盖PNG 图片-onion-alpha <%age> 指定上层皮肤半透明度-onion-rotation 0|1|2|3 指定上层皮肤旋转-scale <scale> 调节模拟器窗口尺寸(三种:1.0-3.0、dpi、auto)-dpi-device <dpi> 设置设备的resolution (dpi 单位) (默认165)-http-proxy <proxy> 通过一个HTTP 或HTTPS 代理来创建TCP 连接-timezone <timezone> 使用给定的时区,而不是主机默认的-dns-server <server> 在模拟系统上使用给定的DNS 服务-cpu-delay <cpudelay> 调节CUP 模拟-no-boot-anim 禁用动画来快速启动-no-window 禁用图形化窗口显示-version 显示模拟器版本号-report-console <socket> 向远程socket 报告控制台端口-gps <device> 重定向GPS 导航到个性化设备-keyset <name> 指定按键设置文件名-shell-serial <device> 根shell 的个性化设备-old-system 支持旧版本(pre 1.4)系统镜像-tcpdump <file> 把网络数据包捕获到文件中-bootchart <timeout> bootcharting 可用-qemu args.... 向qemu 传递参数-qemu -h 显示qemu 帮助-verbose 和"-debug-init"相同-debug <tags> 可用、禁用调试信息-debug-<tag> 使指定的调试信息可用-debug-no-<tag> 禁用指定的调试信息-help 打印出该帮助文档-help-<option> 打印出指定option 的帮助文档-help-disk-images 关于硬盘镜像帮助-help-keys 支持按钮捆绑(手机快捷键)-help-debug-tags 显示出-debug <tag>命令中的tag 可选值-help-char-devices 个性化设备说明-help-environment 环境变量-help-keyset-file 指定按键绑定设置文件-help-virtula-device 虚拟设备管理

补充

模拟器运行需要四个文件,分别是:

  • Linux Kernel

  • system.img

  • userdata.img

  • ramdisk.img

上面我 lunch 命令时选择的是 aosp_x86-eng,因此 linux 默认使用的 AOSP/prebuilds/qemu-kernel/x86/kernel-qemu 下的 kernel-qemu,而其他文件则是使用的 AOSP/out/target/product/generic_x86 目录下的 system.img、userdata.img、ramdisk.img。

单编

单编就是编译某个模块,比如 Setting,会在 out 目录对应的产品有 Settings.apk,例如:out/target/product/generic_x86/system/priv-app/Settings/Settings.apk,这是可以直接安装的。

1、source build/envsetup.sh

2、lunch

3、选择单编版本序号

4、编译

4.1、mmm

mmm packages/apps/Settings/

编译指定目录下的模块,但不编译它所依赖的其它模块。

4.2、mm

先进入目录:

cd packages/apps/Settings/

再编译

 mm

编译当前目录下的模块,它和 mmm 一样,不编译依赖模块。

4.3、mma

编译当前目录下的模块及其依赖项。

4.4、mmma [module_path]

编译指定路径下所有模块,且包含依赖

4.5、make

make: 不带任何参数则是编译整个系统

make MediaProvider

单个模块编译,会把该模块及其依赖的其他模块一起编译,会搜索整个源代码来定位 MediaProvider 模块所使用的 Android.mk 文件,还要判断该模块依赖的其他模块是否有修改。

make snod

如果我们修改代码,想看效果,怎么办?

1、可以在编译完成后,借助 adb install -r apk路径直接将生成的 apk 文件安装到设备上。

2、可以编译好完成后,再使用make snod,重新生成 system.img,再运行模拟器也可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容