H6机顶盒Android编译[2]-Android编译

注意:本人也是第一次android编译,记录其过程为方便自己,同时给初学者提供参考,不正确之处还望包含指正!

前言

使用易新泰的H6机顶盒平台,搭载全志H6处理器,使用易新泰提供的SDK环境,使用ubuntu16.04.03 64位系统。
其系统编译分为linux内核编译和android编译,其SDK目录如下:
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)即可。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页