一. 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.0 | OpenJDK 7 |
Android 2.3.x至Android 4.4.x | Oracle JDK 6 |
Android 1.5至Android 2.2.x | Oracle JDK 5 |
2) 使用OracleJDK
A. 删除默认的安装的OpenJdk-----查找
rpm -qa | grep jdk
LInux一般默认安装的是OpenJDK,我们卸载OpenJDK,改用Oracle的JDK
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
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(建议)