安卓源码编译

官方文档

搭建环境

安装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目录都删除了。

遇到的错误

  1. 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
  1. 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

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值