Android 模块化编程
Android Modular Programming
我的问题可能无效。而且我在这里提到的几点可能有点不正确,因为我既不是完美的也不是专家。
我有一个购物应用程序,我想开始构建一个模块化应用程序。就像我想在应用程序中添加附属用户(添加某些功能的模块,或者这将在应用程序中显示一些额外的页面)。
类似的情况发生在框架中:我们添加并启用某个模块,然后在 return 框架中根据需要加载所有内容。
为此,我希望进行以下更改:
- 在显示 "Affiliate Label" 的 NavigationView 中添加一个条目。
- 加载片段(只需从导航视图中再添加一个片段即可 label/option)。
假设我有一个包含片段和所有相关代码的库项目。
我怎样才能自动构建应用程序让我们说只要在 XML 的某个地方写 "true"?
此处自动表示添加标签,点击标签等执行 Intent。
<Modules>
<enable>true/false</enable>
</Modules>
这只是简单的场景。
您可以通过许多可能的方式来做到这一点(就像在编写代码的任何地方一样)。
- "file"方式:
使用键值对创建一个名为 modules.txt 的新文件。加载文件并检查是否启用了模块。
- "Constant"方式:
做一个抽象 class 只包含 public static final 变量来描述你的模块。
- "package manager"方式:
参见 create Android Application plugins/extensions (apk)
- "multiple"apk方式:
请注意,不推荐这样做!
we encourage you to develop and publish a single APK
要添加到 codewing 的答案中,您还可以使用 Gradle 的资源管理功能来完成此操作,因此您只需要在一个地方查找 enabled/disabled 状态。
为此,您有 2 个可靠的选择。
第一个以布尔值开头,可以按风味拆分:
<bool name="module_x_enabled">true</bool>
第二种方法是在 Gradle 合并资源后将您的值注入到字符串资源中,方法是将类似的内容添加到您的 build.gradle 文件中,然后比较启用的值:
<string name="module_x_enabled">MODULE_X_ENABLED_PLACEHOLDER</string>
android.applicationVariants.all{ variant ->
variant.mergeResources.doLast{
replaceInValues(variant, 'MODULE_X_ENABLED_PLACEHOLDER', MODULE_X_ENABLED)
}
}
def replaceInValues(variant, fromString, toString) {
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
String content = valuesFile.getText('UTF-8')
content = content.replaceAll(fromString, toString)
valuesFile.write(content, 'UTF-8')
}
其中 MODULE_X_ENABLED
是您 gradle.properties
文件中的设置,例如:
MODULE_X_ENABLED=true
编辑:或者更好,
为什么不从某种服务器中提取设置,这样您就不需要重建和重新启动来更新客户端的模块?
我的问题可能无效。而且我在这里提到的几点可能有点不正确,因为我既不是完美的也不是专家。
我有一个购物应用程序,我想开始构建一个模块化应用程序。就像我想在应用程序中添加附属用户(添加某些功能的模块,或者这将在应用程序中显示一些额外的页面)。
类似的情况发生在框架中:我们添加并启用某个模块,然后在 return 框架中根据需要加载所有内容。
为此,我希望进行以下更改:
- 在显示 "Affiliate Label" 的 NavigationView 中添加一个条目。
- 加载片段(只需从导航视图中再添加一个片段即可 label/option)。
假设我有一个包含片段和所有相关代码的库项目。
我怎样才能自动构建应用程序让我们说只要在 XML 的某个地方写 "true"?
此处自动表示添加标签,点击标签等执行 Intent。
<Modules>
<enable>true/false</enable>
</Modules>
这只是简单的场景。
您可以通过许多可能的方式来做到这一点(就像在编写代码的任何地方一样)。
- "file"方式: 使用键值对创建一个名为 modules.txt 的新文件。加载文件并检查是否启用了模块。
- "Constant"方式: 做一个抽象 class 只包含 public static final 变量来描述你的模块。
- "package manager"方式: 参见 create Android Application plugins/extensions (apk)
- "multiple"apk方式: 请注意,不推荐这样做!
we encourage you to develop and publish a single APK
要添加到 codewing 的答案中,您还可以使用 Gradle 的资源管理功能来完成此操作,因此您只需要在一个地方查找 enabled/disabled 状态。
为此,您有 2 个可靠的选择。
第一个以布尔值开头,可以按风味拆分:
<bool name="module_x_enabled">true</bool>
第二种方法是在 Gradle 合并资源后将您的值注入到字符串资源中,方法是将类似的内容添加到您的 build.gradle 文件中,然后比较启用的值:
<string name="module_x_enabled">MODULE_X_ENABLED_PLACEHOLDER</string>
android.applicationVariants.all{ variant ->
variant.mergeResources.doLast{
replaceInValues(variant, 'MODULE_X_ENABLED_PLACEHOLDER', MODULE_X_ENABLED)
}
}
def replaceInValues(variant, fromString, toString) {
File valuesFile = file("${buildDir}/intermediates/res/merged/${variant.dirName}/values/values.xml")
String content = valuesFile.getText('UTF-8')
content = content.replaceAll(fromString, toString)
valuesFile.write(content, 'UTF-8')
}
其中 MODULE_X_ENABLED
是您 gradle.properties
文件中的设置,例如:
MODULE_X_ENABLED=true
编辑:或者更好,
为什么不从某种服务器中提取设置,这样您就不需要重建和重新启动来更新客户端的模块?