内容包括两点: 前言,流程
1 前言
编译Android 6.0这种文章在ubuntu平台上面网上已经写到烂了,之所以写这个总结是因为 1 想让更多的android手机系统开发者使用这个deepin系统(想想编程的时候可以挂QQ,微信,百度云,迅雷诸多国产软件真是惬意), 2 deepin 15系统是继承debian系列,最近的关于debian编译Android源代码的文章的时间是2015年,而且方法已经完全对不上号,库全部失效了,所以基本上没有什么中国文章,讲在debian上对高版本的Android系统进行有效编译的了,deepin更没有,接下来开始编译内容步骤。
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
由于deepin15 没有open jdk7的仓库记录,所以在这里我们用加一下,步骤如下:
加源的方法1:
1 2 3 4 5 |
$sudo apt-get install python-software-properties $sudo apt-get install software-properties-common $sudo apt-get update $sudo add-apt-repository ppa:openjdk-r/ppa $sudo apt-get update |
加源的方法2
1 |
$sudo gedit /etc/apt/sources.list |
加入如下两行,
1 2 3 |
deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu xenial main deb-src http://ppa.launchpad.net/openjdk-r/ppa/ubuntu xenial main sudo apt-get update |
ok添加完毕,安装:
1 |
$sudo apt-get install openjdk-7-jdk |
已经安装了java8或者9的网友,可以在安装openjdk7后,使用如下命令进行java版本的自行切换:
1 2 |
$sudo update-alternatives --config java $sudo update-alternatives --config javac |
在.bashrc里边配置Java路径:
1 2 3 4 5 6 |
export LC_ALL=C //高linux版本必开 export USE_CCACHE=1 //使用CCACHE加速编译 export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH |
2.2.2 安装各种支持库
1 2 3 4 5 6 7 8 9 10 11 |
//以下库ubuntu和deepin都有,有些重复的,这没什么问题,直接安装 $sudo apt-get install libx11-dev:i386 libgl1-mesa-dev g++-multilib $sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 $sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 $sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev $sudo apt-get install git-core gnupg flex bison gperf build-essential $sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib $sudo apt-get install libc6-dev-i386 $sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev $sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4 $sudo apt-get install lib32z-dev ccache |
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 |
如果提示没有这库,软件源在/etc/apt/sources.list 文件中像下面这样添加一行:
1 |
deb http://ftp.de.debian.org/debian wheezy main |
然后$sudo apt-get update,再安装。
安装完后,不是马上就可以用的,看一眼下面关于这个库的设置:
方法1 假设你目前还没有配置android app应用开发环境,也是就是说还没有下载android sdk的话,可以这么做:
1 2 3 4 |
$cd {andoroid6.0根目录}/prebuilts/android-emulator/linux-x86_64/lib64 $mkdir libstdc++ $cd libstdc++ $ln -s /usr/lib64/libstdc++.so.6 . |
方法2 假设你已经下载了android sdk包,并且已经配置了android sdk环境的,可以用下面这个方法,这样,android 源码的emulator工具和android sdk中的emulator工具,两边运行模拟器都没有问题。好了,下面是步骤:
1 2 3 4 5 |
$cd {android sdk}/tools/lib64/libstdc++ $mv libstdc++.so.6 libstdc++.so.6.bak $ln -s /usr/lib64/libstdc++.so.6 . $cd {andoroid6.0根目录}/prebuilts/android-emulator/linux-x86_64/lib64 $ln -s {android sdk}/tools/lib64/libstdc++ . |
2.2.4 高版本Linux(>ubuntu 14.04)上面要进行的设置
2.2.4.1
1 2 |
$sudo ln -s /usr/lib/i386-linux-gnu/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so $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 |
2.2.4.2 修改 build/core/clang/HOST_x86_common.mk
加上 -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \
-no-integrated-as //此句7.0以下要加
1 2 3 4 5 6 7 8 9 10 11 12 |
diff --git a/core/clang/HOST_x86_common.mk b/core/clang/HOST_x86_common.mk index 0241cb6..77547b7 100644 --- a/core/clang/HOST_x86_common.mk +++ b/core/clang/HOST_x86_common.mk @@ -8,6 +8,7 @@ ifeq ($(HOST_OS),linux) CLANG_CONFIG_x86_LINUX_HOST_EXTRA_ASFLAGS := \ --gcc-toolchain=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG) \ --sysroot=$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/sysroot \ + -B$($(clang_2nd_arch_prefix)HOST_TOOLCHAIN_FOR_CLANG)/x86_64-linux/bin \ + -no-integrated-as CLANG_CONFIG_x86_LINUX_HOST_EXTRA_CFLAGS := \ |
2.2.4.3 修改 art/build/Android.common_build.mk
#关闭高版本的clang编译器,会把项目编译错误,高版本会走clang编译,可惜android源代码用不起。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Host. ART_HOST_CLANG := false ifneq ($(WITHOUT_HOST_CLANG),true) # By default, host builds use clang for better warnings. ART_HOST_CLANG := true endif 改为 # Host. ART_HOST_CLANG := false ifeq ($(WITHOUT_HOST_CLANG),false) # By default, host builds use clang for better warnings. ART_HOST_CLANG := true endif |
2.3 编译
1 2 3 4 |
$cd {andoroid6.0根目录} $prebuilts/misc/linux-x86/ccache/ccache -M 50G $source build/envsetup.sh $lunch aosp_arm-eng 或者aosp_x86-eng |
(这两个产品的区别,
aosp_arm-eng 优点:编译的时间比aosp_x86-eng短一个小时,占硬盘比aosp_x86-eng少1G,可以加载模拟器arm架构的内核源码编译出来的镜像,研究编译内核这方面网上公布出来的资料很丰富,适合framework和研究linux内核栈的网友使用
aosp_x86-eng 优点:就是一个字快,启动和运行快如闪电,缺点上面都说,编译时间长点,硬盘占得多点,关于x86架构内核源码编译的方法,网上公布少得可怜,适合不做内核的网友使用)
1 2 |
$make -j8 //核数×2,快cpu的2小时,慢cpu的arm版本3.5小时,x86版本4.5小时 $emulator |
此文总体方案适合deepin15及ubuntu 16.04以上 系统。
~Enjoy!
附图: