源码及编译
步骤 1:创建一个空目录来存放源码:
mkdir aosp
cd aosp
步骤 2:获取最新版本的 repo 并签出 android-8.1.0_r1 分支:
repo init -u https://android.googlesource.com/platform/manifest -b android-8.1.0_r1
其中,android-8.1.0_r1
代表源码标记,代表我们将要获取 Android 8.1 的源码,如需查看其他版本的源码标记,可参阅 源代码标记和 build。
步骤 3:将 Android 源码从默认清单中指定的代码库下载到本地工作目录:
repo sync
步骤 4:创建本地分支并关联 repo 上的所有仓库:
repo start ycx-dev --all
步骤 5:使用 envsetup.sh
脚本初始化编译环境:
source ./build/envsetup.sh
步骤 6:选择编译目标:
lunch aosp_arm64-eng
编译目标的格式说明:编译目标的格式是 BUILD-BUILDTYPE ,如 aosp_arm64-eng 这个目标,它的 BUILD 是 aosp_arm64,BUILDTYPE 是 eng 。
BUILD 指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境,例如 aosp_arm64-eng 中的 aosp(Android Open Source Project) 代表 Android 开源项目,arm 表示系统是运行在 arm 架构的处理器上的,arm64 则是指 64 位 arm 架构处理器
想查看 Android 设备的 cpu 架构,可以执行命令:adb shell getprop ro.product.cpu.abi
BUILDTYPE 指的是编译类型,通常有三种:
- user:表示编译出的系统镜像版本可以用来正式发布到市场,这个版本是不能 root 的
- userdebug:在 user 版本的基础上开放了 root 权限和 debug 权限
- eng:表示开发工程师版本,拥有 root 权限,此外还附带了许多 debug 工具
如果我们在终端输入 lunch 命令,将会列出所有的编译目标:
步骤 7:开始编译(设置8个线程同时编译):
m -j8
参与编译的线程并不是越多越好,通常是根据你机器 cup 的核心来确定,公式为:core * 2,即当前 cpu 的核心的 2 倍。
我们可以执行 cat /proc/cpuinfo| grep "cpu cores"| uniq
命令查看电脑 cpu 的核心数。
编译问题
错误 1:flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data
解决方法:在终端输入命令:export LC_ALL=C,然后重新编译即可。
错误 2:xmllint: command not found
解决方法:在终端输入命令:sudo apt-get install libxml2-utils,然后重新编译即可。
编译单模块并运行
例如,我们修改了 SystemUI 模块的代码,需要编译到机器上运行看看效果,那么可以这样,
步骤 1:在当前源码目录下执行编译命令:
make SystemUI
稍等片刻,就可以看见编译成功了:
步骤 2:获得系统写入权限:
adb root && adb remount
步骤 3:接下来把编译产物 push 到设备上即可:
adb push out/target/product/xxx/product/priv-app/SystemUI /system/product/priv-app/
步骤 4:重启设备上层:
adb shell stop && adb shell start
重启完毕后即可看到修改后的效果了。