android - 您可以使用自定义注释处理器读取/修改/替换 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>
这可能吗?
解决方案
这是一个非常有趣的问题,但我认为您无法使用注释处理器来完成这样的任务,因为它们在 Kotlin/Java 代码生成级别工作。
您将如何注释 XML@Something
并使其仍然是有效的 XML?
看看这个:
在 7:18,Zack 回顾了 Java 中的注释处理,它基本上说:
- 发生在编译时
- 而且你不能修改代码,只能生成更多
因此,通过使用准系统注释处理,您无法真正修改已经存在的AndroidManifest.xml
.
另一种方法是编写一个 Gradle 插件,该插件生成这些 XML 位并将其与项目中已经存在的当前 XML 文件合并。
我脑海中的一些事情可能是:
- 创建注释并标记您要引入该代码的所有活动
- 在插件方面;当您编写 Gradle 任务时;您可以使用反射并找出此类扩展注释了哪些类。或者只是让程序员将这些活动放在源文件夹内的特定目录中,这会更容易
- 使用完全限定的类名,您可以查看 中的
<activity>
节点AndroidManifest.xml
,过滤掉与带注释的类名列表不匹配的类名 - 使用您要注入的代码修改这些节点。
要开始了解如何编写 Gradle 插件,请查看此处
一个让您入门的简单示例可能是:
步骤1
如果它变得太麻烦,你可以创建一个单独的模块来编写你的插件,但是对于这个简单的例子,我决定把它直接放在build.gradle.kts
. 它不需要是一个 kotlin Gradle 文件,但我对 Kotlin 比对 Groovy 更精通 :)
如您所见,我testFile.txt
在项目的根目录中创建了一个文本。
在代码中,我只是导航到它并阅读它;打印它的内容然后修改它。
你可以用你的AndroidManifes.xml
. 然后,您需要递归地遍历源文件,以srcDir
查找由您的特殊注释注释的所有活动,并将所有完全限定的类名存储在List<String>
. 然后在内部进行必要的更换AndroidManifest
请注意,使用此基本配置,Gradle 任务将出现在others
类别内的 Gradle 选项卡中,以进行更改,这有点超出注释处理的范围。
第二步,盈利
它可以工作,您可以看到文件已更新,并且 println 语句在修改文件之前显示文件的先前内容
推荐阅读
- functional-programming - 获取解决方案的随机子集
- html - 使用 Thymeleaf 为嵌套对象创建表单的问题
- apache-kafka - 消费者和生产者因错误而失败:“在读取响应之前已断开与 0 的连接”
- java - SQLITE_ERROR SQL 错误或缺少数据库(“(”附近:语法错误)
- kotlin - Single.fromCallable 未正确实现
- audio - 在树莓派 Windows IOT 上录制 mp3 格式的音频文件
- java - 使用 2D Array 切换状态而不使用 Switchcase
- c# - C# - 过时的东西,将其标记为错误,但仍然可以访问它?
- c# - 构建用于过滤字典列表的 lambda 表达式
- python - 如何从上级目录导入脚本