史上最全面的Ubuntu下Android 下载、编译、运行

1 简介

本小弟由于项目需要,准备做一个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适配,应该是西门子的几个大哥在做适配。

2 环境搭建

2.1 主机配置

下载、安装Andorid对计算机的配置要求相对较高,可以省去很多恶心的问题:比如编译中:内存不足,硬盘空间不够。

我的电脑配置:

内存:16GB;

硬盘:1TB;(这个大于200G都可以)

2.2 Ubuntu安装

图 1 系统版本

 

14.04.5 LTS镜像获取地址:

 图 2 iso镜像

http://old-releases.ubuntu.com/releases/14.04.0/?_ga=2.83239126.1304170281.1628644245-1553457993.1616034659

具体安装过程大家肯定都会,就不BB了。

安装虚拟机的时候有两个大坑,提前跟你们说一下,不然后面会让你很恶心:

  1. 内存必须大于3G,不然编译Android源码的时候会有问题,下面有说明;(我设置的8G
  2. 硬盘最好大于150G,不然你放不下源码,源码、编译完后大概有150G,而且还有编译,(我设置的200G,其实我很后悔,200G还是少了,最好是300G)。

 

图 3虚拟机配置

2.3 JDK安装

采用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

2.4 其余包安装

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

3 安装repo

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成功

3.1 初始化repo客户端

mkdir WORKING_DIRECTORY

cd WORKING_DIRECTORY

git config --global user.name "Your Name"

git config --global user.email "you@example.com"

比如:

git config --global user.name "Wang Jin"

git config --global user.email "wangjinmock@163.com"

3.2 repo init

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解决了我的问题

3.3 repo project完成工程

下载repo project完整工程代码,下载地址:

https://download.csdn.net/download/hongmao6/21044535

将源码拷贝到虚拟机随便路径下解压

 图 9 repo project


执行命令:

cd /你的解压路径,例如我的:

cd /home/mock/Downloads/repo

chmod 777 repo修改权限

3.4 重新执行repo init

用完整的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内容

3.5 repo sync

完成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

4 正常下载

按照3.5 替换下载源,/home/mock/Downloads/repo/repo sync -c 就可以正常下载Android源码了,要下载很久很久很久很久。。。。。。。我用的家里的网络,200M的带宽,下载了大概7个小时。

 

图 18 开始下载

 

图 19部分截图

5 下载中出现问题

在下载的中途中,出现了多次问题:

5.1问题1

error: Exited sync due to fetch errors

解决问题:

反复执行:/home/mock/Downloads/repo/repo sync -c

因为repo sync会自动检查哪个文件已经下载,下载过了就不会再次下载了。

 

图 20 Exited sync due to fetch errors

5.2问题2

curl: (22) The requested URL returned error: 404 Not Found

Server does not provide clone.bundle; ignoring.

不用管这个问题(直接fuck off),在下载的过程中,一直在找源码的server,如果没有就会从源码库里面下载。

 

图 21 404 Not Found

5.3问题3

     下载过程中出现如下问题: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

5.4问题4

出现问题:

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

6 下载完成

我尼玛,折腾了2天终于下载完成了,源码大小为:67G,我只下载的Android-8 v2019.2分支,之前在家里下载了Android 6居然有105G。

 

图 23 下载完成

 

图 24源码文件.

7 编译:

7.1下载MALI 400(针对GPU)

下载路径:

https://download.csdn.net/download/hongmao6/21097484

7.2 安装MALI 400

将文件拷贝到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

7.3 编译Android源码

  1. source build/envsetup.sh
  2. lunch 选择你要编译的平台 我编译:lunch zcu102-eng
  3. make  -j4

7.4 编译出错

7.4.1 错误1

make -j4编译了1个小时后,出现错误:

arm-linux-androideabi-g++: internal compiler error: Killed (program cc1plus)

扩展虚拟机的内存:

关闭虚拟机,点击设置,将虚拟机的内容扩大为8G4G也可以),之前我的内存设置为3G(太小了)。

 

图 26虚拟机设置

然后重新make -j4

7.4.2 错误2

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

7.4.3 错误3(可忽略)

出现错误:ninja: no work to do.(可以忽略这个问题)

解决办法:make clean后重新编译

  1. source build/envsetup.sh
  2. lunch 选择你要编译的平台 我编译:lunch zcu102-eng
  3. make  -j4

7.4.4 错误4

编译过程中出现错误:

 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

7.4.5 错误5

编译过程中出现错误:

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

7.4.6 错误6

编译过程中出现问题:

Out of memory error (version 1.3-rc7 'Douarn' (445000 d7be3910514558d6715ce455ce0861ae2f56925a by android-jack-team@google.com)).

 

图 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

7.4.7 错误7

编译过程中出现问题:

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

解决办法:

  1. sudo ufw disable 关闭防火墙
  2. sudo git config --global http.sslVerify false  关闭ssl校验
  3. 然后重新make -j4

7.4.8 错误8

编译过程中出现问题:

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

7.4.9 错误9

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就编译完成了。

这个问题我也不懂,反正就这样解决了。疑惑中。。。。。。

7.5 编译完成

看到这样的输出后,就是编译完成了,前前后后历时12个小时,为啥网上别的人只用了几个小时,难道是我CPU不行,有可能,我CPU是i5 4460太老了(公司的电脑)。

 

图 32编译成功

 

图 33 编译生成路径

      

编译完成后,所有生成文件路径为 out/target/product/zcu102该目录下,最重要的是生成的那几个.img文件。

8 运行emulator

编译完成后,如果你没有重新打开Terminal,直接运行emulator命令就可以了,等待一会儿一会儿一会儿。。。。后就会出现Android的手机界面了,真的不容易呀~~~~~。

如果你重新打开了一个Terminal控制终端,那么需要:

  1. source build/envsetup.sh
  2. lunch xxxx 选择你要编译的平台 我编译:lunch zcu102-eng
  3. emulator开启Android界面。

 

图 34运行成功

 


  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值