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

欢迎和我一起交流。


最近入手了一块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; docase "$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 ;;esacdone

说以-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 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.

这是因为安卓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卡里了。

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

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


后记:
我用的是ubuntu server,编译的时候会出现:ccninja: fatal: fork: Cannot allocate memory
这是因为swap交换分区不够了,解决办法:

1.创建交换分区的文件:增加3G大小的交换分区,其中的 count 等于想要的块大小。 dd if=/dev/zero of=/home/swapfile bs=3M count=3072
2.设置交换分区文件: mkswap /home/swapfile #建立swap的文件系统
3.立即启用交换分区文件: swapon /home/swapfile #启用swap文件
4.使系统开机时自启用,在文件/etc/fstab中添加一行: /home/swapfile swap swap defaults 0 0

如果编译出现“Communication error with Jack server (77), try ‘jack-diagnose’ or see Jack server log”
这是因为Jack环境下多个用户不能使用同一端口同时进行编译,因此应该分配一组单独的端口,以避免冲突。
分别修改 ~/.jack-settings 和 ~/.jack-server/config.properties 这两个配置文件,将其中的端口号改为自己的专属端口号(其实端口号可以任意填写,只要保证不与别人冲突即可)。
第一次编译没发现config.properties这个文件,再编一次之后就看到了。。。。
jack出错的log都可以通过查看文件 $HOME/.jack-server/logs/jack-server-0-0.log

Android系统学习(一)------编译系统Android7.0相关推荐

  1. Android 系统(42)---Android7.0 PowerManagerService亮灭屏分析(三)

    Android7.0 PowerManagerService亮灭屏分析(三) 在前面两部分已经对绘制windows与设置设备状态进行了详细讲解. 之后接着就该对亮度值进行设置, 实现亮屏动作了. 在D ...

  2. Android 系统(40)--Android7.0 PowerManagerService亮灭屏分析(一)

    Android7.0 PowerManagerService亮灭屏分析(一) 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏.在亮灭屏过程power中主要的实现 ...

  3. Android 系统(41)---Android7.0 PowerManagerService亮灭屏分析(二)

    Android7.0 PowerManagerService亮灭屏分析(二) 3029 在PowerManagerService中对各种状态进行判断后,将其数值封装进DisplayPowerReque ...

  4. Android踩坑日记:android7.0动态相机权限

    前提: 项目中使用的动态权限开源库github:https://github.com/yanzhenjie/AndPermission. 转载必须注明本文转自严振杰的博客:http://blog.cs ...

  5. Android系统学习(37)---Android知识点及资料汇总

    Android知识点及资料汇总 废话不多说,直接上总结: Android入门方法和经验之谈 如何自学 Android 编程? 如何零基础学习安卓开发? 我是如何自学,资料分享 一张Android学习的 ...

  6. Android系统学习(四)------关于init进程及开机自启动

    你好!这里是风筝的博客, 欢迎和我一起交流. 初入Android,本篇文章不过是拾人牙慧,见笑了~ init进程,它是内核启动的第一个用户级进程,进程号为1.它通过解析init.rc脚本来构建出系统的 ...

  7. android系统学习笔记十一

    Gps  (global   Position  System 全球定位系统)和定位部分 除此之外还有利用基站(cell)定位的AGPS等设备 定们系列统的基本架构 主要数据来源有两个: GPS定位和 ...

  8. flyme最新7基于android,魅族flyme6基于安卓android7.0吗?魅族flyme6.0有什么功能?[图]...

    魅族flyme6你更新了吗?很多朋友已经在使用了!不少朋友还在观望!还有疑问,魅族flyme6基于安卓android7.0吗?魅族flyme6.0有什么功能?先来了解清楚吧! 魅族flyme6基于安卓 ...

  9. Android系统发展历程:1.0到4.0及代表机型

    今天我们来聊一聊Android系统的历史,首先我们就要先来说说Android系统这个名字的来历.Android这一次最先出现在法国作家利尔亚当在1886年发飙的科幻小说<未来夏娃>中,作者 ...

最新文章

  1. 基于OpenCasCade的程序发布问题
  2. MyBatis的扩展点(plugins)
  3. ubuntu ssh如何连接mysql_ubuntu配置ssh连接方式
  4. [java]常用类型转化
  5. SAP MES(manufacturing execution system)介绍
  6. linux 桌面显示视频播放器,Ubuntu 13.10开启媒体播放器VLC桌面通知的步骤
  7. 《概率论与数理统计》(浙大第四版)第五章总结笔记(纯手写)
  8. 百度网盘免费jdk1.8中文chm下载(不要积分点个赞就好)
  9. 如何用云计算提高员工工作效率
  10. 原来CSS可以添加多个阴影
  11. 超详细IPONE越狱教程详解
  12. 简述用决策表设计测试用例的步骤_软件测试(14)--黑盒测试案例设计技术--基于决策表的测试...
  13. 网站服务器商标属于哪类,网络平台商标注册属于什么类别?-商标分类表-猪八戒知识产权...
  14. asp.net中引用System.Web.UI.DataVisualization.Charting命名空间
  15. matlab如何将函数做成幅度谱,好用的画包络谱和幅值谱matlab函数 | 学步园
  16. 基于SSM的音乐视频网站的设计与实现
  17. 综述论文翻译:A Review on Deep Learning Techniques Applied to Semantic Segmentation
  18. php mysql 别名_php和mysql的一些奇怪之处
  19. 遥感云大数据在灾害、水体与湿地领域及GPT模型应用
  20. Matlab上位机开发(五)Matlab串口通信

热门文章

  1. java jar包资源文件_深入jar包:从jar包中读取资源文件
  2. MySQL --- 函数大全 6
  3. Gauss quadrature approximation by Lanczos algorithm
  4. C++的strcmp
  5. 原生js之运动函数的封装
  6. 电容笔和触控笔哪个好?平板电脑好用电容笔推荐
  7. GOF23设计模式之桥接模式
  8. java redis实现抢购_【抢购/秒杀】redis实现高并发下的抢购/秒杀功能
  9. 四,产品创建和开发板连接天猫精灵后台
  10. markdown 高级复杂表格技巧