Android Studio查看和调试AOSP源码


之前说过使用VSCode阅读AOSP源码的方法,但是作为Android开发,还是对Android Studio熟悉一些,这里看下如何使用Android Studio查看AOSP源码.

如果你之前没完整的编译过AOSP,可以按照下面的流程进行配置:

第一步

source build/envsetup.sh
make idegen

如果这一步成功了,没有报错,那么恭喜你,可以继续下一步了,如果报错了,到文章后面查看有没有你遇到的问题.

第二步

sudo ./development/tools/idegen/idegen.sh

这一步会在根目录下生成android.iprandroid.iml两个文件

第三步

使用Android Studio,选择Open an existing Android Studio Project打开上面生成的android.ipr文件即可

第四步

这一步要设置下JDK以及SDK:

选择SDK

这里需要按照自己下载的源码版本选择对应的SDK.

设置JDK

SDK设置JDK

这一步需要新建一个不带classpath的JDK(点击+号,新建一个,改个名字,然后删除classpath就行),这个操作的话就会使用AOSP中的JDK环境了.

调试源码

可以找个模拟器,比如Genymotion,启动模拟器,然后在Android Studio里面选择对应的进程,就可以正常的进行调试了:

调试源码

按需加载源码

如果一次性将所有源码都加载到Android Studio,第一次索引时间可能会非常久(半个小时都有可能).这个时候可以修改android.iml来让Android Studio不要加载哪些模块:

android.iml中搜索excludeFolder,然后在下面新增一些你不想加载的模块即可:

<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$/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$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />

当然,如果你的电脑性能非常好,可以不用修改这些,一次性加载就行

如果不想手动修改android.iml文件,还可以在Android Studio中操作:

exclude

被你排除的module会显示为橙色,正常加载的module为灰色.

可能会遇到的问题

  • Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13” “10.14”]

    在我的Macbook Pro上是出现了这个问题的,其实就是当前AOSP的soong编译工具还不支持MacOS 10.15,而我使用的正好是10.15,因此找到build/soong/cc/config/x86_darwin_host.go文件,并新增10.15支持即可:

        darwinSupportedSdkVersions = []string{
            "10.10",
            "10.11",
            "10.12",
            "10.13",
            "10.14",
            "10.15",
        }

    结尾那个逗号一定要带上,要不然会报错

    如果你不知道自己当前使用的sdk版本,可以使用下面的命令:

    find /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs -iname "*.sdk"
  • Java代码跳转错误

    image-20200821235334709

    比如ActivityThread中有:

    import static android.app.ActivityManager.PROCESS_STATE_UNKNOWN;

    一般不处理会“飘红”报错,那是因为引用的ActivityManager路径错了,引用到了test中去了.

    有两种解决办法:

    • 修改android.iml中的<oderEntry><sourceFolder>,对于不需要的module先exclude,exclude无效再查看<orderEntry>,再不行就删除对应的<sourceFolder>

    • 最干脆的办法,其实原理也和上面一样

      把dependencies里一些乱七八糟的依赖都删掉,一劳永逸.(如果害怕删错了,可以找到对应的jar包删除)

      image-20200822000213857

参考文章

  1. https://liuwangshu.cn/framework/aosp/4-import-aosp.html
  2. http://wuxiaolong.me/2018/08/15/AOSP3/
  3. https://stackoverflow.com/questions/50760701/could-not-find-a-supported-mac-sdk-10-10-10-11-10-12-10-13
  4. https://liuwangshu.cn/framework/aosp/5-debug-aosp.html

文章作者: 姜康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 姜康 !
评论
 上一篇
Android Hook之拦截Activity的启动 Android Hook之拦截Activity的启动
Android中的插件化和热修复已经应用了很多年了,这里面涉及的主要就是Hook,即反射 + 代理的技巧去实现一些常规代码无法实现的功能. 之前有说过Hook点击事件的方式,这里讲一下拦截Activity的Hook方法,这也是插件化的基础.
2020-08-22
下一篇 
MultiDex原理分析 MultiDex原理分析
单个Dex文件,即Dalvik Executable,代码中可调用的引用总数最多为64K(65536个). 版本差异 Android 5.0 之前 使用的是Dalvik虚拟机,默认情况下Dalvik会限制每个APK只能使用一个classes
2020-08-19
  目录