android系统源码编译

一. CentOS7系统安装


二:在CentOS7中安装Git

sudo yum install git 
git config --global user.email "youemail@test.com" 
git config --global user.name "your_name"

三:安装REPO工具

1. Google采用Git对AOSP项目进行多仓管理

2. 安装

mkdir ~/develop
mkdir ~/develop/android_source
PATH=~/develop/android_source:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/develop/android_source/repo
chmod a+x ~/develop/android_source/repo

解析

mkdir ~/develop   :  假如你打开终端,你当前的登陆用户是xiaoming,那么就会在 /home/xiaoming/目录下创建一个develop文件夹

mkdir ~/develop/bin: 继续在develop文件夹下面创建bin文件夹

PATH=~/develop/bin :$PATH : 将~/develop/bin路径添加到环境变量中,你可以使用命令 echo $PATH 打印出环境变量查看,这种方式的修改只在shell中起效

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/develop/bin/repo :  将repo文件下载到刚才新建的文件夹中

chmod a+x ~/develop/bin/repo : 给这个文件夹加上权限,所有人都可以执行

repo文件,只是一个引导脚本,repo的大部分功能代码不在其中,这个repo脚本只是一个帮助完成整个repo程序继续下载和加载的工具。而对整个repo程序,官方解析就是:是Google开发的用于管理Android版本库的一个工具。

repo的使用过程大致如下:
A  运行repo init命令,克隆Android的一个清单库。这个清单库是通过XML技术建立的版本库清单。
B  清单库中的manifest.xml文件,列出了几百个多个版本库的克隆方式。包括版本库的地址和工作区地址的对应关系,以及分支的对应关系。
C  运行repo sync命令,开始同步,即分别克隆这几百个版本库到本地的工作区。
D  同时对这几百个版本库执行切换分支操作,切换到某个分支。


四:源码镜像切换

1. 清华源

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

2. 科大源

https://lug.ustc.edu.cn/wiki/mirrors/help/aosp
3. 切换到目录 ~/develop/bin, 使用vim编辑repo文件,将镜像修改为清华的源

vim ~/develop/bin/repo

https://gerrit.googlesource.com/git-repo
修改为

https://aosp.tuna.tsinghua.edu.cn/git-repo


五:下载源码

根据repo的使用方式,我们首先要有一个放置源代码的地方,我们在develop文件夹下面创建一个android_source这样的文件夹.


但是根据清华的网站,由于初始化包非常的大,目前有25.89G。建议使用初始化包进行初始化并同步代码。

1.方案1------ 使用每月更新的初始化包

cd ~/develop
wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
tar xf aosp-latest.tar
mv aosp android_source
cd android_source  
repo sync 

解析

cd ~/develop  : 我们希望所有的清单和源码都放在 develop/android_souce下面

wget https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar:假设当前切换到 ~/develop/android_souce目录下面,执行该语句,即将aosp-latest.tar压缩文件下载在当前目录下, 1M/s的网速我下载了整整7个小时

tar xf aosp-latest.tar : 解压这个压缩文件,得到一个 AOSP 工程目录

rename aosp android_source : 将文件夹aosp名称修改为android_source 

cd android_source : 进入该目录,是空的,因为文件.repo是隐藏的

repo sync  : 同步一遍即可得到完整目录,大概20分钟


2. 方案2---自建android_source源码工作目录,下载清单并进行同步

1)  创建 android_source文件夹

mkdir ~/develop/android_source
cd ~/develop/android_source

2) 获取清单

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

解析:

repo init –u URL [OPTIONS]
A. -u:指定一个URL,其连接到一个maniest仓库
B. -m:在manifest仓库中选择一个xml文件
C. -b:选择一个maniest仓库中的一个特殊的分支
     如最小的1.6版本: repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-1.6_r1

这个命令完成的功能:

A.  完成repo工具的完整下载(执行的repo脚本只是引导程序)
B. 克隆清单库manifest.git (地址来自于-u 参数)
C. 克隆的清单库位于manifest.git中,克隆到本地.repo/manifests.清单.repo/manifest.xml只是符号链接,它指向.repo/manifests/default.xml
D. 如果manifests中有多个xml文件,repo init 可以任意选择其中一个,默认选择是default.xml


执行这个命令后,在android_source下面会创建一个   .repo  文件夹,这个文件夹是隐藏的,在这个文件夹里面还包含一下文件以及文件夹:manifests  manifests.git  manifest.xml  repo


3)同步源码树

repo sync


完成同步之后,repo就将最新的源代码同步到了 ~/develop/android_source/.repo/下面了,新增两个文件夹  projects    project-objects   

然后,


六:构建编译环境

1. 硬件要求

1) 64位的操作系统只能编译2.3.x以上的版本,如果你想要编译2.3.x以下的,那么需要32位的操作系统.

2) 100G以上


2. 软件要求

1)  JDK版本

Android版本编译要求的JDK版本
AOSP的Android主线OpenJDK 8
Android 5.x至android 6.0OpenJDK 7
Android 2.3.x至Android 4.4.xOracle JDK 6
Android 1.5至Android 2.2.xOracle JDK 5

2) 使用OracleJDK

A.  删除默认的安装的OpenJdk-----查找

rpm -qa | grep jdk

LInux一般默认安装的是OpenJDK,我们卸载OpenJDK,改用Oracle的JDK


B.  删除默认的安装的OpenJdk-----删除

rpm -e --nodeps penjdk版本名称

C  比如我们将Oracle的jdk1.6安装到 /usr/lib/jvm 下面

切换目录

cd /usr/lib/jvm
下载1.6jdk

可以使用浏览器,打开http://www.oracle.com/technetwork/java/javase/downloads/index.html    看最下面的  Java Archive,下载jdk-6u45-linux-x64.bin文件,拷贝到 /usr/lib/jvm文件夹下面, 赋予.bin的jdk安装包的执行权限,执行命令

sudo chmod u+x jdk-6u45-linux-x64.bin
执行命令:sudo  ./jdk-6u45-linux-x64.bin  (在当前目录下,“./”代表执行操作)

执行后得到 /usr/lib/jvm/jdk1.6.0_45 文件夹

D  配置jdk环境变量

sudo vi /etc/profile

在文件加入一下内容

#set java environment
JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

再输入命令使修改起效

source /etc/profile

D  测试jdk

java -version

F: 最好重启Linux


3) 使用OpenSDK

A.  查找jdk版本

yum search java|grep jdk

B.  安装jdk

sudo yum install -y java-1.8.0-openjdk-devel.x86_64
默认安装目录:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64

其中,java-1.8.0-openjdk_x86_64是runtime(JRE),java-1.8.0-openjdk-devel_x86_64是JDK


C  配置jdk环境变量

sudo vi /etc/profile

在文件加入一下内容

#set java environment
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

再输入命令使修改起效

source /etc/profile

D  测试jdk

java -version

F   如果有多个jdk,切换jdk版本

sudo alternatives --config java



七  安装编译所需的库

$ sudo yum install -y gcc make libstdc++.i686 libstdc++-devel.i686 zlib-devel openssl-devel perl cpio expat-devel gettext-devel autoconf glibc.i686 glibc-devel.i686 zlib-devel.i686 libstdc++.i686 libX11-devel.i686 ncurses-devel.i686 ncurses-libs.i686 gperf flex gcc-c++ bison patch


八:初始化编译环境,切换到源码文件夹

source build/envsetup.sh

该命令执行完之后,将引入其他的执行脚本



九:编译源码

1. 查看编译选项

lunch

说明: lunch命令是envsetup.sh里定义的一个命令,用来让用户选择编译项,来定义Product和编译过程中用到的全局变量。运行该命令后会,它会打印出一个选择菜单,列出可用的编译选项

Lunch menu... pick a combo:
     1. full-eng
     2. full_x86-eng
     3. vbox_x86-eng
     4. full_mips-eng
     5. full_grouper-userdebug
     6. full_tilapia-userdebug
     7. mini_armv7a_neon-userdebug
     8. mini_armv7a-userdebug
     9. mini_mips-userdebug
     10. mini_x86-userdebug
     11. full_mako-userdebug
     12. full_maguro-userdebug
     13. full_manta-userdebug
     14. full_toroplus-userdebug
     15. full_toro-userdebug
     16. full_panda-userdebug

Which would you like? [full-eng]

解析:

eng                  :  工程机,
user                 :  最终用户机
userdebug     :  调试测试机
tests                :   测试机


2. 或者直接选择一个编译目标(选择平台编译选项)

lunch full-eng

1)问题1:  arm-linux-androideabi-gcc: 权限不够      build/core/find-jdk-tools-jar.sh: 权限不够  

解决:切换到这些文件相对的文件夹,执行    chmod 777  文件名称    命令

2)问题2:which: no javac in (/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-2.b11.el7_3.x86_64/jre/bin:/home/baijinwen/.local/bin:/home/baijinwen/bin)
有可能你没有安装jdk,而是安装了runtime

解决:

是   sudo yum install -y java-1.8.0-openjdk-devel.x86_64   而不是   sudo yum install -y java-1.8.0-openjdk.x86_64


成功后显示如:

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.2.2
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-3.10.0-514.16.1.el7.x86_64-x86_64-with-centos-7.3.1611-Core
HOST_BUILD_TYPE=release
BUILD_ID=JDQ39
OUT_DIR=out
============================================


3. 执行make语句开始编译

make -j2

说明:j2后面的数字是你要使用的线程数,看你电脑具体配置,CPU配置越好,能使用的线程越多,编译就越快 


1) 遇到问题

A.   Unable to find the ncurses libraries的解决办法

解决:

CentOS:
sudo yum install -y ncurses-devel
Ubuntu:
sudo apt-get insatll ncurses-devel

B. 安装arm-linux-gcc

B1 背景

GCC: The GNU Compiler Collection,通常简称 GCC,是一套由 GNU 开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持 C 语言编译,还支持 C++, Ada,Objective C 等许多语言。另外 GCC 对硬件平台的支持,可以所无所不在,它不仅支持 X86处理器架构, 还支持 ARM, Motorola 68000, Motorola 8800,AtmelAVR,MIPS 等处理器架构。

GCC 内部结构主要由 Binutils、gcc-core、Glibc 等软件包组成
Binutils:它是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。关于 Binutils 的介绍可以参考 Binutils 简单介绍。这个软件包依赖于不同的目标机的平台。因为不同目标机的指令集是不一样的,比如 arm 跟 x86 就不一样。
gcc-core:顾明之意是 GCC 的核心部分,这部分是只包含 c 的编译器及公共部分,而对其他语言(C++、Ada 等)的支持包需要另外安装,这也是 GCC 为何如此强大的重要原因 。gcc-core依赖于 Binutils。
Glibc:包含了主要的 c 库,这个库提供了基本的例程,用于分配内存,搜索目录,读写文件,字符串处理等等。kernel 和 bootloader不需要这个库的支持


arm-linux-gcc 

是基于 ARM 目标机的交叉编译软件, arm-linux-gcc 跟 GCC 所需的安装包不同,但仅仅是名字不同而已,这是为什么呢?
x86 跟 ARM 所使用的指令集是不一样的,所以所需要的 binutils 肯定不一样;上面提到过 gcc-core 是依赖于 binutils 的,自然 ARM 跟 x86 所使用的 gcc-core 包也不一样;glibc 一个 c 库,最终是以库的形式存在于编译器中,自然 ARM 所使用的 glibc 库跟 x86 同样也不一样,其它的依此类推。


arm-elf-gcc

arm-elf-gcc 跟 arm-linux-gcc 一样,也是是基于 ARM 目标机的交叉编译软件。但是它们不是同一个交叉编译软件,两者是有区别的,两者区别主要在于使用不同的 C 库文件。arm-linux-gcc 使用 GNU 的 Glibc,而 arm-elf-gcc 一般使用 uClibc/uC-libc 或者使用 RedHat专门为嵌入式系统的开发的C库newlib。只是所应用的领域不同而已,Glibc是针对PC开发的,uClibc/uC-libc是与Glibc API兼容的小型化C语言库,实现了Glibc部分功能。


B2.  arm-linux-gcc 下载

        下载地址: http://download.csdn.net/detail/zlyong0018/4646377#comment

      

B3. 解压arm-linux-gcc

cd usr/local
sudo mkdir arm
sudo chmod 777 arm
cp ~/develop/sw/arm-linux-gcc-4.4.3.tar.gz /usr/local/arm/arm-linux-gcc-4.4.3.tar.gz
cd arm
tar zxvf arm-linux-gcc-4.4.3.tar.gz
rm arm-linux-gcc-4.4.3.tar.gz
cp -r /usr/local/arm/opt/FriendlyARM/toolschain/4.4.3  /usr/local/arm/4.4.3
sudo rm -rf opt

B4. 配置环境变量

sudo vi /etc/profile
在文档末尾增加

export PATH=$PATH:/usr/local/arm/4.4.3/bin

B5. 启用

source /etc/profile


B6.  测试

arm-linux-gcc -v

出现以下内容则成功

Using built-in specs.
。。。。
Thread model: posix
gcc version 4.4.3 (ctng-1.6.1)

B7. 问题1


若centos系统为64位时,则会提示一下内容: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

解决:
yum install glibc.i686

B8  问题2

error while loading shared libraries: libz.so.1:  cannot open shared object file: No such file or directory

解决:

 yum install zlib.i686

B9. 问题3

/libexec/gcc/arm-none-linux-gnueabi/4.4.3/cc1: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

yum -y install libstdc*

B10: 安装完之后还是重启一下linux吧(推荐)


C. make: arm-none-linux-gnueabi-gcc:命令未找到

C1. 官网: https://www.mentor.com/embedded-software/downloads/scb-evaluation

        其他下载地址: 

         http://download.csdn.net/download/chelseablue1905/9600059
         http://download.csdn.net/detail/chelseablue1905/9600062

C2: 解压到  /usr/local/arm/gnueabi-gcc

注意:

.tar.gz     格式解压为          tar   -zxvf   xx.tar.gz
.tar.bz2   格式解压为          tar   -jxvf    xx.tar.bz2


分包解压:

cat 1234.tar.bz2aa  1234.tar.bz2ab 1234.tar.bz2ac > 1234.tar.bz2  或  cat 1234.tar.bz2a* > 1234.tar.bz2

tar -jxvf 1234.tar.bz2



C3. 配置环境变量

sudo vi /etc/profile
在文档末尾增加
export PATH=$PATH:/usr/local/arm/gnueabi-gcc/bin
C4. 启用

source /etc/profile

C5:测试

arm-none-linux-gnueabi-gcc -v
C6:最好重启LInux(建议)

























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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值