搭建环境
安装JDK 在Ubuntu上要安装OpenJDK,15.04版本以上安装方法:
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安装所需的软件包 (Ubuntu 18.04)
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
官方给的一堆,有了就行 。
搭建好环境后先初始化环境
在源代码根目录下执行:
source build/envsetup.sh
选择编译目标
lunch xxx
lunch不带参数会列出所有可选择的目标,然后输入对应的数字即可。如:
linux@ubuntu:~/android7.1/x3288_nougat$ lunch
You're building on Linux
Lunch menu... 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. mini_emulator_arm64-userdebug
8. m_e_arm-userdebug
9. m_e_mips64-eng
10. m_e_mips-userdebug
11. mini_emulator_x86_64-userdebug
12. mini_emulator_x86-userdebug
13. rk3288-user
14. rk3288-userdebug
15. rk3288_box-userdebug
16. rk3288_vr-userdebug
17. rk3288_vr-user
18. rk3288-eng
Which would you like? [aosp_arm-eng]
所有编译目标都采用 BUILD-BUILDTYPE
形式,其中 BUILD
是表示特定功能组合的代号。
BUILDTYPE 是以下类型之一:
编译类型 | 使用情况 |
---|---|
user | 权限受限;适用于生产环境 |
userdebug | 与“user”类似,但具有 root 权限和可调试性;是进行调试时的首选编译类型 |
eng | 具有额外调试工具的开发配置 |
注意:重新进终端 或者打开新的终端都要重新执行这些命令才能操作。
编译
编译整个系统
make -j8
详细说明:
droid - m droid 是正常 build。此目标在此处,因为默认目标需要名称。
all - m all 会构建 m droid 构建的所有内容,加上不包含 droid 标记的所有内容。构建服务器会运行此命令,以确保包含在树中且包含 Android.mk 文件的所有元素都会构建。
m 从源码树顶级目录向下编译源码,相当于执行make
mm 从当前目录向下编译源码
mmm 从指定目录向下编译源码,通常用来编译某个模块
croot - cd 到树顶部。
clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同。
make -jN ##GNU Make 可以借助 -jN 参数处理并行任务,通常使用的任务数 N 介于编译时所用计算机上硬件线程数的 1-2 倍之间。例如,在一台双核 E5520 计算机(2 个 CPU,每个 CPU 4 个内核,每个内核 2 个线程)上,要实现最快的编译速度,可以使用介于 make -j16 到 make -j32 之间的命令。
## 查看核心数 cat /proc/cpuinfo | grep processor
运行 m help 即可查看 m 提供的其他伪目标。
cgrep: Greps on all local C/C++ files.
jgrep: Greps on all local Java files.
resgrep: Greps on all local res/*.xml files.
godir: Go to the directory containing a file.
编译命令 | 说明 |
---|---|
make snod | 打包生成system.img,不检查依赖关系 |
make bootimage | 打包生成ramdisk.img |
单独编译的模块放入到文件系统中
由于权限问题,不能直接push到system目录下,可以先放到sdcard。
adb push 文件名(文件所在路径 ) 手机端SDCard路径
如:
adb push xxx.apk /sdcard/
之后进入adb shell,为system目录挂载权限
mount -o rw,remount /system
然后就可以cp到相应的目录下
cp 文件(文件所在路径) 目的路径
如:
cp sdcard/SettingsProvider.apk /system/priv-app/SettingsProvider/
方法二
adb root
adb remount
就可以直接push了。
清理
make clean
它会删除本次设置所生成的所有的output与中间文件。
等价于指令rm -rf $OUT
$OUT指的是out/target/product/[product_name]
make clobber
它会删除所有设置所生成的所有的output与中间文件。
等价于指令 rm -rf out/
make clobber的严格在于它把整个out目录都删除了。
遇到的错误
- cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))
_nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed
解决:
在Ubuntu18上使用交叉编译工具,报这个错。研究之下发现,工具的绝对路径过长,ubuntu18对其优化,修改路径,导致报错。
用 export LC_ALL=C 来去除所有本地化的设置,让命令能正确执行
[ 23% 4601/19885] Lex: ld.mc <= frameworks/compile/mclinker/lib/Script/ScriptScanner.ll
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/target/product/rk3288/obj/STATIC_LIBRARIES/libmcldScript_intermediates/ScriptScanner.cpp frameworks/compile/mclinker/lib/Script/ScriptScanner.ll"
flex-2.5.39: loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ???
Aborted (core dumped)
[ 23% 4601/19885] target thumb C++: libmcldLD <= frameworks/compile/mclinker/lib/LD/BranchIsland.cpp
ninja: build stopped: subcommand failed.
build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1
#### make failed to build some targets (12:29 (mm:ss)) ####
同上。为避免每忘记可以在build/envsetup.sh脚本中最后添加:
export LC_ALL=C
- Out of memory error(xxxxxxx) 内存溢出,使用java 选项 ‘-Xmx’.来增加堆大小。
修改Jack的配置文件prebuilts/sdk/tools/jack-admin
这是一个管理Jack的shell脚本,找到start-server函数,直接修改其启动参数,由原来的
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
更改为
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
此时Jack服务器仍然在后台执行,所以我们需要将其停止,然后重启启动(make会自动启动Jack服务器)才能使得修改后的参数生效。
我们执行下面的命令此时Jack服务器仍然在后台执行,所以我们需要将其停止,然后重启启动(make会自动启动Jack服务器)才能使得修改后的参数生效。
我们执行下面的命令:
#先停止服务
./prebuilts/sdk/tools/jack-admin stop-server
#重新开始服务
./prebuilts/sdk/tools/jack-admin start-server