【安卓开发系列 -- 系统开发】编译 android 系统 (基于 AIO-3399C)

【安卓开发系列 -- 系统开发】编译 android 系统 (基于 AIO-3399C)

【1】开发环境简介

开发环境如下:

1. 主机,Win10;虚拟机,Ubuntu 16.04
2. 开发板,AIO-3399C 六核 AI 开发板
3. android 源码,android 7.1

【2】android 编译环境准备

1.1. 安装 OpenJDK 8
sudo apt-get install openjdk-8-jdk
1.2. 更新 JDK 环境变量
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export PATH=${CLASSPATH}:$PATH
注意,/usr/lib/jvm/java-8-openjdk-amd64export 为 JDK 默认安装目录
1.3. 安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用
sudo update-alternatives --config java
sudo update-alternatives --config javac
切换 JDK 版本
1.4. 去除链接的方法
sudo /var/lib/dpkg/info/openjdk-8-jdk:amd64.prerm remove

2. Ubuntu 16.04 软件包安装
sudo apt-get install git-core gnupg flex bison gperf libsdl1.2-dev \
libesd0-dev libwxgtk3.0-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline6-dev gcc-multilib libswitch-perl \
libssl1.0.0 libssl-dev

3. 安装 ARM 交叉编译工具链和编译内核相关软件包
sudo apt-get install gcc-arm-linux-gnueabihf \
lzop libncurses5-dev \
libssl1.0.0 libssl-dev

【3】下载 Android SDK

RK3399 开发板配套的相关资源 : 在此下载

下载完成后,验证 MD5 码,解压,更新 Gitlab

验证一下 MD5 码
命令 : md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.001
结果 : afb279a7d2966908bcf53ce2c2c05edc  rk3399-firefly-industry-71-20190926.7z.001
命令 : md5sum /path/to/rk3399-firefly-industry-71-20190926.7z.002
结果 : 2bc5a41fd1056f1d1ab1f7e84f666bee  rk3399-firefly-industry-71-20190926.7z.002

解压
mkdir -p ~/proj/firefly-rk3399-Industry
cd ~/proj/firefly-rk3399-Industry
7z x /path/to/rk3399-firefly-industry-71-20190926.7z.001 -r -o.
git reset --hard


更新下远程仓库
1. 进入SDK根目录
cd ~/proj/firefly-rk3399-Industry  

2. 下载远程bundle仓库
git clone https://gitlab.com/TeeFirefly/rk3399-industry-nougat-bundle.git .bundle

3. 若下载仓库失败,目前bundle仓库大约1.4G左右,所以同步的时候可能会出现卡住或失败的问题,
可以从下方百度云链接下载并解压到SDK根目录,解压指令如下:

7z x rk3399-industry-nougat-bundle.7z  -r -o. && mv rk3399-industry-nougat-bundle/ .bundle/

4. 更新SDK,并且后续更新不需要再次拉取远程仓库,直接执行以下命令即可
.bundle/update

5. 按照提示已经更新内容到 FETCH_HEAD,同步FETCH_HEAD到firefly分支
git rebase FETCH_HEAD  

【4】编译 Android SDK

配置环境变量
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 
export PATH=$JAVA_HOME/bin:$PATH 
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

编译 kernel
cd ~/proj/firefly-rk3399-Industry/kernel/
make ARCH=arm64 firefly_defconfig
标准版:make -j8 ARCH=arm64 rk3399-firefly-aioc.img
AI  版:make -j8 ARCH=arm64 rk3399-firefly-aioc-ai.img


编译 uboot
cd ~/proj/firefly-rk3399-Industry/u-boot/
make rk3399_box_defconfig
make ARCHV=aarch64 -j8

编译 android
cd ~/proj/firefly-rk3399-Industry/
source build/envsetup.sh
标准版:lunch rk3399_firefly_aioc-userdebug
AI  版:lunch rk3399_firefly_aioc_ai-userdebug
make -j8 (-j8 可能会导致内存不足问题,可以减少并发编译的进程数)
./mkimage.sh

打包成统一固件 update.img
./FFTools/mkupdate/mkupdate.sh update

注意事项

1. 源码 external 路径下的相关源码在编译系统源码时可能没有包含,源码编译生成之后可以单独使用 mmm 命令编译相关模块,
编译完成会在 out\target\common\obj\JAVA_LIBRARIES 路径下生成相关库文件;

2. 源码 packages\apps 路径下包含系统预置的 APP 源码,编译系统时可能有些 APP 没有编译,
可以单独使用 mmm 命令编译相应的 APP,
编译完成将会在 out\target\product\{开发板对应的名称}\system\app 路径下生成相应的系统 APP 的 apk 文件;

问题总结

【问题 1】 Android cannot allocate memory

方法一 增大虚拟机内存,当宿主机的内存足够时,可以增大虚拟机内存设置

方法二 修改 swap :
1.创建swapfile文件
下面的代码是创建一个 1G 的 swapfile,如果想要 512M,将 bs 应该设置为 1024
sudo dd if=/dev/zero of=/swapfile bs=2048 count=524288
ls -lh /swapfile   //查看是否创建成功
2.设置交换区
sudo mkswap /swapfile
3.启动系统交换区
sudo swapon /swapfile

方法三 找到并打开 /prebuilts/sdk/tools/jack-admin
vim ./prebuilts/sdk/tools/jack-admin
JACK_SERVER_VM_ARGUMENTS="${JACK_SERVER_VM_ARGUMENTS:=-Dfile.encoding=UTF-8 - 
XX:+TieredCompilation -Xmx4g}" 
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR 
$JACK_SERVER_VM_ARGUMENTS -Xmx4096M -cp $LAUNCHER_JAR $LAUNCHER_NAME" 
:wq	(保存)
prebuilts/sdk/tools/jack-admin kill-server
prebuilts/sdk/tools/jack-admin start-server

参考与致谢
本博客为博主学习笔记,同时参考了网上众博主的博文以及相关专业书籍,在此表示感谢,本文若存在不足之处,请批评指正。

【1】RK3399编译android7.1系统的教程

【2】编译 Android7.1 Industry 固件

 

 

 

你可能感兴趣的:(安卓开发)