往期文章传送口
从零开始分析AOSP源码(一)——源码下载与编译
配置环境
操作系统: Ubuntu 16.04.5 LTS (lsb_release -a
可查)
Android Studio版本: 3.2 (Build 181.5540)
0x00 Android Studio下载安装
下载安装有三种方法, 前两种方法需梯子:
- 命令行下载安装:
-
安装:
sudo apt-add-repository ppa:paolorotolo/android-studio sudo apt-get update sudo apt-get install android-studio
-
卸载:
sudo apt-get install ppa-purge # Now use the PPA Purge to purge the installed PPA: sudo apt-get remove android-studio sudo ppa-purge ppa:paolorotolo/android-studio
- 在
Ubuntu Software
下载:
-
首先要装好snap:
$ sudo apt update $ sudo apt install snapd $ sudo apt install snapcraft build-essential
-
应用商城搜索
Android Studio
下载安装.
- 直接下载压缩包(推荐)
- 下载地址: https://developer.android.google.cn/studio/ (无需翻墙)
- 下载好之后, 解压. 我是在
home
目录下新建了一个Android
目录, 将下载好的安装包解压在里面. 解压好之后, 进入android-studio/bin
, 执行./studio.sh
.即可打开Android studio.
0x02 配置SDK
配置sdk也挺坎坷的, 长城墙真的是各种xx(cao dan). 如果没有这堵墙, 可能就不会栏掉一些潜在的猿吧.
- 首先, 我开了shadowsock, 在Android studio上配好了代理:
Settings -> HTTP Proxy
Host name: 127.0.0.1 Port: 80. 如下:
代理如上
然而这样就成功了, 可以愉快的下载sdk了? 等了我将近一小时, 进度条还是刚开始的那个进度条... 北京的墙, 更甚. 然后试着用国内的代理, 全都没有用...有师傅成功用上的, 欢迎分享出来, 可能是我太菜了吧. - 尝试了各种方法, 无果, 最后只好找国内的sdk离线包, 解压到:
~/Android/Sdk
下. 然后cd tools
, 运行./android
. 这是Linux的SDK Manager. 没挂代理, 居然能全速下载...
SDK Manager
-
下载好SDK之后, 打开Android studio, 进入sdk管理哪里, 设置sdk路径.
- 下载ndk. (也在sdk离线包这里下载), 下载好之后解压到
Sdk
目录, 修改文件名为ndk-bundle
, SDK Manager会自动识别ndk. 至此, SDK目录的文件如下:
SDK目录
0x03 配置gradle环境
新建好project之后, 还是绕不过代理的坎(准确来说, 牛逼的墙), 废话不说了.
方法一
找到项目工程里的build.gradle
文件, 修改为如下配置(注意, 只修改repositories):
buildscript {
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
// google()
// jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
maven { url 'https://plugins.gradle.org/m2/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
// google()
// jcenter()
}
}
方法二
- 可以直接从官网那里下载gradle: https://gradle.org/releases/, 根据工程所需要的版本下载, 下载好之后:
$ mkdir /opt/gradle
$ unzip -d /opt/gradle gradle-4.10.2-bin.zip
$ ls /opt/gradle/gradle-4.10.2
LICENSE NOTICE bin getting-started.html init.d lib media
- 配置环境变量:
$ export PATH=$PATH:/opt/gradle/gradle-4.10.2/bin
放一张成功编译demo的图:

到了这里, 环境搭建已经告一段落, 下面要真正导入模块了.
0x04 正式模块编译
跟上一篇编译源码的前面步骤一样, 先执行如下操作:
- 初始化
source build/envsetup.sh
# 如果只是为了导入AS(Android Studio)版本随意选
lunch aosp_x86_64-eng
# 已经在前面make过了, 就不用再次make整个工程了
- 单模块编译
# 在aosp根目录下执行
mmm development/tools/idegen/
知道看到绿色的绿色的#### make completed successfully ####
, 说明编译成功, 进行下一步.
- 生成
android.iws, android.ipr, android.iml
(Android Studio需要)
ks@ks:~/Android/aosp$ sudo ./development/tools/idegen/idegen.sh
Read excludes: 5ms
Traversed tree: 29504ms
- 在Android Studio上:
File -> Open... -> /home/[username]/Android/aosp/android.ipr
, 导入刚刚编译在aosp根目录下的android.ipr
, Android Studio会自动根据android.iml
里的配置导入aosp里的各个包. 由于aosp整个工程太大, 全部导入估计要等半天, 电脑也吃不消. 所以要对其做一下"瘦身", 把一些不必要的文件删掉. 以下对android.iml
做简要说明:
其实
iml
文件总的来说, 只有三个比较重要的标签, 分别如下:
- <sourceFolder/>: 表示源码的目录, 初始化未修改的
iml
文件包含aosp目录下所有的文件. 通常我们只关心需要分析的一些目录, 把一些不需要分析的目录删掉以加快索引的速度.- <excludeFolder/>: 表示要排除的目录, 即不去索引的目录. 所以, 一般我们直接在这里添加不索引的目录即可.
- <orderEntry/>: 这个目录是一些
lib
文件(即jar
包).
或者我们可以直接在Android Studio添加这些exclude的规则:
在Android Studio视图下, 按Ctrl + Alt + Shift + s
, 打开Project Structure
. 再点击最左侧的Modules
即可打开管理界面. 在这里可以看到被exclude的文件目录, 及索引的所有目录. 如下图:

选择你想要分析的文件夹之后, 就等着索引完成吧!
我的
android.iml
文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<module relativePaths="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/frameworks/base/core/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/frameworks/base/packages" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
<excludeFolder url="file://$MODULE_DIR$/external/chromium" />
<excludeFolder url="file://$MODULE_DIR$/external/emma" />
<excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
<excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
<excludeFolder url="file://$MODULE_DIR$/external/webkit" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/tests" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/tools" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/phoenix" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/vendor" />
</content>
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="inheritedJdk" />
</component>
</module>
最后, 放一张成功导入的截图:

补充
如果在导入Android Studio遇到android.iml
无法修改的问题, 可进行如下操作:
第3步只能用了
sudo ./development/tools/idegen/idegen.sh
才能操作, 但是这在后面会有问题(Android Studio需要读写这些文件), 所以需要change ownner
, 操作如下:sudo chown ks android.iml
再看一下权限就好了:
ks@ks:~/Android/aosp$ ll | grep "android*" -rw-r--r-- 1 ks ks 764774 9月 26 23:22 android.iml -rwxrwxrwx 1 ks ks 16569 9月 26 23:22 android.ipr* -rw-rw-r-- 1 ks ks 13908 9月 26 22:00 android.iws
0x05推荐链接
Android系统架构概述: https://source.android.com/devices/architecture
AOSP导入Android Studio参考链接: https://www.jianshu.com/p/abd8d7a074fd
sdk国内站下载(东软信息学院镜像站): http://mirrors.neusoft.edu.cn/android/repository/
让人舒服的12款Android Studio代码主题: https://download.csdn.net/download/c1010637252/10698352
网友评论