我正在参加「启航计划」

前言

  首要说说为什么要编译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

Android 编译Android7.0版本源码

整理之后就很干净了,下面咱们来编译源码,运用 envsetup.sh 脚本初始化环境,输入指令:

source build/envsetup.sh

Android 编译Android7.0版本源码

这儿的source能够用点来代替,指令如下:

. build/envsetup.sh

Android 编译Android7.0版本源码

作用是相同的,唯一的优势便是让你少打几个字母,狗头诙谐,下面咱们要挑选编译的方针,输入指令:

lunch

  输入之后,回车看到有许多的编译架构版别,这个和你运用的Android源码版别有关,或许比这个多,也或许比这个少,如下图所示。

Android 编译Android7.0版本源码

  然后便是挑选方针版别了,这个当地你需求注意一点那便是,你对接的客户用的是什么版别的源码,那么你坚持共同就能够了,这儿的体系架构也坚持共同,上面的数字后回车即可,不输入,回车便是第一个,这儿我就直接回车了。

Android 编译Android7.0版本源码

  回车之后能看到将要编译的一些信息,假如你能清楚的知道你的Android源码中有哪些架构,而且你能够清楚的知道所需求的架构,那么你能够这样输入,指令如下:

lunch aosp_arm-eng

  就少了一个选中的进程,下面咱们就能够正式编译源码,编译的语句也有多种,比方

m

或许

make -j8

  运用 m 构建一切内容。m 能够运用 -jN 参数处理并行使命。假如您没有供给 -j 参数,构建体系会主动挑选您认为最适合您体系的并行使命计数。-j表明线程数,后面的8便是8个线程,你能够改成其他的线程数,最好是在你的电脑的可承受范围内,这儿指的是你的虚拟机所分配的线程。

  回车即可进入编译,当然了编译也不是一往无前的,你或许会遇到这样或许那样的问题,你能够评论区提一下,我看到了,为你解答。

Android 编译Android7.0版本源码
编译完结了,25分钟,实际上没有怎样快,这是由于之前编译到一半报错了,然后把报错的信息处理之后持续编译,整体时刻大概是1个小时左右,下面咱们发动虚拟机。

5. 发动模拟器

emulator

回车等候,虚拟机发动。

Android 编译Android7.0版本源码

这就发动好了。

四、编译中的问题

  首要你要知道不同的Android版别源码编译方式不同,比方你Android10.0能够编译过,可是不一定Android7.0就能编译过,要因地制宜。

Android 编译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

回车,这是为了去除一切本地化的设置,让指令能正确履行。

Android 编译Android7.0版本源码

③ 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

Android 编译Android7.0版本源码
下面咱们将这个TLSv1和TLSv1.1给删掉,按A键进入修改模式,删掉后如下图所示:
Android 编译Android7.0版本源码
按Esc键退出修改模式,输入如下指令写入退出文件:

:wq

然后重启服务,在Android7目录下履行

cd /prebuilts/sdk/tools/

进入到tools目录下,履行:

./jack-admin kill-server && ./jack-admin start-server

这是先杀死服务,再发动服务。

Android 编译Android7.0版本源码

服务发动成功了,下面咱们回到Android7目录下,输入指令:

cd ~/Project/Android7

然后输入指令重新编译:

make -j8