美文网首页android基础TECH_ANDROID性能优化
把Android源码导入Android Studio进行调试

把Android源码导入Android Studio进行调试

作者: yotods | 来源:发表于2017-03-06 18:43 被阅读3375次

    现在很多公司已经抛弃了单纯App开发的模式,慢慢的走向了源码编译;通过修改Framework层的东西,达到自己想要的需求,但是问题也来了,我们不能像往常一样,通过import/open来编辑编译它;正如刚开始的我,一直在用Sublime来编辑,make命令来编译,手动导包,手动查找Api,那简直是噩梦!
    如题,直接进入正文!

    说一下我用的环境:Ubuntu14.04、openjdk1.7、Android Studio2.2、Android6.0源码

    这里先不说如何下载源码,直接从编译开始

    $ source build/envsetup.sh
    $ lunch aosp_flounder-userdebug(flounder:Nexus 9 flo Nexus 7二代 grouper Nexus 7一代)
    $ make -j8 ( 8代表CPU核数 )

    • 编译完之后,想要关联Android Studio,一下两步很重要:
    1. 第一步,这行命令的意思是编译idegen这个项目,生成idegen.jar文件。
      $ mmm development/tools/idegen/
      如果你看到了绿色的 #### make completed successfully ####,说明这步是ok的。
    2. 第二步,这行命令的意思是生成:android.iws, android.ipr, android.iml这个三个文件。
      $ sh ./development/tools/idegen/idegen.sh
      如果你看到类似这样的字样:
      Read excludes: 4ms
      Traversed tree: 14572ms
      说明是ok的,!!!这三个文件在根目录!!!
      android.iws 包含工作区的个人设置,比如打开过的文件,版本控制工具的配置,本地修改历史,运行和debug的配置等。
      android.ipr 一般保存了工程相关的设置,比如modules和modules libraries的路径,编译器配置,入口点等。
      android.iml 用来描述modules。它包括modules路径、 依赖关系,顺序设置等。一个项目可以包含多个 *.iml 文件。

    到了这里,就可以考虑导入到Android Studio中了。

    打开Android Studio --> File --> open --> 选中生成的android.ipr文件,确定后就会导入整个源码。

    导入之后,可以看到Android Studio下方,Indexing... 在以极慢的速度前进,So,为了加快读取速度,我们定义一些不需要读取的文件夹,比如 build、.repo、device、out 等等。

    打开 android.iml 文件。

    我们发现有2000~3000行,是非常多的,但是仔细的看,发现大标签只有三种
    <sourceFolder />
    <excludeFolder />
    <orderEntry />

    1. 关于<sourceFolder>标签:
      去除不需要debug的<sourceFolder/>标签内容,通常我们只需要frameworks和packages两个目录,所以保留这两个目录有关的标签就行,其他全部删掉,这样索引的速度就会加快了。
    2. 关于<excludeFolder>标签:
      exclude顾名思义就是不包含的意思。我们有很多目录直接就不想让Studio去管它,不管是索引还是什么等等,所以只需要将这些目录配置到<excludeFolder>中就好了。

    ** 我这里只保留了framworks和packages模块,将其他模块全部排除了,因此在android.iml中添加了以下配置: 剩下的都删了**

    <?xml version="1.0" encoding="UTF-8"?>
    <module version="4" relativePaths="true" type="JAVA_MODULE">
      <component name="ModuleRootManager" />
      <component name="NewModuleRootManager" inherit-compiler-output="true">
        <exclude-output />
        <content url="file://$MODULE_DIR$">
          <!--sourceFolder标签表示需要索引的代码目录-->
          <sourceFolder url="file://$MODULE_DIR$/frameworks/base/core/java" isTestSource="false" />
          <sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
          <!--excludeFolder标签表示这个目录下所有内容都不索引-->
          <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$/hardware" />
          <excludeFolder url="file://$MODULE_DIR$/libcore" />
          <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$/platform_testing" />
          <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
          <excludeFolder url="file://$MODULE_DIR$/sdk" />
          <excludeFolder url="file://$MODULE_DIR$/tools" />
          <excludeFolder url="file://$MODULE_DIR$/vendor" />
          <excludeFolder url="file://$MODULE_DIR$/toolchain" />
          <excludeFolder url="file://$MODULE_DIR$/system" />
          <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
          <excludeFolder url="file://$MODULE_DIR$/phoenix" />
        </content>
        
        <orderEntry type="sourceFolder" forTests="false" />
        <orderEntry type="inheritedJdk" />
        <orderEntryProperties />
      </component>
    </module>
    

    接下来就可以看源码了,而且没有报错,但是没有关联跳转,接下来我们解决这个问题。

    修改JDK + SDK

    ** 如图:我编译的版本是Android6.0,所以用JDK1.7编译,这里默认1.8,所以要换成1.7,删除多余的SDK **

    jdk1.8换1.7 - 1

    选中ClassPath下所有的内容删除(-号)


    jdk1.8换1.7 - 2

    修改名称,修改路径


    jdk1.8换1.7 - 3

    完成

    jdk1.8换1.7 - 4

    ** 修改SDK **
    如果这一栏有多余的内容,删除它,保留如图的2个就可以了。


    修改SDK-1

    这个地方,修改位对应的sdk就可以了!


    修改SDK-2

    然后就可以痛痛快快的搞源码了!

    END##

    相关文章

      网友评论

      • anvata:我参考AOSP官网指定了export OUT_DIR_COMMON_BASE目录,把编译输出的out文件夹放到了另一目录下,然后执行development/tools/idegen/idegen.sh命令的时候报如下错误信息,博主知道怎么回事吗
        find: 'out': No such file or directory
        Couldn't find idegen.jar. Please run make first.
      • 神天涯来了:为什么我编译成功后导入AS里面会报错
      • d2009507f42d:你好,请问你的android studio 是什么版本,我的3.0.1版本没有找到配置SDKs的地方,只有sdk location 可以选,很奇怪,能帮忙回答吗?
        yotods:其实最主要的还是 android.iml 这个文件,只要把这个配置好,大部分情况都可以用。我现在AS是3.0版本,之前是2.2,都是可行的。
      • 过期的薯条:调试源码中的app 能调试。。但是 调试system 文件下的init.cpp..该怎么去调试
        yotods:@过期的薯条 debug的话,最多只能到frameworks层,再深层次的就得用别的方法了。
      • 91efc6333274:不错,写的不错哦

      本文标题:把Android源码导入Android Studio进行调试

      本文链接:https://www.haomeiwen.com/subject/iljugttx.html