Android系统学习(一)------编译系统Android7.0

你好!这里是风筝的博客,

欢迎和我一起交流。


最近入手了一块nanopi m4,这块板子的芯片是rk3399,而且板子开放有源码,正好拿来学习安卓系统!

板子wiki:http://wiki.friendlyarm.com/wiki/index.php/NanoPi_M4/zh

从GitHub上下载了他的源码,给的是安卓7.0,他的编译脚本是build-nanopc-t4.sh文件,执行编译就好了,按照wiki教程,执行加-F -M选项,对应脚本里:

	while true; do
		case "$1" in
			-a ) BUILD_ANDROID=true;    shift 1;;
			-B ) BUILD_UBOOT=true;      shift 1;;
			-K ) BUILD_KERNEL=true;     shift 1;;
			-W ) BUILD_WIFI=true;       shift 1;;
			-F|--all)
				 BUILD_UBOOT=true;
				 BUILD_KERNEL=true;
				 BUILD_WIFI=true;
				 BUILD_ANDROID=true;
				 shift 1;;
			-M ) MAKE_RKDEV_IMG=true;   shift 1;;
			-u ) GEN_UPDATE_IMG=true;   shift 1;;

			-h ) usage; exit 1 ;;
			-- ) shift; break  ;;
			*  ) echo "invalid option $1"; usage; return 1 ;;
		esac
	done

说以-F是把UBOOT、KERNEL、WIFI、ANDROID都编译 一遍,然后-M对应的是MAKE_RKDEV_IMG,这个应该是把之前编译的东西都做成img文件。

我是在虚拟机里编译,ubuntu16.04,分了4G内存和120G硬盘,编译好后Android源码大概八十多 G大小,耗时八个多小时。

编译安卓7.0时候出现一个小错误,大概如下:

Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by [email protected])).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx'.
Warning: This may have produced partial or corrupted output.

这是因为安卓7是用jack编译的,“Jack server的安装和启动是在编译安卓系统后自动执行的,安卓编译的过程中会通过prebuild/sdk/tools目录中的jack-admin脚本来运行。”网上有很多答案,按照网上给的答案来弄:

修改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"

然后reboot重启虚拟机编译,发现不行,编译的时候卡在一个,卡住不动了,忘记截图了,然后网上找了好多文章都没有说,最后发现一个哥们和我一样的情况,他猜测说应该是4g(4096m太大了),毕竟我给虚拟机也是分配了4G内存,最后改成3G就好了,也就是改为:
sudo vi prebuilts/sdk/tools/jack-admin

JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx3g -cp $LAUNCHER_JAR $LAUNCHER_NAME"

这个大概在454行左右吧,改完后reboot重启虚拟机继续编译就好了,有时候他编译一个文件要好久,不要理它,期初我看它卡在 一个地方好久,我以为卡住了,等了半天,进度终于动了!
恕我直言,这个jack真难用,怪不得Google后来就抛弃了,而且在Android7.0里面我想禁止jack都不行,而且这玩意贼占内存,编译完了还不释放,alt+f2打开运行窗口,在里面输入gnome-system-monitor命令可以看到,占用内存非常大。
手动杀掉jack-server:./prebuilts/sdk/tools/jack-admin stop-server
启动时可以:./prebuilts/sdk/tools/jack-admin start-server
当然也可以查看已运行的Server:jack-admin list-server
关于jack可以看:Android下的Jack-Jill初探

最后编译完成后所有img文件都在rockdev/Image-nanopc_t4/ 子目录下。

nanopi m4要启动Android系统的话需要emmc,所有要先使用win32diskimager工具在电脑上把一个带eflasher的固件烧写到SD卡里,然后就可以把我们刚刚编译好的安卓源码里的img文件复制到SD卡里了。
Android系统学习(一)------编译系统Android7.0_第1张图片

把SD卡和emmc都插上,板子会自动从SD卡启动,就会运行SD卡里的eflasher工具,我们就可以操作eflasher工具把所有img文件写到emmc里,写完后掉电拔掉SD卡,再重新上电,就可以在屏幕看到启动了我们编译好的Android系统了!

参考:自己动手编译Android源码(超详细)
Android 7.0系统源码下载\编译

你可能感兴趣的:(Android,rk3399)