2017在Deepin 15上编译Android 6.0源代码流程总结
Tofloor
poster avatar
177******80
deepin
2017-12-08 20:56
Author
本帖最后由 sksweet 于 2018-5-31 10:11 编辑

内容包括三点:1 前言,2流程,3致谢

1 前言
前两天我在Deepin 15上面进行Android 6.0源码编译,碰了一些问题,然后求助Deepin论坛,写了个贴《deepin15编译android6.0碰到无法安装libreadline6-dev:i386 》,已经代码编译成功,镜像也已经可以正常运行,现在总结一下。

2 流程
android源码编译的四个流程:1.源码下载;2.构建编译环境;3.编译源码;4运行.

2.1 源码下载
首先推荐的是使用百度网盘下载无git文件的压缩包,理由很简单,体积小,压缩包4G,解压后才13G。要是用repo,可以给你们算一下,30G的git文件+13G的代码+27G编译产生的文件=要吃掉70G的硬盘,从国内镜像下载,网速快则半天,不快下24小时都未必可以下载完,其次在开发的时候,在改代码前完全可以在要改之处加git分支,这样保证不管怎么改动都可以还原。下面给出百度网盘链接:
https://pan.baidu.com/s/1dE5Q8hF

如果一定想用repo下载的,请自行百度,我相信别人一定会把repo,改清华镜像的步骤讲得比我详细。

2.2 构建编译环境

2.2.1 安装Open jdk7

编译android 6.0一定要OpenJDK 1.7 ,注意是OpenJDK,而不是OracleJDK ,由于deepin15 没有open jdk7的仓库记录,所以在这里我们用加一下,步骤如下:

加源的方法1:
  1. sudo apt-get install python-software-properties
  2. sudo apt-get install software-properties-common
  3. sudo apt-get update
  4. sudo add-apt-repository ppa:openjdk-r/ppa
  5. sudo apt-get update
Copy the Code
加源的方法2
  1. sudo gedit /etc/apt/sources.list
Copy the Code
加入如下两行,
  1. deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu xenial main
  2. deb-src http://ppa.launchpad.net/openjdk-r/ppa/ubuntu xenial main
  3. sudo apt-get update
Copy the Code
ok添加完毕,安装:
  1. sudo apt-get install openjdk-7-jdk
Copy the Code
已经安装了java8或者9的网友,可以在安装openjdk7后,使用如下命令进行java版本的自行切换:
  1. sudo update-alternatives --config java
  2. sudo update-alternatives --config javac
Copy the Code
在.bashrc里边配置Java路径:
  1. export LC_ALL=C          //高linux版本必开
  2. export USE_CCACHE=1      //使用CCACHE加速编译
  3. export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/
  4. export JRE_HOME=${JAVA_HOME}/jre
  5. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
  6. export PATH=${JAVA_HOME}/bin:$PATH
Copy the Code
2.2.2 安装各种支持库
//以下库ubuntu和deepin都有,有些重复的,这没什么问题,直接安装
  1. sudo apt-get install libx11-dev:i386  libgl1-mesa-dev g++-multilib file
  2. sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
  3. sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
  4. sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
  5. sudo apt-get install git-core gnupg flex bison gperf build-essential  
  6. sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
  7. sudo apt-get install libc6-dev-i386
  8. sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
  9. sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
  10. sudo apt-get install lib32z-dev ccache
Copy the Code
2.2.3 安装deepin15 或者 debian没有默认安装的库
这也是为什么debian和deepin15一直没有人编译android源代码的原因,少库尔。

2.2.3.1 readline库
libreadline6-dev:i386,这个库已经被debian移除,我们把它加回来,这里我把ubuntu的包和debian的对应的libreadline6包都安装进来,打开包看到它们安装位置不一样,不知道会走哪个包,所以都安装。。
ubuntu版本:
libreadline6_6.3-4ubuntu2_i386.deb
地址:http://kr.archive.ubuntu.com/ubuntu/pool/main/r/readline6/libreadline6_6.3-4ubuntu2_i386.deb
libreadline6-dev_6.3-4ubuntu2_i386.deb
地址:http://kr.archive.ubuntu.com/ubuntu/pool/main/r/readline6/libreadline6-dev_6.3-4ubuntu2_i386.deb

debian版本:
lib32readline6_6.3-8_amd64.deb
地址:http://snapshot.debian.org/archive/debian/20140805T163056Z/pool/main/r/readline6/lib32readline6_6.3-8_amd64.deb
lib32readline6-dev_6.3-8_amd64.deb
地址:http://snapshot.debian.org/archive/debian/20140805T163056Z/pool/main/r/readline6/lib32readline6-dev_6.3-8_amd64.deb
要注意的是安装顺序,先安装*readline6*,再安装*readline6-dev*

2.2.3.2 lib64stdc++6库

lib64stdc++6这个额外的C++运行库deepin 15默认是没有安装的,它的作用是在模拟器接收相关的画面参数后,启动屏幕的渲染,没这个库,模拟器 1会提示你,当前的版本是32位的操作系统,让你加32位强制转换参数,2 就算加了强制转换参数,模拟器走到渲染画面的步骤后,因为没这个库而闪退。
安装:
  1. $sudo apt install lib64stdc++6
Copy the Code
如果提示没有这库,软件源在/etc/apt/sources.list 文件中像下面这样添加一行:
  1. deb http://ftp.de.debian.org/debian wheezy main
Copy the Code
然后$sudo apt-get update,再安装。
安装完后,不是马上就可以用的,看一眼下面关于这个库的设置:
  方法1 假设你目前还没有配置android app应用开发环境,也是就是说还没有下载android sdk的话,可以这么做:
  1.   $cd {andoroid6.0根目录}/prebuilts/android-emulator/linux-x86_64/lib64     
  2.      $mkdir libstdc++
  3.      $cd libstdc++
  4.      $ln -s /usr/lib64/libstdc++.so.6 .
Copy the Code
方法2 假设你已经下载了android sdk包,并且已经配置了android sdk环境的,可以用下面这个方法,这样,android 源码的emulator工具和android sdk中的emulator工具,两边运行模拟器都没有问题。好了,下面是步骤:
  1. $cd {android sdk}/tools/lib64/libstdc++   
  2.      $mv libstdc++.so.6 libstdc++.so.6.bak
  3.      $ln -s /usr/lib64/libstdc++.so.6 .
  4.      $cd {andoroid6.0根目录}/prebuilts/android-emulator/linux-x86_64/lib64
  5.      $ln -s {android sdk}/tools/lib64/libstdc++ .
Copy the Code
2.2.4 高版本Linux(>ubuntu 14.04)上面要进行的设置
2.2.4.1 Copy库文件      
  1. $sudo ln -s /usr/lib/i386-linux-gnu/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
  2.            $sudo cp /usr/bin/ld.gold {andoroid6.0根目录}/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8/x86_64-linux/bin/ld
Copy the Code
2.2.4.2 修改 build/core/clang/HOST_x86_common.mk
  1. 加上 -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin
  2.   

  3. diff --git a/core/clang/HOST_x86_common.mk b/core/clang/HOST_x86_common.mk
  4. index 0241cb6..77547b7 100644
  5. --- a/core/clang/HOST_x86_common.mk
  6. +++ b/core/clang/HOST_x86_common.mk
  7. @@ -8,6 +8,7 @@ ifeq ($(HOST_OS),linux)
  8. CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \
  9.    --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \
  10.    --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \
  11. +  -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin   


  12. CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \
Copy the Code
  2.2.4.3 修改 art/build/Android.common_build.mk
   #关闭高版本的clang编译器,会把项目编译错误,高版本会走clang编译。  
  1. # Host.
  2.   ART_HOST_CLANG := false
  3.   ifneq ($(WITHOUT_HOST_CLANG),true)
  4.     # By default, host builds use clang for better warnings.
  5.      ART_HOST_CLANG := true
  6. endif

  7.   改为
  8.   # Host.
  9.   ART_HOST_CLANG := false
  10.   ifeq ($(WITHOUT_HOST_CLANG),false)
  11.     # By default, host builds use clang for better warnings.
  12.     ART_HOST_CLANG := true
  13.   endif
Copy the Code
2.3 编译
  1. $cd {andoroid6.0根目录}
  2. $prebuilts/misc/linux-x86/ccache/ccache -M 50G
  3. $source build/envsetup.sh
  4. $lunch aosp_arm-eng 或者aosp_x86-eng
  5.   (这两个产品的区别,
  6.   aosp_arm-eng 优点:编译的时间比aosp_x86-eng短一个小时,占硬盘比aosp_x86-eng少1G,可以加载模拟器arm架构的内核源码编译出来的镜像,研究编译内核这方面网上公布出来的资料很丰富,适合framework和研究linux内核栈的网友使用
  7.   aosp_x86-eng 优点:就是一个字快,启动和运行快如闪电,缺点上面都说,编译时间长点,硬盘占得多点,关于x86架构内核源码编译的方法,网上公布少得可怜,适合不做内核的网友使用)
  8. $make -j8  //核数×2,快cpu的2小时,慢cpu的arm版本3.5小时,x86版本4.5小时
  9. $emulator  -gpu on  // 参数 -gpu on,是为了调试浏览器之用,如果不打开,会因为没有渲染库,浏览器产生强关,不研究浏览器的网友不用打开。
Copy the Code
3 致谢

深度论坛网友在贴中出谋划策,特别是以下三位在代码编译出现问题时候所提供的线索
@debuggerx    不厌其烦地提供正确分析问题的建议
@zhangshuang  提供了旧版本readline库地址
@bingeneral   我从其论坛内文章《安卓开发者在使用deepin时可能会遇到的问题》中获得解决在deepin上模拟器失灵解决方案

此文总体方案仅适合deepin15 系统,我把它留在论坛内给网友们参考,如需转载请标明出处。谢谢。
~Enjoy!

附图:



Reply Favorite View the author
All Replies
avatar
RedPanda
deepin
2017-12-08 21:05
#1
干货,厉害了
Reply View the author
avatar
pikachuhy
deepin
2017-12-08 21:05
#2

能不能放一篇博客出来
因为有一些代码 在论坛里的展示效果不好
最好是放在专门放代码的块中
Reply View the author
avatar
shamine
deepin
2017-12-08 21:09
#3
耐屎 喂芮耐屎
Reply View the author
avatar
wz******cj@qq.com
deepin
2017-12-08 22:25
#4
可以弄个专题了
Reply View the author
avatar
152******14
deepin
2017-12-08 23:55
#5
你做的非常好!
Reply View the author
avatar
177******80
deepin
2017-12-09 05:26
#6
https://bbs.deepin.org/post/149812

能不能放一篇博客出来
因为有一些代码 在论坛里的展示效果不好

您好,抱歉,是我考虑不周了,但我1来比较懒,2 是用deepin系统来进行这个事情研究的人基本不会有,有也是基本ubuntu系,所以.....不折腾了,不从事这个工作的人,我写再好也不会看一行的呀,望谅解。^_^!
Reply View the author
avatar
177******80
deepin
2017-12-09 05:26
#7

没什么意义,呵呵。
Reply View the author
avatar
177******80
deepin
2017-12-09 05:27
#8

没必要呀,差异都写出来的。就这一贴足够了,这种冷门的东西。呵呵
Reply View the author
avatar
152******14
deepin
2017-12-09 19:22
#9
https://bbs.deepin.org/post/149812
没什么意义,呵呵。

把,种种经验,收集起来验证总结,拿出来分享,为新来者指明道路,最后还感谢做出贡献的人,难道不好吗?
Reply View the author
avatar
要讲武德
deepin
2017-12-09 22:09
#10
安装jdk  可以用sdkman  .
http://sdkman.io/install.html


  1. sdk list java

  2. ================================================================================
  3. Available Java Versions
  4. ================================================================================
  5.      9.0.1-zulu                                                                    
  6.      9.0.1-oracle                                                                  
  7.      9.0.0-zulu                                                                    
  8. > * 8u152-zulu                                                                    
  9.      8u151-oracle                                                                  
  10.      8u144-zulu                                                                    
  11.      8u131-zulu                                                                    
  12.      7u141-zulu                                                                    
  13.      6u93-zulu                                                                     

  14. ================================================================================
  15. + - local version
  16. * - installed
  17. > - currently in use
  18. ================================================================================
Copy the Code

Reply View the author
avatar
177******80
deepin
2017-12-09 23:45
#11
https://bbs.deepin.org/post/149812
安装jdk  可以用sdkman  .
http://sdkman.io/install.html

是个好东西呀,python2-3和php5-7也应该支持切换的吧?
Reply View the author
avatar
134******40
deepin
2017-12-10 00:06
#12
厉害厉害,佩服佩服。
Reply View the author
avatar
qiushao
deepin
2017-12-27 23:46
#13
佩服,佩服,我之前折腾了一下,各种错误,最后放弃了
Reply View the author
avatar
177******80
deepin
2017-12-28 00:52
#14
本帖最后由 sksweet 于 2017-12-27 17:51 编辑
https://bbs.deepin.org/post/149812
佩服,佩服,我之前折腾了一下,各种错误,最后放弃了

你之前发的求助帖子我以前看到过,这篇文档其实就是写给你这类源码开发者看的,我以前搞过这一行,在ubuntu 14 /16 ,最新的Arch,Fedora27上都编译过,所以感觉都是linux系统,Debian系列怎么可能编译不了呢,呵呵。
Reply View the author
avatar
159******53
deepin
2017-12-28 05:35
#15
感谢分享 收藏了
Reply View the author
avatar
yxiang
deepin
2018-03-15 03:23
#16
楼主你好,为了你的帖子我特意去安装了deepin,注册了账号,结果卡在这里
prebuilts/tools/gcc-sdk/ar:行29: file: 未找到命令
ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linux
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libinput_intermediates/libinput.a] 错误 1
make: *** 正在等待未完成的任务....
prebuilts/tools/gcc-sdk/ar:行29: file: 未找到命令
ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linux
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/libutils.a] 错误 1
prebuilts/tools/gcc-sdk/ar:行29: file: 未找到命令
ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linux
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liblog_intermediates/liblog.a] 错误 1
prebuilts/tools/gcc-sdk/ar:行29: file: 未找到命令
ERROR: prebuilts/tools/gcc-sdk/../../gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6/bin/x86_64-linux-ar only run on 64-bit linux
make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libcutils_intermediates/libcutils.a] 错误 1

编译Android 4.4,但是deepin明明就是64位的呀,好郁闷。麻烦楼主帮忙看一下
Reply View the author
avatar
yxiang
deepin
2018-03-15 04:06
#17
https://bbs.deepin.org/post/149812
楼主你好,为了你的帖子我特意去安装了deepin,注册了账号,结果卡在这里
prebuilts/tools/gcc-sdk/ar:行29 ...

妈个鸡,deepin默认不安装file的
Reply View the author
avatar
177******80
deepin
2018-05-31 03:16
#18
本帖最后由 sksweet 于 2018-6-2 20:12 编辑

半年前在deepin15.5上编译了android源代码,现在再次安装deepin15.5回来看了一下,系统更新很大,系统在使用方面改善了相当多的地方.当然编译方面,也改了几个地方.去年文档中的某些章节的操作在新的deepin15.5上面已经失效了.

文档改1---
安装openjdk7的方法1和2都在deepin15.5上面失效了,呵呵。想了一下,使用下面方法OK。
在sudo gedit /etc/apt/sources.list中上面xenial的两行去掉,已经证实无效了(2018/5/30)。加入如下两行,如下:
deb http://security.debian.org/debian-security wheezy/updates main
deb http://security.debian.org/debian-security jessie/updates main
然后退出更新文件列表。
$sudo apt-get update
$sudo apt install openjdk-7-source openjdk-7-jdk  -y

【1】找到/etc/profile文件,在JDK环境变量之前添加如下:
unset _JAVA_OPTIONS
【2】注销用户

Reply View the author
avatar
177******80
deepin
2018-05-31 18:13
#19
本帖最后由 sksweet 于 2018-6-11 15:35 编辑

文档改2---
2.2.3.1 readline库节中,目前只能安装debian 版本的库了,debian的版本安装后会出现系统问题
debian版本:
lib32readline6_6.3-8_amd64.deb
地址:http://snapshot.debian.org/archive/debian/20140805T163056Z/pool/main/r/readline6/lib32readline6_6.3-8_amd64.deb
lib32readline6-dev_6.3-8_amd64.deb
地址:http://snapshot.debian.org/archive/debian/20140805T163056Z/pool/main/r/readline6/lib32readline6-dev_6.3-8_amd64.deb
要注意的是安装顺序,先安装*readline6*,再安装*readline6-dev*
Reply View the author
avatar
177******80
deepin
2018-05-31 18:21
#20
本帖最后由 sksweet 于 2018-5-31 10:22 编辑

文档修改3-----
2.2.3.2 lib64stdc++6库这节里
这个模拟器32位兼容库在新的deepin15.5上面,已经安装不上了.用以下方法替换安装:
  1. sudo aptitude -f install lib32stdc++6
Copy the Code

出现第一个Y/N选项时选N,第二个及以后的选Y即可。

库的设置方法:
 方法二已经不管用了,android sdk哪边google更新了sdk文件目录,已经没有lib64这个位置的文件了,使用方法1改如下:
  1. $cd {andoroid6.0根目录}/prebuilts/android-emulator/linux-x86_64/lib64     
  2. $mkdir libstdc++
  3. $cd libstdc++
  4. $ln -s /usr/lib32/libstdc++.so.6 .
Copy the Code
Reply View the author