首页 > 解决方案 > 您可以使用自定义注释处理器读取/修改/替换 AndroidManifest.xml 文件吗

问题描述

我正在研究 Android 应用程序的自定义注释处理器。

我有一个用例,我希望能够使用注释处理器来读取/修改AndroidManifest.xml并为其中提到的所有活动添加以下意图部分?

        <intent-filter>
            <action android:name="com.my.package.name.my_activity.open"/>
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

这可能吗?

标签: androidannotation-processing

解决方案


这是一个非常有趣的问题,但我认为您无法使用注释处理器来完成这样的任务,因为它们在 Kotlin/Java 代码生成级别工作。

您将如何注释 XML@Something并使其仍然是有效的 XML?

看看这个:

KoltinConf18 - Kotlin 中的注释处理

youtube 上录制的谈话截图

在 7:18,Zack 回顾了 Java 中的注释处理,它基本上说:

  • 发生在编译时
  • 而且你不能修改代码,只能生成更多

因此,通过使用准系统注释处理,您无法真正修改已经存在的AndroidManifest.xml.

另一种方法是编写一个 Gradle 插件,该插件生成这些 XML 位并将其与项目中已经存在的当前 XML 文件合并。

我脑海中的一些事情可能是:

  1. 创建注释并标记您要引入该代码的所有活动
  2. 在插件方面;当您编写 Gradle 任务时;您可以使用反射并找出此类扩展注释了哪些类。或者只是让程序员将这些活动放在源文件夹内的特定目录中,这会更容易
  3. 使用完全限定的类名,您可以查看 中的<activity>节点AndroidManifest.xml,过滤掉与带注释的类名列表不匹配的类名
  4. 使用您要注入的代码修改这些节点。

要开始了解如何编写 Gradle 插件,请查看此处

一个让您入门的简单示例可能是:

步骤1

如果它变得太麻烦,你可以创建一个单独的模块来编写你的插件,但是对于这个简单的例子,我决定把它直接放在build.gradle.kts. 它不需要是一个 kotlin Gradle 文件,但我对 Kotlin 比对 Groovy 更精通 :)

步骤1

如您所见,我testFile.txt在项目的根目录中创建了一个文本。

在代码中,我只是导航到它并阅读它;打印它的内容然后修改它。

你可以用你的AndroidManifes.xml. 然后,您需要递归地遍历源文件,以srcDir查找由您的特殊注释注释的所有活动,并将所有完全限定的类名存储在List<String>. 然后在内部进行必要的更换AndroidManifest

请注意,使用此基本配置,Gradle 任务将出现在others类别内的 Gradle 选项卡中,以进行更改,这有点超出注释处理的范围。

第二步,盈利

第2步

它可以工作,您可以看到文件已更新,并且 println 语句在修改文件之前显示文件的先前内容


推荐阅读