下载AOSP android源码(最小最快下载方式,跳过编译直接导入Android Studio) Ubuntu 16.04

1字数 3702阅读 14553

(时间:2017年/2月/20日 状态:依然是菜鸟)
首先,谢谢这些大爷的博客帮助我这个菜鸟,贴出链接。
使用Android Studio导入源码
利用 Android Studio 阅读 Android 源码
idegen:一个角落里的法器
下载阅读android源码笔记
如何使用Android Studio开发/调试Android源码
Android Studio导入Android源码
使用Android studio阅读Android源码
mac 上的android源码下载编译查看
Dev Env Note Url 7
Android Sync 同步 源码问题解决方案
自己动手编译Android源码(超详细)
[Android编译(二)] 从谷歌官网下载android 6.0源码、编译并刷入nexus 6p手机](http://blog.csdn.net/fuchaosz/article/details/52473660)
Ubuntu 16.04 LTS 下编译 CM 源码
Tips of “repo sync” ofAndroid
Build LineageOS/CM/AOSP on Ubuntu
Ubuntu16.04编译android6.0源代码
Repo: Tips & TricksLearn about the repo tool , manifests and local manifests and 5 important tips !

基本上该试的都试过了,下面都是“取其精华去其糟粕”的结果。

总步骤简介:

总步骤一(准备编译环境)
总步骤二(下载源码的三种方式)(只看frameworks/base源码的,直接到第二种下载方式)
总步骤三(免编译将源码导入Android studio)

总步骤一:准备环境

英文好的大爷可以直接去安卓官网 Requirements | Android Open Source Project
我是在Ubuntu 16.04下进行的一些列操作。

安装OPEN JDK、启用默认jdk为open jdk

  1. 官网介绍说,7.0到主分支用open jdk8,俺就装open jdk8



    在Terminal输入命令行

sudo apt-get update
sudo apt-get install openjdk-8-jdk
  1. 如果你还还装了oracle jdk,需要将open jdk切换为默认jdk。
sudo update-alternatives --config java
sudo update-alternatives --config javac

安装编译需要的依赖包(就看看代码不编译的朋友,直接跳过,直接看下代码方式(二)或(三))

  1. 安卓官网只说了Ubuntu 14.04需要的依赖包,如下图。
  2. 然而这个博客说盲目相信官网就too young too simple了,下面是Ubuntu 16.04需要的依赖包。
sudo apt-get install libx11-dev:i386 libreadline6-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

一行一行输入就行。

有些依赖包安装失败的解决办法

  1. 无法获取安装包



    图中显示libxml2-utils_2.9.4-1+deb.sury.org~xenial+2_amd64.deb 找不到,无法直接安装。解决方法

  • 直接google搜索 libxml2-utils_2.9.4-1+deb.sury.org~xenial+2_amd64.deb 下载对应的deb文件
  • 使用命令
cd downloads  //进入deb包所在目录
sudo dpkg -i --ignore-depends=libxml2-utils libxml2-utils_2.9.4-1+deb.sury.org-xenial+2_amd64.deb 

进行强制安装,问题解决

  1. 安装包与已经安装的包冲突
    再次遇到不能安装依赖库的问题,不过这次不是获取不到包,而是与已经安装的包冲突,卸载那个包就行了


    如图,说zconf.h已经在zlib1g-dev包里面了,安装lib32z1-dev失败

  • 卸载zlib1g-dev:i386
sudo apt remove  zlib1g-dev:i386
  • 重新执行安装lib32z1-dev命令
cd downloads
sudo dpkg -i --ignore-depends=lib32z1-dev lib32z1-dev.deb 

总步骤二:下载源码

下载源码方式(一),官方方法,最慢,直接看方式(二)吧

repo是啥?

  • 就我目前的理解而言,就是简化git操作的一个工具集合,因为aosp是个超大的项目,整个project下面又有N多个小project,如果只用git命令来操作,输命令就够烦的了,所以谷歌弄了个repo,估计一条repo命令执行了N多的git命令。

下载安装repo

  1. 确保在你的home下面又bin目录,并且把bin目录添加到PATH环境变量中。
 mkdir ~/bin
 PATH=~/bin:$PATH
  1. 下载repo工具,并确保工具可以被执行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

谷歌AOSP官网的Installing Repo

初始化repo客户端

  1. 创建一个文件夹来放源码文件,然后进入该文件夹,名字随便取
mkdir WORKING_DIRECTORY //我写了mkdir aosp,初始化repo客户端的操作都保持在这个目录下
cd WORKING_DIRECTORY
  1. 下载认证(不认证的话,下着下着就断开,谷歌用来防止恶意下载的)
  2. 注册谷歌账户Google account,一般都有吧。。。。
  3. 设置git默认用户名和邮箱,名字就是谷歌账户名(有个帖子说名字随便,谷歌官网也没说到底是不是谷歌账户名),邮箱就必须是谷歌账户Gmail.com的邮箱了。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
  1. 用强制认证的方式进行repo init操作
    谷歌AOSP官网 Initializing a Repo client
- [the password generator](https://android.googlesource.com/new-password)  进入后登录自己谷歌账户,生成密码,我也不知道怎么解释,照做就是了。进入后如下图所示:

生成的三行代码一次copy进Terminal执行就行了。

- 确定要下载的Android版本

从官网看Source Code Tags and Builds看自己想下哪个版本,Branch一栏就是需要用到的版本号了。

- 以强制认证的方式访问并初始化repo

这个URL比正常的URL多了一个/a,官网非强制认证的URL是这样的:https://android.googlesource.com/platform/manifest
下面是我们要用到的,其中的-b代表branch,就是上一步你自己调的最顺眼的版本号。我挑了个android-7.1.1_r46

repo init -u https://android.googlesource.com/a/platform/manifest -b android-7.1.1_r46

如果初始化成功,在aosp文件夹下,CTRL+H显示隐藏文件应该有.repo文件夹,有就成功了。

开始下载源码

  1. 直接repo sync会失败,由于你懂得原因,需要breakwa1l,建议自己买个服务器自己上SS,然后在Terminal里的命令行是不会通过SS联网的,使用SS + ProxyChains的组合可以让命令行里执行的命令也走SS,具体ProxyChains各位怎么安装使用,自己搜吧。
proxychains repo sync //proxychains保证repo sync命令走SS,可以访问谷歌服务器

但是还是会因为各种原因导致下载终端,简单执行上面这个命令不可行,看下面一步。

  1. 这个博文里的脚本自动下载,(下面的我直接COPY他的博文的)
    由于下载过程中还会遇到各种各样的问题,所以我们需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,在aosp文件夹下创建一个脚本down.sh,(自己在aosp文件夹创建down.sh文件,然后用编辑器打开,copy代码进去保存就行)代码如下:
#!/bin/bash
repo sync  -j8 
while [ $? = 1 ]; do  
        echo “======sync failed, re-sync again======”  
        sleep 3  
        repo sync  -j8
done 

因为要FANQIANG,在repo sync前加上proxychains,改成如下所示

#!/bin/bash
proxychains repo sync  -j8
while [ $? = 1 ]; do  
        echo “======sync failed, re-sync again======”  
        sleep 3  
       proxychains repo sync  -j8
done 

然后命令行执行,就是开始刚创建的脚本了,等吧,5-6个小时总会下完的。(注意:Terminal要在aosp文件夹下)

chmod a+x down.sh
./down.sh

这个方式下载太磨时间了,别用了。


<br /><br />

下载源码的方式(二),清华 / 科大方案,速度爆表

从清华服务器下载repo并安装

清华repo镜像

  1. 确保在你的home下面又bin目录,并且把bin目录添加到PATH环境变量中。
 mkdir ~/bin
 PATH=~/bin:$PATH
  1. 从清华镜像下载repo工具,并确保工具可以被执行
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
  1. 让repo工具自己通过清华镜像更新“repo工具本身”,好TM拗口。。
  • repo的运行过程中会尝试访问官方的git源更新自己,如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bashrc文件里面。
  • 新手:如何打开这个文件?
    答:在HOME文件夹下,CTRL+H显示隐藏文件,搜索.bashrc就行。打开后复制下面的地址并保存文件。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

下载源码

  1. 如果是搞开发的估计会用最新的代码,那么直接下载最新的压缩包
    下载初始化包并解压(相当于直接把下载方式(一)中repo sync操作下载的文件打成压缩包直接从国内地址下载了,速度超快,我这儿速度有4m/s)
  • 清华镜像下载地址: https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
  • 下载后解压就行,解压出来文件夹名称是aosp,只有一个.repo文件夹,就是仓库,代码都在里面
  • 导出代码
    cd aosp
    repo sync -l  // -l就是只导出代码到本地,不通过网络更新代码
    repo sync -n  // -n就是只通过网络更新代码啦
    repo sync //正常同步
    
  1. 如果像我这种小白,只想看看某个版本代码
  • aosp官网的源码列表选则自己要下的版本号,我依然选择:android-7.1.1_r46

  • 新建一个文件夹aosp,然后进入

    cd aosp 
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.1_r46 
    
  • 如果只是想看frameworks/base的代码
    虽然是国内镜像,但依然会出错停止,所以我们还是需要创建一个自动下载脚本,确保出错了之后会自动执行repo sync,在aosp文件夹下创建一个脚本down.sh,(自己在aosp文件夹创建down.sh文件,然后用编辑器打开,copy代码进去保存就行)代码如下,这个-j 8可以自己改,你的CPU总线程数*2:

     #!/bin/bash
     repo sync -j 8  
     while [ $? = 1 ]; do  
             echo “======sync failed, re-sync again======”  
             sleep 3  
             repo sync  -j 8 
     done 

把上面的的两行repo sync -j 8替换成下面的语句

repo sync platform/development platform/frameworks/base platform/packages/apps/Calculator -j 8
  • repo sync命令后面可以指定要同步的project,上面这行命令就是指定啦3个project
    打开.repo/manifest.xml,可以看到project的名字和路径,我们要看的frameworks/base下的代码的project名字如图所示,那就在repo sync后面指定就好啦。


    这个development必须要下载,用于生成导入android studio的配置文件
    如果要看packages/apps目录下的内置app的源码,也可以选择下载,上面我们下载的是Calculator,你想下载哪个就指定哪一个就可以啦

  • 想要同步整个AOSP,sync后不用指定project

    #!/bin/bash
    repo sync  -j 8  
    while [ $? = 1 ]; do  
            echo “======sync failed, re-sync again======”  
            sleep 3  
            repo sync  -j 8 
    done 
    

    然后命令行执行,就开始下载啦。(注意:Terminal要在aosp文件夹下)

    chmod a+x down.sh
    ./down.sh
    

<br /><br />

下载源码的方式(三),直接下载国内网友打包好的单独源码文件

为啥

  1. aosp文件夹下的.repo文件是仓库
  2. 除了.repo文件夹以外的文件才是真正需要的源码文件
  3. .repo超级大
  4. 别人打包的都是下载完成后删除.repo的压缩包,我把android-7.1.1_r46所有代码压缩了一下,9个G左右,还没上传,但网上有很多,各位自己搜搜看。虽然9个G比下载方式(二)的初始化包的24G要小很多,但是呢,百度网盘太坑爹,速度很慢,在我这儿反而下清华镜像的24G初始化包更快。
  5. 找到一个哥们分享的从1.6到7.1.1的所有源码压缩包 http://pan.baidu.com/s/1ngsZs

关于repo的一些技巧:

  1. 从自己已经下载的AOSP切换到国内清华源
  2. 如果repo sync失败该怎么做 Android Sync 同步 源码问题解决方案

总步骤三:编译源码(其实并不需要编译)并导入Android Studio

文章开头贴出的N个博客都说道了下面三种方式。

  1. (编译得10多个小时,神经病啊,不干,只说下面两种)编译所有源码 --- 生成idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入
  2. 只下载某一部分代码 --- 下载别人分享的idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入
  3. 编译idegen生成属于自己本地这套代码的idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入

用idegen生成Android Studio导入用的配置文件

  1. 如果你自己下啦完整的AOSP,那么cd aosp 进入源码根目录,然后执行下面的命令
source build/envsetup.sh 
make idegen  //生成idegen.jar
  1. 如果只下载啦frameworks/base或其他部分代码,用别人的idegen.jar也行
    也可以下载idegen.jar移动到/out/host/linux-x86/framework/目录下,没有目录用下面命令
mkdir -p ./out/host/linux-x86/framework 
idegen.jar 目录
  1. 使用idegen.jar来生成配置文件
    在aosp目录下,执行下面命令,生成ide导入所需的.ipr/.iml文件
development/tools/idegen/idegen.sh 

成功之后就会产生两个用于IDE(Android Studio)导入的文件,如下图所示


  1. 导入前,IDE需要设置大内存
    ANDROID_STUDIO_HOME/bin/studio64.vmoptions
    中设置
-Xms1280m
-Xmx1280m
  1. 修改android.iml,排除不想导入的部分,加快导入速度
    (将自己不用的代码去掉)
    就像下面摘取的android.iml文件1887行开始的这些一样(不导入的写成exclude):
<sourceFolder url="file://$MODULE_DIR$/./sdk/testapps/userLibTest/src" isTestSource="true"/>
<sourceFolder url="file://$MODULE_DIR$/./tools/external/fat32lib/src/main/java" isTestSource="false"/>
<excludeFolder url="file://$MODULE_DIR$/out/eclipse"/>
<excludeFolder url="file://$MODULE_DIR$/.repo"/>
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth"/>
<excludeFolder url="file://$MODULE_DIR$/external/chromium"/>
<excludeFolder url="file://$MODULE_DIR$/external/icu4c"/>
<excludeFolder url="file://$MODULE_DIR$/external/webkit"/>
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/host"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates"/>
<excludeFolder url="file://$MODULE_DIR$/out/target/product"/>
<excludeFolder url="file://$MODULE_DIR$/prebuilt"/>

也可以通过Android Studio的Project Stucture 打开左侧Modules,然后将右侧Sources中一些目录Excluded掉。

  1. 然后就直接Android studio ---- 打开存在的工程 --- 选择aosp文件夹下生成的那个Android.ipr文件导入就行了。


导入后 配置Android Studio

设置AOSP工程的JDK跳转到当前AOSP源码文件中已经存在的.java文件,而非我们之前安装的JDK。

为啥?
下载的aosp源码中已经包含了用到的所有jdk.java文件,不需要依赖我们安装的openjdk

  • 设置工程目录样式为Project


  • 选择Project Structure


  • project structure --- SDKs --- 左上角“+”号新建JDK --- 取个名字叫1.8(No Libraries) --- 删除Classpath和Sourcepath下的所有东西(右边“-”号删除)

  • 设置sdk依赖新建的“1.8(No Libraries)”



解决代码调试时跳转到.class文件而非源码中的.java文件
  • 打开Project Structure---Modules---Dependencies


  • 选择第一个.jar包,然后下拉倒最下面,按SHIFT选择到<Module source>之前,点击右侧的下移图标



    点两次,把最下面两个(分别对应源码文件和没有指向本地JDK的SDK)依赖移动到最上面点击OK,然后代码调试就会先找源码中的.java了,而非下面的一堆.jar。



    (大部分博客都说删除其他的依赖,只剩下上图中的前两个,但是我这么做后,源码文件打开会看到一片红,R文件找不到等等,所以我的做法是不删除任何jar包,直接把<Module source>和API Platform移动到其他jar包之前,让studio先从源码文件夹找.java文件)

让Android studio把当前工程看成Android工程,让aosp工程可以进行DEBUG调试,同样在Project Structure中设置

点击“+”号,选择Android-APK --- 点击ok就行了


External file changes sync may be slow 怎么解决

直接按照其给定的解决方法来解决就行。


至此,AOSP源码就导入完毕了,你可以开始打断点看源码了!!

推荐阅读更多精彩内容