注意:本人也是第一次android编译,记录其过程为方便自己,同时给初学者提供参考,不正确之处还望包含指正!
前言
使用易新泰的H6机顶盒平台,搭载全志H6处理器,使用易新泰提供的SDK环境,使用ubuntu16.04.03 64位系统。
其系统编译分为linux内核编译和android编译,其SDK目录如下:
其中android是android编译目录,lichee是linux编译目录。
android编译
android目录结构:
out是编译后生成文件目录,其它是源码和编译工具目录。
通常,android编译只需要三个步骤:
$ source build/envsetup.sh
$ lunch petrel_fvd_p1-eng
$ make -j2
第一行命令“source build/envsetup.sh”引入了 build/envsetup.sh脚本。该脚本的作用是初始化编译环境,并引入一些辅助的 Shell 函数,这其中就包括第二步使用 lunch 函数。
第二行命令“lunch petrel_fvd_p1-eng”是调用 lunch 函数,并指定参数为“petrel_fvd_p1-eng”。lunch 函数的参数用来指定此次编译的目标设备以及编译类型。如果调用 lunch 函数的时候没有指定参数,那么该函数将输出列表以供选择,此时可以通过输入编号或者名称进行选择。
第三行命令“make -j2”才真正开始执行编译。make 的参数“-j”指定了同时编译的 Job 数量,这是个整数,该值通常是编译主机 CPU 支持的并发线程总数的 1 倍或 2 倍(例如:在一个 4 核,每个核支持两个线程的 CPU 上,可以使用 make -j8 或 make -j16),如果不清楚,可以不使用该参数,让系统自己调度就可以了。在调用 make 命令时,如果没有指定任何目标,则将使用默认的名称为“droid”目标,该目标会编译出完整的 Android 系统镜像。
但是H6机顶盒设备需要多加2个步骤,分别是拷贝之前编译的linux内核文件到android编译目录,以及打包镜像。
参考: [一叶梧桐]深入理解:Android 编译系统
H6机顶盒Android编译步骤:
$ source build/envsetup.sh
$ lunch petrel_fvd_p1-eng
$ extract-bsp
$ make
$ pack
其中,extract-bsp指令是拷贝linux内核及模块到android中;pack是打包生成固件,用于烧写板子。
make完成后提示如下图:
到此,android编译完成,剩下的就是打包了。
pack完成后提示如下图:
由此可知,打包生成的镜像路径为:
/mnt/ext_disk/h6/workdir/h6/sdk/lichee/tools/pack/sun50iw6p1_android_petrel-p1_uart0.img
其中/mnt/ext_disk/h6/workdir/h6/sdk是SDK路径。
此时就可以将sun50iw6p1_android_petrel-p1_uart0.img烧写如板子运行。
编译可能遇到的问题
JDK内存溢出的错误
Android 编译到中途时出现JDK内存溢出的错误:
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
Warning: This may have produced partial or corrupted output.
如下图所示:
错误日志里边列出了问题并且已经给出了解决方案 :增加Java虚拟机的-Xmx大小,即设置一个较大的堆内存上限。所以,解决办法是:
1) 修改Jack的配置文件
修改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 -Xmx3072m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
其中,3072m是修改后的内存大小,需要根据机器的实际内存大小设置,比如我的机器是4G内存,如果我设置为4096m,那么编译时机器直接会跑死,反而没办法编译,需要给机器本身留够内存,所以我设置的是3072m(我设置过2048m,同样会报相同的错误)。
2) 重启Jack
此时Jack服务器仍然在后台执行,所以我们需要将其停止,然后重新启动(make会自动启动Jack服务器)才能使得修改后的参数生效。
我们执行下面的命令:
#停止服务
./prebuilts/sdk/tools/jack-admin stop-server
#开始服务
./prebuilts/sdk/tools/jack-admin start-server
到此,JDK内存溢出的错误问题解决,再次编译(make)即可。