本文介绍Android的通用编译技巧。

手机厂商或者芯片平台可能都封装了编译脚本命令,但是基本都没有脱离Google的原始编译逻辑。Google在开发者网站对相关命令有介绍。

可以参考Google的官方文档 https://source.android.google.cn/setup/build/building

基础编译流程

对于AOSP源码来讲,通用的编译流程如下:

cd /home/tanfuhai/data/code/android
source build/envsetup.sh    # Add "lunch" (and other utilities and variables)
# to the shell environment.
lunch [-] # Choose the device to target.
m -j []              # Execute the configured build.

通用目标

在整个AOSP源码内部,编译通用格式:

make 目标

定义好了多个目标。通用的目标如下:

  • dist: 将编译目标构建之后,进行打包处理,服务器一般建议用此命令。
  • superimage: 构建超级固件。
  • systemimage: 构建系统固件。
  • vendorimage: 构建vender固件。
  • odmimage: 构建odm固件。
  • productimage: 构建产品固件。
  • clean: 类似于rm -rf out/
  • checkbuild Build every module defined in the source tree
  • droid :默认的Android目标
  • nothing 不构建任何东西,只需解析并验证构建结构
  • java 编译所有的java代码。
  • native Build all the native code in the source tree
  • host Build all the host code (not to be run on a device) in the source tree
  • target Build all the target code (to be run on the device) in the source tree
  • (java|native)-(host|target)
  • (host|target)-(java|native) Build the intersection of the two given arguments
  • snod:快速编译systemimage,不会进行依赖构建
  • vnod:快速编译vendorimage,不会进行依赖构建。
  • pnod: 快速编译productimage,不会进行依赖构建。
  • psnod: 快速编译productserviceimage,不会进行依赖构建。
  • onod: 快速编译odmimage,不会进行依赖构建。

如果make后面没有跟目标,默认目标是droid

常用编译目标

除了通用编译目标之外,实际工作中,可能针对不同的模块或者目标需要进行具体的指令变更。简单介绍常用的一些技巧:

修改framework相关

a. 如果当前的源码和手机内部版本一致,可以通过adb sync 分区来进行同步。

make framework-res framework services -j16 // 根据情况择优编译
adb sync system
adb shell am restart // 重启用户空间,修改的内容会生效。

b. 如果本地源码和手机版本不一致。

make installclean -j16 // 此步骤会删除out/target/product/XXX/下生成的相关安装文件。比如apk、bin等
make framework services -j16
adb sync system
adb shell am restart // 重启用户空间,修改的内容会生效。

如果不想删除当前产品生成的相关文件,可以通过adb push --sync 命令来同步文件到手机。

make framework services -j16
adb  push --sync out/target/product/jide_pro2_lte_r/system/framework/ /system/

执行过程中可以将所有命令写到一起,通过分号隔开。

注意:如果同步过程中提示空间不足,可以先执行 adb shell am restart ,然后在执行 adb sync + 分区。

修改了apk

make 模块名 -j16
make Launcher3QuickStep -j16
adb sync product
adb shell pm clear com.android.launcher3
或者adb shell am force-stop com.android.launcher3

修改kernel

make bootimage -j32
adb reboot bootloader
fastboot flash boot boot_image.img

修改selinux相关

  • Android O之前
make bootimage -j32
  • Android O之后 (Treble架构)

Treble架构的原因,Selinux被拆分到不同的分区。编译方式发生了变化:

make selinux_policy -j32

如果可以直接连接手机,执行:

adb sync

否则,将如下对应目录的所有文件push到手机对应的位置即可。

  • out/target/product/generic/odm/etc/selinux
  • out/target/product/generic/vendor/etc/selinux
  • out/target/product/generic/product/etc/selinux
  • out/target/product/generic/system/etc/selinux

更改了property属性

AOSP默认没有一个通用目标可以方便编译所有的*.prop文件。为了方便编译所有的目标, 需要给Makefile打上补丁。

diff --git a/core/Makefile b/core/Makefile
index 3f98ee400..ef3f406b2 100755
--- a/core/Makefile
+++ b/core/Makefile
@@ -679,6 +679,13 @@ endif.PHONY: package-statspackage-stats: $(PACKAGE_STATS_FILE)+
+BUILD_TO_PROP := \
+    $(sort $(filter $(TARGET_OUT)/% $(TARGET_OUT_DATA)/%, \
+       $(filter %.prop, $(ALL_DEFAULT_INSTALLED_MODULES))))
+.PHONY: buildprop
+buildprop: $(BUILD_TO_PROP)
+

然后执行:

make buildprop -j32
adb sync // 同步结果到手机

编译目标分区所有的apk和jar文件

make package-stats -j32
adb sync

Android 系统编译技巧相关推荐

  1. Android系统编译时集成三方APK

    1. 前言 最近在学习Android系统开发,在开发过程中可能要到将三方apk集成到系统中的需求.目前我了解的方法有两种. 一种是在系统编译完毕之后,再将三方apk文件放置到系统目录之下.参考如何将a ...

  2. Android系统编译aosp

    Android系统编译 公号文字版本:https://mp.weixin.qq.com/s/y6ReUNd3EDUctNVO_x3ZwQ 博客文字版本:http://liuwangshu.cn/bat ...

  3. Android系统编译小总结

    Android系统编译 简介 搭建编译环境 系统编译命令 常见小知识点 Android编译版本 Android.mk文件 编译系统中的变量和宏 native layer 编译碰到的问题 安装lib32 ...

  4. Android系统编译优化:使用Ninja加快编译

    背景 环境 关键编译阶段和耗时分析 阶段一:Soong bootstrap 阶段二:Kati遍历.mk搜集与ninja生成 阶段三:Ninja编译 编译优化 对比汇总 背景 Android系统模块代码 ...

  5. Android系统编译

    Android系统编译 先执行环境初始化: source build/envsetup.sh && lunch aosp-eng 再执行make 模块名,模块根据需求自选,例如: ma ...

  6. 全志A40i开发板Android系统编译

    Android系统编译 A40i &T3 板卡用户可以通过飞凌嵌入式提供的网盘链接获取OKA40i-C开发板软件和硬件的文档及源码.软件和硬件的文档及源码下载方法不清楚的可联系飞凌嵌入式客服索 ...

  7. android错误怎么关机,Android系统小技巧:系统崩溃了只重启部分子系统,而不是全部重启...

    我们的系统用着用着会自动重启,尤其是在拨号的时候极容易死机或者进入下载模式.根据高通的支持得到了一个解决方案. 在Android系统中,有这么一个文件夹:sys/bus/msm_subsys/devi ...

  8. Android 系统编译环境设置及源代码编译

    一. 摘要    虽然已经在Android系统工作了一段时间, 但是每次需要重新setup环境的时候,都需要花一点时间, 所以就想借着这次在ubuntu 12.04 64bits系统上重新安装的机会, ...

  9. 有用的博客整理(Android系统编译相关)

    //在Ubuntu18.04中Android Studio开发环境搭建 http://baijiahao.baidu.com/s?id=1604117887374452787&wfr=spid ...

最新文章

  1. 【Qt】通过QtCreator源码学习Qt(九):容器算法总结
  2. Java基础学习总结(28)——Java对各种排序算法的实现
  3. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(十六)利用PC端和移动端BUG
  4. 【easy】257. Binary Tree Paths 二叉树找到所有路径
  5. 22.循环控制.rs
  6. python 即时通讯_用python实现发送即时消息到twitter
  7. 15.用户故事与敏捷方法——Scrum与用户故事笔记
  8. Inside Dynamics Axapta源代码赏析(三)
  9. java设计模式-Observe
  10. python多次判断_python - 怎么判断函数或方法多次使用是否需要定义临时变量?
  11. vue:ali 阿里矢量图库 ico
  12. oppo手机android 版本号,OPPO R11有几个版本?OPPO R11各版本区别对比详细评测
  13. pyTorch常用工具包
  14. Django测试文件——tests.py
  15. 春风得意的 jQuery
  16. 【翻转直角三角形图案】
  17. IP地址、IPv4和IPv6的关系
  18. 杰理之触摸、触摸按键不开 机【篇】
  19. 灰度共生矩阵的原理及实现(特征提取)-OpenCV
  20. 国机精工,上柴股份,共创草坪,成交量异动检测

热门文章

  1. Windows系统中npm install时遇到npm WARN checkPermissions Missing write access to问题
  2. 2021-03-13 软件工程导论-自我简介
  3. BackTrack(bt5) GNOME汉化
  4. 计算机鼠标不出现在电脑屏幕上,电脑开机屏幕上看不到鼠标箭头?
  5. NOIP模拟17.10.12
  6. 关于抖音网红推广,你想知道的50个问题都在这里!
  7. 【子桓说】某大学毕业生:我很嫉妒月入10万的网红
  8. 关于USB中文网的近况
  9. matlab的死区环节,基于SIMULINK对非线性系统死区环节进行仿真.doc
  10. web程序设计(3)——使用CSS设计新闻网页