许多从 Android App 开发转结构开发的小伙伴,遇到的榜首件事或许便是,怎样把 AOSP 中的项目较为完美地导入 Android Studio。

令我惊奇的是,来到 2022 年了,国内许多渠道搜索出来的资源,竟然还在教生成 imlipr 文件这样的做法,实在是太落后啦!看不下去了,今天花点时间,体系讲下这个最简略却又最困难的问题。

问题的产生

很简略,说白了 Android Studio (以下简写 AS) 从出现开端,定位便是 “For Android App Developer” 多一些。不管从项目导入,项目开发,乃至到后续开发调优,测试发布等, AS 都集成了对应的十分棒的东西。又由于 Android App 的编译东西挑选了 Gradle,而 IDEA 作为老牌的 Java 开发东西很早就有了 Gradle 的完美支撑,因而往 AS 里导入运用 Gradle 编译的 Java 项目就变得十分简略。这几年随着 AS 的更新迭代,再加上 Google 不断在保护 AGP(Android Gradle Plugin),在 AS 里开发 Android App 项目真的是越来越舒服。

到了结构开发这边就不相同了。AOSP 最开端挑选了 Make 来进行编译,这几年又开端换到 Soong,后边还会切到 Bazel,但不管怎样变,说实话都没有为结构开发者考虑太多,我就敢说迄今为止都依然有拿着 Eclipse 或许 SourceInsight 在看源码的同学。换句话说,横竖结构的这些项目在 AS 里又无法直接编译,而咱们都有自己的习气,于是 Google 最开端就挑选了直接开摆。

可是,AS 真的香啊,有许多从 App 层转过来的开发工程师还是期望能在 AS 里继续工作的,有没有什么方法,能把 AOSP 的项目导到 AS,就算不能直接点 编译,能看能编辑也是好的呀。

idegen,最原始的处理方案

这儿先介绍两个概念。.idea 文件夹 和 .iml 文件。

假如你留心过 AS 导入一个项目之后的目录树,应该对 .idea 文件夹不会陌生。简略来讲,这个文件夹里边保存着你整个项目的配置文件,比方你的项目要怎样编译,怎样进行版别控制,workspace 是哪里,乃至 codeStyle 是什么样等。咱们能够在这儿找到 Jetbrains 对这个文件夹,以及里边每一个文件效果的解说。需求留意的是,.idea 文件夹前期还有一个形态,便是 .ipr 文件,但由于 .ipr 文件只能是一个纯粹的 xml 文件,不能包括其它资源,这几年渐渐现已被 .idea 文件夹替代。

使用 AIDEGen 将 AOSP 项目导入 Android Studio

第二个概念便是 .iml 文件,Jetbrains 对它的解说在这儿。开发 Android App 的时分咱们都知道,要想增加一个依靠,只需求在 build.gradle 里增加一行 implementation xxxx,然后履行 Gradle Sync,可是你有没有想过,AS 在 Sync 完之后,是怎样做到让咱们能在自己的代码、第三方库的代码,乃至第三方库又依靠的其它第三方库之间来回跳转的呢?它是怎样记住的?其实便是依靠 .iml 文件。

有了这两个概念,咱们好像就有思路了:

尽管 AOSP 的项目不采用 Gradle 编译,但不管哪个编译,依靠必定都会被理清的。假如咱们能在编译期间,顺带着把依靠联系记载到一个 .iml 文件里,而且描述成一个可导入的 .ipr 文件 或许 .idea 文件夹,再导入 AS ,这不正是咱们想要的吗?

祝贺你现已会抢答了,由于 Google 也是这么想的,而且帮咱们做好了: android.googlesource.com/platform/de…

idegen 的用法不在这儿赘述,大名鼎鼎的 lineageOS 官网写过一篇,能够拿来参考。

idegen 是比较方便,但最大的问题在于,它生成的是整个 AOSP 各个项目的依靠,假如把这个 ipr 文件用 AS 翻开,代价是巨大的,所以用这种方法的小伙伴每次都要先翻开它,然后在目不暇接中删掉一大堆自己不担任的依靠,再导入 AS,然后渐渐等剖析,然后还要配 SDK,配各种途径,然后发现还是一堆爆红,再查看是不是多了漏了哪个模块……一套下来,天现已黑了,就说你今天加不加班吧。

AIDEGen,是时分扮演真正的技术了

说实话,我十分不了解为什么这么好用的东西出来这么久了,国内都没几篇技术文章介绍它的。或许由于许多文章都是抄来抄去吧。

AIDEGen 坐落 AOSP 源码的 tools/asuite/aidegen 目录,从 git log 来看,Google 应该是从 2018 年夏天开端立项开发,而且内部运用,大概在 2020 年左右开释。

使用 AIDEGen 将 AOSP 项目导入 Android Studio

Google 建议咱们从 Android 10 开端,就运用 AIDEGen 来将源码导入 IDE ,无需再运用 idegen,也不用去了解 imlipr 文件。说白了,这两个文件本身就应该是 IDEA 作为东西去解析的,开发人员本就不应该去了解,而是交由东西生成,东西解析。我的谷大哥,你说你早干嘛去了呢?

根本用法

AIDEGen 的运用十分简略,在这儿简略介绍一下,相信你看一眼都会爱上:

  • 首要确保你现已正确装置 Android Studio
  • 然后在 AOSP 根目录履行
$ source build/envsetup.sh && lunch <TARGET>
  • 履行完之后你就具有了 aidegen 指令。比方你担任的是 Settings 模块,此刻只需履行:
$ aidegen Settings -i s

这儿 iIDE 的意思,s 代表 Android Studio。

没了,就这么简略。AIDEGen 会主动帮你把对应的模块编译一遍,顺带把梳理出的依靠用 Python 生成一个个的 dependency,最终直接帮你把 AS 拉起,项目主动翻开。下面简略截取一下翻开后的目录结构:

使用 AIDEGen 将 AOSP 项目导入 Android Studio

AIDEGen 会把一切的依靠放在一个 dependency 里,并将 dependency 作为一个总模块依靠给原模块,全体看起来十分清爽,不会有多余的干扰。

有小伙伴会问,那 SDK 呢?它是主动取哪个 SDK 的呢?咱们能够翻开 Project Structure 一探终究:

使用 AIDEGen 将 AOSP 项目导入 Android Studio

AIDEGen 会主动把 AOSP 带的 JDK 作为依靠包括到 dependency 里边。

现在试一下,任意翻开一个类,点击头部的 import,能够顺畅跳转到 framework/base 或许其它依靠的模块下,能够愉快地开发了。

使用 AIDEGen 将 AOSP 项目导入 Android Studio

高档用法

刚触摸结构开发的同学,都遇到过不知道模块叫什么名字的困扰。AIDEGen 答应你直接跟模块途径,意味着你并不一定需求知道模块的具体名字,比方:

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

而假如你在担任结构里边的某个 native 模块,需求用 CLion,则能够:

aidegen <module> -i c

这儿 iIDE 的意思,c 代表 CLion,也是十分好记。

前面说过,AIDEGen 会在每次导入前先把模块编译一遍,但许多时分咱们把源码同步下来之后,榜首件事便是现已整编过了,那这个时分理论上依靠联系现已清晰了,有没有方法跳过编译流程呢?很简略,只需求:

aidegen <module> -i <ide> -s

这儿 sSkip 的意思,如此一来就能够直接跳过编译,运用现有依靠进行导入。

更多用法和参数,咱们还是参考官网。

AIDEGen 常见问题

事实上,我大概在1年前就开端用 AIDEGen 导入源码了,目前遇到过2个问题,但都能够顺畅处理,在此记载一下:

  • 导入后 Android Studio 没有把项目识别成 Android 项目,导致没有 Logcat 面板等。

    • AIDEGen 在生成依靠的时分有时会由于不同项目的联系没能识别出 Android 项目,能够通过点击 Files > Project Structure > Facets,点击 + ,挑选 Android,在弹出的 Choose Module 对话框把生成的项目手动增加成 Android 项目即可。
  • 点击跳转的时分,跳到了 android.jar 的 class 里边

    • Files > Project Structure > Modules,把生成的模块的 Language Level 和 SDK 都挑选成传统的 JDK 即可。

期望咱们从现在开端运用 AIDEGen,忘掉陈旧的imlipr,这两个文件真的不是开发者能了解的,开发者也不用了解。开端用更加 modern 的方法吧!