从零开始分析AOSP源码(二)——AS导入源码

2018-09-27  本文已影响0人  Killshadow

往期文章传送口
从零开始分析AOSP源码(一)——源码下载与编译


配置环境
操作系统: Ubuntu 16.04.5 LTS (lsb_release -a可查)
Android Studio版本: 3.2 (Build 181.5540)

0x00 Android Studio下载安装

下载安装有三种方法, 前两种方法需梯子:

  1. 命令行下载安装:
  1. Ubuntu Software下载:
  1. 直接下载压缩包(推荐)

0x02 配置SDK

配置sdk也挺坎坷的, 长城墙真的是各种xx(cao dan). 如果没有这堵墙, 可能就不会栏掉一些潜在的猿吧.

  1. 首先, 我开了shadowsock, 在Android studio上配好了代理: Settings -> HTTP Proxy Host name: 127.0.0.1 Port: 80. 如下:
    代理如上
    然而这样就成功了, 可以愉快的下载sdk了? 等了我将近一小时, 进度条还是刚开始的那个进度条... 北京的墙, 更甚. 然后试着用国内的代理, 全都没有用...有师傅成功用上的, 欢迎分享出来, 可能是我太菜了吧.
  2. 尝试了各种方法, 无果, 最后只好找国内的sdk离线包, 解压到: ~/Android/Sdk下. 然后cd tools, 运行./android. 这是Linux的SDK Manager. 没挂代理, 居然能全速下载...
    SDK Manager
  3. 下载好SDK之后, 打开Android studio, 进入sdk管理哪里, 设置sdk路径.


  4. 下载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()
    }
}

方法二

  1. 可以直接从官网那里下载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
  1. 配置环境变量:
 $ export PATH=$PATH:/opt/gradle/gradle-4.10.2/bin

放一张成功编译demo的图:



到了这里, 环境搭建已经告一段落, 下面要真正导入模块了.


0x04 正式模块编译

上一篇编译源码的前面步骤一样, 先执行如下操作:

  1. 初始化
source build/envsetup.sh
# 如果只是为了导入AS(Android Studio)版本随意选
lunch aosp_x86_64-eng
# 已经在前面make过了, 就不用再次make整个工程了
  1. 单模块编译
# 在aosp根目录下执行
mmm development/tools/idegen/

知道看到绿色的绿色的#### make completed successfully ####, 说明编译成功, 进行下一步.

  1. 生成android.iws, android.ipr, android.iml(Android Studio需要)
ks@ks:~/Android/aosp$ sudo ./development/tools/idegen/idegen.sh 
Read excludes: 5ms
Traversed tree: 29504ms
  1. 在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的文件目录, 及索引的所有目录. 如下图:

Project Structure
选择你想要分析的文件夹之后, 就等着索引完成吧!
我的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无法修改的问题, 可进行如下操作:

  1. 第3步只能用了sudo ./development/tools/idegen/idegen.sh才能操作, 但是这在后面会有问题(Android Studio需要读写这些文件), 所以需要change ownner, 操作如下:

    sudo chown ks android.iml
    
  2. 再看一下权限就好了:

    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

上一篇 下一篇

猜你喜欢

热点阅读