我正在研究Android应用程序的自定义注释处理器。
我有一个用例,在这个用例中,我希望能够使用一个注释处理器来读取修改 AndroidManifest.xml
并为其中提到的所有活动增加以下意图部分?
<intent-filter>
<action android:name="com.my.package.name.my_activity.open"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
这可能吗?
这是一个非常有趣的问题,但我不认为你可以用注释处理器实现这样的任务,因为这些工作在KotlinJava代码生成级别。
你将如何对XML进行注释 @Something
并使其仍然是有效的XML?
看看这个。
在7:18的时候,Zack介绍了Java中的注释处理,基本上说。
所以,通过使用赤裸裸的注释处理,你无法真正修改已经存在的 AndroidManifest.xml
.
一个替代方案是编写一个Gradle插件,生成这些XML位,并将其与项目中已经存在的当前XML文件合并。
从我的头顶的东西可以是。
<activity>
节点 AndroidManifest.xml
,过滤掉不符合注释类名列表的类名。要开始了解如何编写Gradle插件,请看以下内容 此处
你可以创建一个单独的模块来编写你的插件,如果它变得太繁琐,但对于这个简单的例子,我决定把它直接贴在了 build.gradle.kts
. 它不需要是一个kotlin的Gradle文件,但我对Kotlin比对Groovy更精通 :)
正如你所看到的,我已经创建了一个文本 testFile.txt
在项目的根目录下。
在代码中,我只需要导航到它,然后读取它;打印它的内容,然后修改它。
你也可以用你的 AndroidManifes.xml
. 然后,你将需要从你的 srcDir
寻找所有那些被您的特殊注解所注解的活动,并将所有完全限定的类名存储在一个 List<String>
. 然后进行必要的替换,在 AndroidManifest
请注意,有了这个基本配置,Gradle任务就会出现在Gradle选项卡内的 others
类,要改变这一点就有点不在注释处理的范围内了。
它的工作原理是,你可以看到文件已经更新了,println语句显示了修改文件前的内容。
你可以有一个模板AndroidManifest_template.xml,然后使用gradle任务通过AndroidManifest_template.xml,生成真正的AndroidManifest.xml,用于构建应用程序。
换句话说,AndroidManest.xml将是构建过程中的一个瞬态部分,你可以使用任何你想要的XML预处理器来获取模板并将其转化为真正的文件。
如果你想根据你的应用程序的味道有条件地添加这些意图,你可以使用gradle flavours和manifest merging来实现这一点--阅读更多关于flavours的内容,请访问 https:/developer.android.comstudiobuildbuild-variants。
也可以参考下面的问题,用gradle修改manifest的例子。