目录... 1
1 简介... 1
2 环境搭建... 1
2.1 主机配置... 1
2.2 Ubuntu安装... 2
2.3 JDK安装... 3
2.4 其余包安装... 4
3 安装repo. 4
3.1 初始化repo客户端... 6
3.2 repo init 6
3.3 repo project完成工程... 7
3.4 重新执行repo init 8
3.5 repo sync. 9
4 正常下载... 12
5 下载中出现问题... 13
5.1问题1:... 14
5.2问题2:... 14
5.3问题3:... 15
5.4问题4:... 15
6 下载完成... 16
7 编译:... 18
7.1下载MALI 400(针对GPU)... 18
7.2 安装MALI 400. 18
7.3 编译Android源码... 18
7.4 编译出错... 19
7.4.1 错误1. 19
7.4.2 错误2. 20
7.4.3 错误3(可忽略)... 21
7.4.4 错误4. 21
7.4.5 错误5. 21
7.4.6 错误6. 22
7.4.7 错误7. 23
7.4.8 错误8. 25
7.4.9 错误9. 26
7.5 编译完成... 26
8 运行emulator. 28
本小弟由于项目需要,准备做一个XXX设备。采用平台方案为:ZYNQ(ZU9EG)+ Android。
本小弟接触过很多ZYNQ的平台,但是Android还从未接触过(除了安卓手机),哈哈哈。所以就上网查询各种资料,开始摸石头过河。
首先在Xilinx的官网去搜索ZYNQ跑Android系统发现内容基本没有,但是搜索到了一个关键的东东《Getting Started with Android 8 v2019.2 for Xilinx Zynq UltraScale MPSoC》然后就开始了搭建之路。
https://github.com/MentorEmbedded/mpsoc-manifest/wiki/Getting-Started-with-Android-8-v2019.2-for-Xilinx-Zynq-UltraScale--MPSoC
貌似Xilinx官方并没有做ZYNQ平台的Android适配,应该是西门子的几个大哥在做适配。
下载、安装Andorid对计算机的配置要求相对较高,可以省去很多恶心的问题:比如编译中:内存不足,硬盘空间不够。
我的电脑配置:
内存:16GB;
硬盘:1TB;(这个大于200G都可以)
图 1 系统版本
14.04.5 LTS镜像获取地址:
图 2 iso镜像
http://old-releases.ubuntu.com/releases/14.04.0/?_ga=2.83239126.1304170281.1628644245-1553457993.1616034659
具体安装过程大家肯定都会,就不BB了。
安装虚拟机的时候有两个大坑,提前跟你们说一下,不然后面会让你很恶心:
图 3虚拟机配置
采用sudo apt-get install openjdk-8-jdk自动安装失败,所以使用手动安装方式。
必须安装OpenJDK而不是JDK,不然后面Android源码编译会出现问题,我吃亏了,哈哈哈~
执行:
1. 添加openjdk8的第三方源
sudo add-apt-repository ppa:openjdk-r/ppa
2. 执行更新
apt-get update
3. 安装openjdk8
sudo apt-get install openjdk-8-jdk
4. 选择版本
sudo update-alternatives –config Java
5. 确认安装成功
java -version
图 4 java install
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip
sudo apt-get install dosfstools e2fsprogs parted
mkdir -p ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
执行命令curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo时一般会失败。
解决办法:
gedit /etc/hosts
在里面添加源:74.125.237.1 dl-ssl.google.com
图 5 添加dl-ssl
如果还是报错就多运行几次该命令:实在下载不下来,其实不下载也可以,因为后面用的是完整的repo project工程。哈哈~~~
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
图 6 curl成功
mkdir WORKING_DIRECTORY
cd WORKING_DIRECTORY
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
比如:
git config --global user.name "Wang Jin"
git config --global user.email "[email protected]"
repo init -u git://github.com/MentorEmbedded/mpsoc-manifest.git -b zynqmp-android_8 -m release_android-8_xilinx-v2019.2.xml
其中参数解释如下:
图 7参数解释
但是在执行上面命令时会报错:
图 8 repo init
解决办法:
网上很多说添加option,添加清华镜像源,即:
--repo-url=https://gerrit-google.tuna.tsinghua.edu.cn/git-repo但是并没有解决我的问题。
下载完整的repo project解决了我的问题。
下载repo project完整工程代码,下载地址:
https://download.csdn.net/download/hongmao6/21044535
将源码拷贝到虚拟机随便路径下解压
图 9 repo project
执行命令:
cd /你的解压路径,例如我的:
cd /home/mock/Downloads/repo
chmod 777 repo修改权限
用完整的repo project生成的repo执行repo init
/home/mock/Downloads/repo/repo init -u git://github.com/MentorEmbedded/mpsoc-manifest.git -b zynqmp-android_8 -m release_android-8_xilinx-v2019.2.xml
解决问题。
图 10 解决问题
执行完成后会在WORKING_DIRECTORY目录下生成一个隐藏文件.repo,执行命令ls -al查看。
图 11生成.repo
.repo文件内容如下:
图 12 .repo内容
完成repo init后就可以下载源码了:
/home/mock/Downloads/repo/repo sync -c 不要用repo sync,也要用repo的完整工程生成的repo。
但是还是出现问题:
图 13 sync –c
解决办法:
网上推荐修改/etc/hosts文件,如下图所示,但是并没有解决我的问题,解决我的问题是修改的xml文件。
图 14添加源
解决这个问题的办法:
图 15 修改xml文件
gedit .repo/manifests/release_android-8_xilinx-v2019.2.xml
因为我下载的是v2019.2版本,所以修改的这个xml,如果默认你可以修改default.xml文件。
解决办法1:把原来的https://android.googlesource.com换成git://codeaurora.org就可以正常下载了,xml里面只有一处android.googlesource.com替换掉就可以了。
解决办法2(推荐使用,下载速度会快很多):修改文件gedit .repo/manifest.xml,把https://android.googlesource.com改为https://aosp.tuna.tsinghua.edu.cn/使用清华源。
图 16 替换源
图 17修改manifest.xml
按照3.5 替换下载源,/home/mock/Downloads/repo/repo sync -c 就可以正常下载Android源码了,要下载很久很久很久很久。。。。。。。我用的家里的网络,200M的带宽,下载了大概7个小时。
图 18 开始下载
图 19部分截图
在下载的中途中,出现了多次问题:
error: Exited sync due to fetch errors
解决问题:
反复执行:/home/mock/Downloads/repo/repo sync -c
因为repo sync会自动检查哪个文件已经下载,下载过了就不会再次下载了。
图 20 Exited sync due to fetch errors
curl: (22) The requested URL returned error: 404 Not Found
Server does not provide clone.bundle; ignoring.
不用管这个问题(直接fuck off),在下载的过程中,一直在找源码的server,如果没有就会从源码库里面下载。
图 21 404 Not Found
下载过程中出现如下问题:Unable to create '/home/WORKING_DIRECTORY/.repo/projects/tools/external/gradle.git/shallow.lock': File exists.
解决问题:进入该目录删除shallow.lock文件,然后继续执行/home/mock/Downloads/repo/repo sync -c
出现问题:
Syncing work tree: 99% (596/602) error: The following untracked working tree files would be overwritten by checkout:
error : tools/external/gradle/: platform/tools/external/gradle checkout
解决办法:
cd tools/external/gradle目录;
执行命令:git reset HEAD BUILD依次类推,将所有的问题都删除。
然后继续执行/home/mock/Downloads/repo/repo sync -c就可以了。哈哈~
图 22 sync error
我尼玛,折腾了2天终于下载完成了,源码大小为:67G,我只下载的Android-8 v2019.2分支,之前在家里下载了Android 6居然有105G。
图 23 下载完成
图 24源码文件.
下载路径:
https://download.csdn.net/download/hongmao6/21097484
将文件拷贝到Android源码的顶层目录,即WORKING_DIRECTORY目录下。
执行命令:mkdir -p tmp_mali && tar -xf mali-400-userspace.tar -C ./tmp_mali && mkdir -p vendor/xilinx/zynqmp/proprietary && cp -r tmp_mali/mail/Android/android-6.0.1/MALI-userspace/r6p2-01rel0/* vendor/xilinx/zynqmp/proprietary/ && rm -rf tmp_mali/
图 25mali 400
make -j4编译了1个小时后,出现错误:
arm-linux-androideabi-g++: internal compiler error: Killed (program cc1plus)
扩展虚拟机的内存:
关闭虚拟机,点击设置,将虚拟机的内容扩大为8G(4G也可以),之前我的内存设置为3G(太小了)。
图 26虚拟机设置
然后重新make -j4
make -j4时报错:如果正确安装了OpenJDK不会有这个问题,我之前安装成了JDK,而不是OpenJDK。
You are attempting to build with an unsupported JDK.
Only an OpenJDK based JDK is supported.
图 27 JDK
重新安装OpenJDK就可以了:
apt-get upgrade
sudo apt-get install openjdk-8-jdk
然后重新make -j4
出现错误:ninja: no work to do.(可以忽略这个问题)
解决办法:make clean后重新编译
编译过程中出现错误:
home/WORKING_DIRECTORY/linux-xlnx/scripts/extract-cert.c:21:25: fatal error: openssl/bio.h: No such file or directory
解决办法:是因为没有安装openssl的库
apt-get install libssl-dev
然后重新make -j4
编译过程中出现错误:
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'
图 28 jack server error
解决办法:
gedit /etc/java-8-openjdk/security/java.security
删除:文件jdk.tls.disabledAlgorithms =里面的 TLSv1, TLSv1.1变量
删除606行: jdk.certpath.disabledAlgorithms=MD2, MD5, SHA1 jdkCA & usage TLSServer, \
删除607行: RSA keySize < 1024, DSA keySize < 1024, EC keySize < 224, \
删除608行: include jdk.disabled.namedCurves
然后重新make -j4
编译过程中出现问题:
Out of memory error (version 1.3-rc7 'Douarn' (445000 d7be3910514558d6715ce455ce0861ae2f56925a by [email protected])).
图 29 out of memory error
解决办法:执行下面3条命令:
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
sudo ufw disable
sudo git config --global http.sslVerify false
然后重新make -j4
再次编译时出现下面打印才说明成功:
Jack server already installed in "/root/.jack-server"
Server is already running
编译过程中出现问题:
Connection to the Jack server timeout, retrying with debug
* Hostname was NOT found in DNS cache
* Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8076 (#0)
* successfully set certificate verify locations:
* CAfile: /root/.jack-server/server.pem
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
} [data not shown]
* Operation timed out after 0 milliseconds with 0 out of 0 bytes received
* Closing connection 0
Building with Jack:...r_intermediates/with-local/classes.dex
ninja: build stopped: subcommand failed.
图 30错误7
解决办法:
编译过程中出现问题:
Communication error with Jack server (52). Try 'jack-diagnose'
ninja: build stopped: subcommand failed.
图 31 错误8
解决办法:
gedit prebuilts/sdk/tools/jack-admin
1.找到如下语句:
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
2.将上述语句修改为:
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
3.重新启动jake server
./prebuilts/sdk/tools/jack-admin start-server
dex2oatd F 08-18 08:27:10 73934 73934 heap.cc:438] Check failed: region_space_mem_map != nullptr No region space mem map
Runtime aborting...
Dumping all threads without appropriate locks held: thread list lock mutator lock
All threads:
DALVIK THREADS (0):
"dex2oatd" prio=5 (not attached)
解决办法:
我怀疑是我的内存空间不够,我就加了一根8G的内存条(之前内存只有8G),将虚拟机内存设置为了8G(之前是4G),重新虚拟机,然后继续make -j4就编译完成了。
这个问题我也不懂,反正就这样解决了。疑惑中。。。。。。
看到这样的输出后,就是编译完成了,前前后后历时12个小时,为啥网上别的人只用了几个小时,难道是我CPU不行,有可能,我CPU是i5 4460太老了(公司的电脑)。
图 32编译成功
图 33 编译生成路径
编译完成后,所有生成文件路径为 out/target/product/zcu102该目录下,最重要的是生成的那几个.img文件。
编译完成后,如果你没有重新打开Terminal,直接运行emulator命令就可以了,等待一会儿一会儿一会儿。。。。后就会出现Android的手机界面了,真的不容易呀~~~~~。
如果你重新打开了一个Terminal控制终端,那么需要:
图 34运行成功