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源码”

    原文作者:pangxuan2010
    原文地址: https://www.jianshu.com/p/4a845a65fa8a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞