AOSP Android 源码

AOSP(Android Open Source Project)Android 开源工程,是学习 Android 源码的大本营。本章主要介绍三个部分:

  • 准备编译环境
  • 下载源码
  • AndroidStudio 调试源码

准备编译环境

可以直接参考 Android 源码官网 Requirement | Android Open Source Project,目前已完成中文版的翻译。

安装 OpenJDK

官网要求 Android 7.0 主分支需要使用 openJDK 8,

安装Open JDK 8

sudo apt-get update
sudo apt-get install openjdk-8-jdk

如果主机还安装了 Oracle JDK,需要将 OpenJDK 切换为默认 jdk 。

切换默认 JDK

sudo update-alternatives --config jave
sudo update-alternatives --config javac

安装编译源码的依赖包

当然,如果只要求看看源码不需要编译的朋友,可以直接跳过此步骤。

  1. Android 官网介绍 Ubuntu 14.04 需要的依赖包,如下:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zliblg-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
  1. 然而盲目相信官网就 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

下载源码

下载源码主要分三个步骤:

  • 下载 Repo 工具
  • 下载源码

下载 Git Repo 工具

根据总所周知的原因,不论是 Android 源码还是 Google 提供的其他工具,在国内访问的速度极慢。因此国内各知名大学/公司提供了方便开源软件镜像站。

下面为大家介绍的是清华大学开源镜像站

Repo 介绍

Repo is a tool that we built on top of Git. Repo helps us manage the many Git repositories, does the uploads to our revision control system, and automates parts of the Android development workflow. Repo is not meant to replace Git, only to make it easier to work with Git in the context of Android. The repo command is an executable Python script that you can put anywhere in your path.

当前 repo 主要用于同步 AOSP、chromium 及 chromium OS。

下载

curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
chmod +x repo

为了方便可以将其拷贝到 PATH 里。

更新

repo的运行过程中会尝试访问官方的git源更新自己,如果想使用tuna的镜像源进行更新,可以将如下内容复制到你的 ~/.bashrc~/.profile 里。

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

重启终端模拟器或 source 脚本文件,以使其生效。

下载源码

使用每月更新的初始化包同步代码

由于首次同步需要下载约 30GB 数据,过程中任何网络故障都可能造成同步失败,我们强烈建议您使用初始化包进行初始化。

下载 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar,下载完成后记得根据 checksum.txt 的内容校验一下。

由于所有代码都是从隐藏的 .repo 目录中 checkout 出来的,所以我们只保留了 .repo 目录,下载后解压 再 repo sync 一遍即可得到完整的目录。

使用方法如下:

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下载初始化包
tar -xf aosp-latest.tar
cd AOSP   # 解压得到的 AOSP 工程目录
# 这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
repo sync # 正常同步一遍即可得到完整目录
# 或 repo sync -l 仅checkout代码

传统初始化方法

  • 建立工作目录
mkdir aosp
cd aosp
  • 初始化仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
  • 如果需要某个特定的 Android 版本(列表):
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1
  • 同步源码数(以后只需执行这条命令来同步)
repo sync

注意:由于原库太大,同步过程中时常会遇到意外导致同步中断。下面推荐一个下载脚本,帮助中断发生后会自动继续同步。

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

AndroidStudio 调试源码

生成 Android Studio 导入文件

生成 AndroidStudio 能够直接调试的源码有三种方法:

  1. 编译所有源码,生成 idegen.jar
  2. 只下载某一部分代码(下载别人分享的idegen.jar)
  3. 编译 idegen 生成属于自己本地这套代码的 idegen.jar

然后在执行 idegen.sh 生成 android.ipr/android.iml,最后导入 AndroidStudio 。

由于,方法一编译需要10多个小时,耗费大量的时间和硬件资源,所以只介绍后面两种方法:

用 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/igegen/idegen.sh

成功之后就会生成用于 Android Studio 导入的文件 android.iml/android.ipr 了。

导入源码

  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 跳转到源码文件,而非之前安装的 openJDK

  • 设置工程目录样式为 Project
  • 选择 Project Structure
  • project structure - SDKs - 新建JDK "No Libraries" - 删除 classpath 和 sourcepath 下所有内容
  • 设置 sdk 依赖为新建的 "1.8 (No Libraries)"

解决代码调试时跳转到 .class 而非 .java 文件

  • 打开 Project Structure - Modules - Dependencies
  • 选择 <Module source> 之前的所有 .jar 包,移动到依赖包的最后

设置 AOSP 为 Android Studio 工程,以供 Debug 调试

  • 打开 Project Structure - Modules - ADK
  • 点击 "+" 号,选择 Android-APK - 点击ok就行了

参考内容

[1] Android 开源工程 官网
[2] 清华大学开源镜像站-AOSP
[3] 简书“老沈Rosen-下载AOSP Android源码”

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容