源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio

对于很多从Android App开发转向框架开发的朋友来说,可能首先遇到的就是如何将AOSP中的项目完美导出到Android Studio中。

让我震惊的是,2022年了,国内很多平台搜到的资源还在教如何生成iml和ipr文件。 实在是太落后了! 我实在受不了了,所以今天就花点时间来系统地讲解一下这个最简单却又最难的问题。

问题形成

这很简单。 说白了,Android Studio(以下简称AS)自出现以来,更多的定位是“For Android App Developer”。 无论是项目导出、项目开发,甚至后续的开发调优、测试发布等,AS都集成了相应的优秀工具。 而且由于选择Gradle作为Android App的编译工具,而IDEA作为历史悠久的Java开发工具,长期以来对Gradle有着完善的支持,因此将Gradle编译的Java项目导出到AS是非常简单的。 近年来,随着AS的更新迭代,以及Google对AGP(Android Gradle Plugin)的不断维护,在AS中开发Android App项目也变得越来越顺手。

当涉及到框架开发时,情况就不同了。 AOSP最初选择Make进行编译。 前几年改用Soong,以后也会改用Bazel。 但无论怎么变,说实话,并没有给框架开发者太多的思考。 我敢说,到目前为止,情况仍然如此。 我有同事正在使用 Eclipse 或 SourceInsight 查看源代码。 也就是说,框架的项目无论如何都不能直接在AS中编译,大家都有自己的习惯,所以Google一开始就选择了直接启动。

不过AS确实很棒。 很多从App层转过来的开发工程师仍然希望继续在AS工作。 有没有什么方法可以将AOSP项目导入到AS中,即使不能直接点击

编译、查看、编辑也都不错。

idegen,原解

源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio

这里我们首先介绍两个概念。 .idea 文件夹和.i​​ml 文件。

如果你关注过AS导入项目后的目录树,你应该对.idea文件夹很熟悉。 简单来说,这个文件夹里存放的是你整个项目的配置文件,比如你的项目是如何编译的,如何进行版本控制,工作空间在哪里,甚至codeStyle是什么样子的。 我们可以在这里找到Jetbrains对该文件夹的解释以及上面每个文件的作用。 需要注意的是,.idea文件夹早期还有另一种形式,那就是.ipr文件。 但由于.ipr文件只能是纯xml文件,不能包含其他资源,因此近年来逐渐被.idea文件夹取代。

第二个概念是 .iml 文件,Jetbrains 对此进行了解释。 在开发Android App时,我们都知道如果要添加依赖,只需要在build.gradle中添加一行实现xxxx,然后执行Gradle Sync即可。 但是你有没有想过Sync完成之后AS是怎么做的呢? 是什么让我们能够在自己的代码、第三方库的代码、甚至第三方库所依赖的其他第三方库之间来回跳转呢? 它是如何被记住的? 其实就是借助.iml文件。

有了这两个概念,我们其实就有了一个想法:

虽然AOSP项目不使用Gradle进行编译,但无论哪种编译,依赖关系肯定都会被理清。 如果我们能在编译时将依赖记录到.iml文件中,描述为可导出的.ipr文件或.idea文件夹,然后导出为AS,这不正是我们想要的吗?

恭喜你能够回答,因为 Google 也是这么想的,并帮助我们做到了:android.googlesource.com/platform/de...

这里就不详细介绍idegen的用法了。 著名的lineageOS官网写了一篇文章,可以参考。

源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio

Idegen 比较方便,但是最大的问题是它生成了整个 AOSP 各个项目的依赖。 如果用AS打开这个ipr文件,成本会很大,所以使用这些技术的朋友每次一定要先打开它。 ,然后发呆,删除了很多我不负责的依赖,然后导出AS,然后慢慢等待分析,然后配置SDK和各种路径,然后发现还有很多热点命中,然后检查是否有太多我错过了那个模块... 套装出来时,天已经黑了,所以我们谈谈明天是否要加班。

AIDEGen,是时候展示真正的技术了

说实话,我实在不明白为什么这么好用的工具能出现这么久,国内介绍它的技术文章也不多。 也许是因为很多文章都是被一遍又一遍地复制的。

AIDEGen位于AOSP源代码的tools/asuite/aidegen目录中。 从git日志来看,Google应该在2018年夏天就开始了项目开发,并在内部使用。 将于2020年左右发布。

Google建议您从Android 10开始使用AIDEGen将源代码导出到IDE。无需使用idegen或了解iml和ipr文件。 说白了,这两个文件本身就应该是IDEA这个工具来解析的。 开发人员不应该理解它们。 相反,它们应该由工具生成和解析。 顾大哥,你怎么这么早过去了?

基本用法

AIDEGen的使用非常简单。 这里简单介绍一下。 相信你一看就会爱上它:

源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio

$ source build/envsetup.sh && lunch 

$ aidegen Settings -i s

这里 i 表示 IDE,s 表示 Android Studio。

不多说了,就这么简单。 AIDEGen 会手动帮你编译对应的模块,顺便对整理出来的依赖使用 Python 来一一生成依赖,最后直接帮你拉起 AS 并手动打开项目。 下面是打开后的目录结构简图:

AIDEGen 会将所有依赖项放入一个依赖项中,并将该依赖项作为一个总模块来依赖于原始模块。 整体看起来很清新,不会有不必要的干扰。

有的朋友可能会问,那SDK呢? 手动获取哪个SDK? 我们可以打开Project Structure查看:

AIDEGen 会手动将 AOSP 提供的 JDK 作为依赖项包含到依赖项中。

现在就试试吧源码编译导入as,随意打开一个类,点击后面的导入,就可以平滑跳转到framework/base或者其他依赖模块,就可以愉快的开发了。

高级用法

刚接触框架开发的朋友都遇到过不知道模块叫什么的困惑。 AIDEGen 允许您直接跟踪模块路径,这意味着您不一定需要知道模块的具体名称,例如:

$ aidegen frameworks/base/packages/BackupEncryption -i s

如果您负责框架上的本机模块并且需要使用 CLion,您可以:

aidegen <module> -i c

源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio

这里i表示IDE,c表示CLion,也很好记。

前面提到,AIDEGen每次导出之前都会对模块进行编译,但是很多时候我们同步源码后,首先看到的就是它已经被重新组织过了。 此时,理论上的依赖关系已经明确了。 有没有办法跳过编译过程? 很简单,只需要:

aidegen <module> -i <ide> -s

这里的s表示Skip,所以可以直接跳过编译源码编译导入as,使用已有的依赖进行导出。

更多使用方法及参数请参考官网。

AIDGen 常见问题解答

事实上,我大约 1 年前就开始使用 AIDEGen 导入源代码。 目前遇到2个问题,不过都可以顺利解决。 让我把它们记录在这里:

当我点击跳转的时候,就跳转到了android.jar的类中。

希望你从现在开始使用AIDEGen,忘记古老的iml和ipr。 这两个文件确实是开发者看不懂的,开发者也不需要理解。 开始使用更现代的形式!

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 源码编译导入as-使用AIDEGen将AOSP项目导出到Android Studio https://www.wkzy.net/game/184560.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务