gpt4 book ai didi

android - 你能用自定义注释处理器读取/修改/替换 AndroidManifest.xml 文件吗

转载 作者:行者123 更新时间:2023-12-04 01:26:22 25 4
gpt4 key购买 nike

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

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

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

这可能吗?

最佳答案

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

您将如何注释 XML @Something它仍然是有效的 XML 吗?

看看这个:

KoltinConf18 - Annotation processing in Kotlin

Screenshot from the recorded talk on youtube

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

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

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

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

我脑子里的想法可能是:

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

要开始编写 Gradle 插件,请查看 here

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

第一步

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

step 1

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

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

你可以用你的 AndroidManifes.xml 做同样的事情.然后,您需要递归迭代 srcDir 中的源文件。查找所有由您的特殊注释注释的 Activity ,并将所有完全限定的类名存储在 List<String> 中.然后在 AndroidManifest 中进行必要的替换

请注意,使用此基本配置,Gradle 任务会出现在 others 内的 Gradle 选项卡中category,改变它有点超出注释处理的范围。

第二步,盈利

step 2

有效,因为您可以看到文件已更新,并且 println 语句显示文件在修改之前的先前内容

关于android - 你能用自定义注释处理器读取/修改/替换 AndroidManifest.xml 文件吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61894358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com