(时间: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
-
官网介绍说,7.0到主分支用open jdk8,俺就装open jdk8
在Terminal输入命令行
sudo apt-get update
sudo apt-get install openjdk-8-jdk
- 如果你还还装了oracle jdk,需要将open jdk切换为默认jdk。
sudo update-alternatives --config java
sudo update-alternatives --config javac
安装编译需要的依赖包(就看看代码不编译的朋友,直接跳过,直接看下代码方式(二)或(三))
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
一行一行输入就行。
有些依赖包安装失败的解决办法
-
无法获取安装包
图中显示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
进行强制安装,问题解决
-
安装包与已经安装的包冲突
再次遇到不能安装依赖库的问题,不过这次不是获取不到包,而是与已经安装的包冲突,卸载那个包就行了
如图,说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
- 确保在你的home下面又bin目录,并且把bin目录添加到PATH环境变量中。
mkdir ~/bin
PATH=~/bin:$PATH
- 下载repo工具,并确保工具可以被执行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化repo客户端
- 创建一个文件夹来放源码文件,然后进入该文件夹,名字随便取
mkdir WORKING_DIRECTORY //我写了mkdir aosp,初始化repo客户端的操作都保持在这个目录下
cd WORKING_DIRECTORY
- 下载认证(不认证的话,下着下着就断开,谷歌用来防止恶意下载的)
- 注册谷歌账户Google account,一般都有吧。。。。
- 设置git默认用户名和邮箱,名字就是谷歌账户名(有个帖子说名字随便,谷歌官网也没说到底是不是谷歌账户名),邮箱就必须是谷歌账户Gmail.com的邮箱了。
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
- 用强制认证的方式进行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文件夹,有就成功了。
开始下载源码
- 直接repo sync会失败,由于你懂得原因,需要breakwa1l,建议自己买个服务器自己上SS,然后在Terminal里的命令行是不会通过SS联网的,使用SS + ProxyChains的组合可以让命令行里执行的命令也走SS,具体ProxyChains各位怎么安装使用,自己搜吧。
proxychains repo sync //proxychains保证repo sync命令走SS,可以访问谷歌服务器
但是还是会因为各种原因导致下载终端,简单执行上面这个命令不可行,看下面一步。
- 用这个博文里的脚本自动下载,(下面的我直接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并安装
- 确保在你的home下面又bin目录,并且把bin目录添加到PATH环境变量中。
mkdir ~/bin
PATH=~/bin:$PATH
- 从清华镜像下载repo工具,并确保工具可以被执行
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
- 让repo工具自己通过清华镜像更新“repo工具本身”,好TM拗口。。
- repo的运行过程中会尝试访问官方的git源更新自己,如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的~/.bashrc文件里面。
- 新手:如何打开这个文件?
答:在HOME文件夹下,CTRL+H显示隐藏文件,搜索.bashrc就行。打开后复制下面的地址并保存文件。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
下载源码
- 如果是搞开发的估计会用最新的代码,那么直接下载最新的压缩包
下载初始化包并解压(相当于直接把下载方式(一)
中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 //正常同步
- 如果像我这种小白,只想看看某个版本代码
从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的配置文件
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 />
下载源码的方式(三),直接下载国内网友打包好的单独源码文件
为啥
- aosp文件夹下的.repo文件是仓库
- 除了.repo文件夹以外的文件才是真正需要的源码文件
- .repo超级大
- 别人打包的都是下载完成后删除.repo的压缩包,我把android-7.1.1_r46所有代码压缩了一下,9个G左右,还没上传,但网上有很多,各位自己搜搜看。虽然9个G比
下载方式(二)
的初始化包的24G要小很多,但是呢,百度网盘太坑爹,速度很慢,在我这儿反而下清华镜像的24G初始化包更快。 - 找到一个哥们分享的从1.6到7.1.1的所有源码压缩包 http://pan.baidu.com/s/1ngsZs
关于repo的一些技巧:
- 从自己已经下载的AOSP切换到国内清华源
- 如果repo sync失败该怎么做 Android Sync 同步 源码问题解决方案
总步骤三:编译源码(其实并不需要编译)并导入Android Studio
文章开头贴出的N个博客都说道了下面三种方式。
- (编译得10多个小时,神经病啊,不干,只说下面两种)编译所有源码 --- 生成idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入
- 只下载某一部分代码 --- 下载别人分享的idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入
- 编译idegen生成属于自己本地这套代码的idegen.jar --- 执行idegen.sh生成android.ipr/android.iml --- Android sutdio导入
用idegen生成Android Studio导入用的配置文件
- 如果你自己下啦完整的AOSP,那么cd aosp 进入源码根目录,然后执行下面的命令
source build/envsetup.sh
make idegen //生成idegen.jar
- 如果只下载啦
frameworks/base
或其他部分代码,用别人的idegen.jar也行
也可以下载idegen.jar移动到/out/host/linux-x86/framework/
目录下,没有目录用下面命令
mkdir -p ./out/host/linux-x86/framework
- 使用idegen.jar来生成配置文件
在aosp目录下,执行下面命令,生成ide导入所需的.ipr/.iml文件
development/tools/idegen/idegen.sh
成功之后就会产生两个用于IDE(Android Studio)导入的文件,如下图所示
- 导入前,IDE需要设置大内存
在ANDROID_STUDIO_HOME/bin/studio64.vmoptions
中设置
-Xms1280m
-Xmx1280m
- 修改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掉。
-
然后就直接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 怎么解决
直接按照其给定的解决方法来解决就行。