我正在参加「启航计划」
前言
首要说说为什么要编译Android7.0的源码,由于当咱们去做体系定制开发的时分,就需求这么去做,举个例子,你们公司有一个客户是做电视机顶盒的,现在购买了你们公司的产品,要求你们公司供给相关的Android体系驱动,类似音频驱动、视频驱动之类的文件,能让这个文件再客户的机顶盒上正常运用,针对这个问题咱们要怎样做呢?
正文
首要咱们要做的便是得到客户机顶盒的Android版别,这很重要,由于Android每个版别都不相同,尽量坚持版别共同,现在我确认知道是Android7.0版别了,那么咱们首要要做的是什么呢?
一个字,干!问题是怎样开始?咱们不能像一个无头苍蝇相同,我说的是之前的自己,你想一下从应用开发跨度到Android驱动开发,我人都是懵的,首要说一下编译的前置条件。
一、前置条件
编译Android源码需求一些前置条件,这一点很重要,工欲善其事必先利其器,要提早预备好。
- 台式电脑
- 体系:Linux,Linux的话你能够运用Arch Linux或许Ubuntu版别,假如你是Window版别的话,那么就装个虚拟机,虚拟机里面装置Ubuntu,Ubuntu版别在 15.04以上,我目前是这么做的。
- 机型:尽量不要自己组装,最好购买品牌台式机,假如出问题有保证。
- 显现器:普通的1920×1080分辨率的就能够了。
- 运转内存:至少要16G,32G属于正常水平。
- 物理内存:固态硬盘,至少1T,2T属于正常水平。
- 处理器:i7或许更高。
- 内核:12核及以上。
满意上述条件,你再考虑编译Android源码。
二、编译预备
假定你现在已经预备好了,那么下面咱们能够打开Ubuntu的Term(指令行终端) 。
装置所需求的程序包:
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 ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
JDK,这儿是Android7.0源码,装置JDK1.8就能够了,更低的Android源码版别运用是1.7版别。
sudo apt-get install openjdk-8-jdk
三、下载编译源码
下载编译Android源码分为好几个步骤,下面咱们逐个来看。
1. 下载Repo
到这儿,咱们下载Repo,打开Ubuntu上的Terminal(终端)
,首要在根目录下创立一个bin目录,输入指令:
mkdir ~/bin
然后增加路径,输入指令:
PATH=~/bin:$PATH
下载Repo东西,这儿有两个地址,第一个是Google官方的,或许国内拜访没有那么顺畅,第一个是清华大学的一个源地址,比较好用,两个选其一几个,指令如下:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
下载好Repo东西之后,授予可履行权限,指令如下:
chmod a+x ~/bin/repo
2. 初始化库房
下面咱们初始化库房,这儿需求设置你的邮箱和称号,指令别离如下所示:
git config --global user.email "Your email"
修正成自己的邮箱
git config --global user.name "Your Name"
修正成自己的称号
下面配置repo,假如你是需求编译多个版别的Android源代码,在一开始就要做好分类,比方我或许需求Android7和Android10两个版别的代码,那么咱们能够在ubuntu的根目录下创立一个Project文件夹,输入指令:
mkdir Project
回车即可创立文件夹,然后进入到Project文件夹下,输入指令:
cd Project
回车进入到Project下,再创立一个Android7的文件夹,输入指令:
mkdir Android7
进入到Android7文件夹下,输入指令:
cd Android7
3. 同步远程代码
在Android7目录下,初始化repo,这儿根据下载源的不同,速度就会不相同,Android源码的每一个版别都有多个分支,-b表明分支,这儿下载的是android-7.0.0_r1分支下的源代码,同样有两个源,Google的源和清华的源,主张你运用第二个,速度会快一点,指令如下:
repo init -u https://android.googlesource.com/platform/manifest -b android-7.0.0_r1
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-7.0.0_r1
Repo初始化完结之后,咱们就能够同步远程代码了,输入指令:
repo sync
回车等候同步完结,这儿的同步时刻和你挑选的源以及网速有关,我同步了1个小时就完结了,主张你在晚上下班的时分同步,第二天上班说不定就同步完结了。
4. 编译源码
源码同步完结会有一个绿色的文字提示,会显现同步了多长时刻,假如你是赤色的表明有过错,那么你需求处理才行。
没有过错,咱们就能够进行编译了,你能够输入指令检查Android7中的文件,指令如下:
ls
这是检查文件,假如要检查修正时刻,指令如下:
ls -al
这个能够检查到文件的权限,修正时刻等信息,下面咱们输入指令整理一下,指令如下:
clear
整理之后就很干净了,下面咱们来编译源码,运用 envsetup.sh 脚本初始化环境,输入指令:
source build/envsetup.sh
这儿的source能够用点来代替,指令如下:
. build/envsetup.sh
作用是相同的,唯一的优势便是让你少打几个字母,狗头诙谐,下面咱们要挑选编译的方针,输入指令:
lunch
输入之后,回车看到有许多的编译架构版别,这个和你运用的Android源码版别有关,或许比这个多,也或许比这个少,如下图所示。
然后便是挑选方针版别了,这个当地你需求注意一点那便是,你对接的客户用的是什么版别的源码,那么你坚持共同就能够了,这儿的体系架构也坚持共同,上面的数字后回车即可,不输入,回车便是第一个,这儿我就直接回车了。
回车之后能看到将要编译的一些信息,假如你能清楚的知道你的Android源码中有哪些架构,而且你能够清楚的知道所需求的架构,那么你能够这样输入,指令如下:
lunch aosp_arm-eng
就少了一个选中的进程,下面咱们就能够正式编译源码,编译的语句也有多种,比方
m
或许
make -j8
运用 m 构建一切内容。m 能够运用 -jN 参数处理并行使命。假如您没有供给 -j 参数,构建体系会主动挑选您认为最适合您体系的并行使命计数。-j表明线程数,后面的8便是8个线程,你能够改成其他的线程数,最好是在你的电脑的可承受范围内,这儿指的是你的虚拟机所分配的线程。
回车即可进入编译,当然了编译也不是一往无前的,你或许会遇到这样或许那样的问题,你能够评论区提一下,我看到了,为你解答。
编译完结了,25分钟,实际上没有怎样快,这是由于之前编译到一半报错了,然后把报错的信息处理之后持续编译,整体时刻大概是1个小时左右,下面咱们发动虚拟机。
5. 发动模拟器
emulator
回车等候,虚拟机发动。
这就发动好了。
四、编译中的问题
首要你要知道不同的Android版别源码编译方式不同,比方你Android10.0能够编译过,可是不一定Android7.0就能编译过,要因地制宜。
比方说这个问题,处理的方法或许有多个,下面我会列出来,你能够设置一个编译一下,也能够都设置再编译。
① Jack-Server
Jack编译器东西是一套新的Android编译东西用来将Java代码转换为Android dex字节代码,你下载的7.0源码中有这个东西,切换工程根目录,输入以下指令检查当时是否有服务发动:
./prebuilts/sdk/tools/jack-admin list-server
假如没有的话,能够履行
cd prebuilts/sdk/tools
到tools目录下履行一下这个指令:
./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
然后发动服务,履行指令:
./jack-admin start-server
发动之后再检查一下,履行指令:
./jack-admin list-server
停止指令:
./jack-admin stop-server
② 本地化设置
回到Android7目录下,履行指令:
export LC_ALL=C
回车,这是为了去除一切本地化的设置,让指令能正确履行。
③ Communication error with Jack server (35), try ‘jack-diagnose’ or see Jack server log
在发动Jack-Server时提示这个过错,究其原因是新的Java版别禁用了TLSv1, TLSv1.1导致,修正java.security
文件,指令如下所示:
sudo vim /etc/java-8-openjdk/security/java.security
下面咱们将这个TLSv1和TLSv1.1给删掉,按A键进入修改模式,删掉后如下图所示: 按Esc键退出修改模式,输入如下指令写入退出文件:
:wq
然后重启服务,在Android7目录下履行
cd /prebuilts/sdk/tools/
进入到tools目录下,履行:
./jack-admin kill-server && ./jack-admin start-server
这是先杀死服务,再发动服务。
服务发动成功了,下面咱们回到Android7目录下,输入指令:
cd ~/Project/Android7
然后输入指令重新编译:
make -j8