你可以用自定义注释处理器来读取修改替换AndroidManifest.xml文件。

问题描述 投票:2回答:1

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

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

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

这可能吗?

android annotation-processing
1个回答
2
投票

这是一个非常有趣的问题,但我不认为你可以用注释处理器实现这样的任务,因为这些工作在KotlinJava代码生成级别。

你将如何对XML进行注释 @Something 并使其仍然是有效的XML?

看看这个。

KoltinConf18 - Kotlin中的注解处理方法

Screenshot from the recorded talk on youtube

在7:18的时候,Zack介绍了Java中的注释处理,基本上说。

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

所以,通过使用赤裸裸的注释处理,你无法真正修改已经存在的 AndroidManifest.xml.

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

从我的头顶的东西可以是。

  1. 创建一个注释,并标记所有你想引入那段代码的活动。
  2. 在插件方面;当你在写Gradle任务的时候;你可以使用反射,找出哪些类是通过这种扩展来注释的。或者干脆让程序员把这些活动放在源文件夹里面的特定目录下,这样就方便多了。
  3. 有了完全合格的班级名称,你可以看一下。<activity> 节点 AndroidManifest.xml,过滤掉不符合注释类名列表的类名。
  4. 用你想注入的代码修改这些节点。

要开始了解如何编写Gradle插件,请看以下内容 此处

一个简单的例子可以让你开始。

第一步

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

step 1

正如你所看到的,我已经创建了一个文本 testFile.txt 在项目的根目录下。

在代码中,我只需要导航到它,然后读取它;打印它的内容,然后修改它。

你也可以用你的 AndroidManifes.xml. 然后,你将需要从你的 srcDir 寻找所有那些被您的特殊注解所注解的活动,并将所有完全限定的类名存储在一个 List<String>. 然后进行必要的替换,在 AndroidManifest

请注意,有了这个基本配置,Gradle任务就会出现在Gradle选项卡内的 others 类,要改变这一点就有点不在注释处理的范围内了。

第二步,利润

step 2

它的工作原理是,你可以看到文件已经更新了,println语句显示了修改文件前的内容。


1
投票

你可以有一个模板AndroidManifest_template.xml,然后使用gradle任务通过AndroidManifest_template.xml,生成真正的AndroidManifest.xml,用于构建应用程序。

换句话说,AndroidManest.xml将是构建过程中的一个瞬态部分,你可以使用任何你想要的XML预处理器来获取模板并将其转化为真正的文件。


0
投票

如果你想根据你的应用程序的味道有条件地添加这些意图,你可以使用gradle flavours和manifest merging来实现这一点--阅读更多关于flavours的内容,请访问 https:/developer.android.comstudiobuildbuild-variants。

也可以参考下面的问题,用gradle修改manifest的例子。

https:/stackoverflow.coma227595729640177。

© www.soinside.com 2019 - 2024. All rights reserved.