提问人:Hossam Hassan 提问时间:5/7/2019 最后编辑:Hossam Hassan 更新时间:5/19/2019 访问量:394
使用多模板/风格构建单个 Apk
Build Single Apk with multiable template/flavors
问:
是否可以构建具有 1 种以上产品口味的 apk?
例如:
我有一个具有 3 种风格的项目(App1 - App2 - App3)。
并且每个应用都有自己的配置,例如 applicationId 等。
现在我想构建不同的模板(不同的 XML 布局),用户应该能够从应用程序内部从布局切换到另一个布局。
我的问题是 res 文件夹会很大,而且很难维护,所以我试图找到一种方法来分离不同的布局并尽可能保持清洁。
如果可以这样做,那么我如何打算或重新启动应用程序以构建其他风格?
我想到的另一件事是在主分辨率中构建所有 XML 文件并选择不同的限定符,就像我们在创建不同的屏幕尺寸(sm - larg - 等)时所做的那样,但我无论如何都找不到添加自定义限定符。
我的代码是这样的:Gradle
flavorDimensions "default"
productFlavors {
demo {
applicationId "test.demo"
versionCode 2
versionName "1.1.2"
resValue "string", "backage_name_file", "test.demo.fileprovider"
resValue "string", "bc", "com.demo"
resValue "string", "bc_e", "extra_data.com.demo"
resValue "string", "default_hostname", "demo.test.com"
resValue "string", "default_username", "demo"
resValue "string", "default_password", "demo"
}
AppOne {
applicationId "test.AppOne"
versionCode 2
versionName "1.1.2"
resValue "string", "backage_name_file", "test.AppOne.fileprovider"
resValue "string", "bc", "com.AppOne"
resValue "string", "bc_e", "extra_data.com.AppOne "
resValue "string", "default_hostname", "AppOne.test.com"
resValue "string", "default_username", "AppOne"
resValue "string", "default_password", "AppOne"
}
AppTwo {
applicationId "test.AppTwo"
versionCode 2
versionName "1.1.2"
resValue "string", "backage_name_file", "test.AppTwo.fileprovider"
resValue "string", "bc", "com.AppTwo"
resValue "string", "bc_e", "extra_data.com.AppTwo"
resValue "string", "default_hostname", "demoAppTwotest.com"
resValue "string", "default_username", "AppTwo"
resValue "string", "default_password", "AppTwo"
}
}
答:
您不能构建具有多种风格的 APK,就像您不能同时在 debug 和 release buildType 中构建一个 APK 一样。所选风格的配置/资源被拉入实际的 APK 元数据/清单中,因此无法在运行时进行修改。
您需要将所有内容包含在文件夹中,但有几种方法可能有助于使其更易于管理。我推荐前 3 个选项,如果您有大量具有不同行为的代码 + 布局文件,则推荐第 4 个选项:res
- 使用 Fragments 可以避免大部分 Java/Kotlin 代码需要重复。
- 包括 XML 布局,而不是每次都重新定义所有内容以重用公共元素。
- 仔细命名您的文件,例如 .
template1_background
template2_background
- 使用多个模块,每个“模板”一个模块。然后,您将拥有多个合理的文件夹。
res
我明白为什么口味似乎是解决方案,但由于您需要在一个应用程序中提供所有口味,因此不幸的是,这种方法行不通。您可能会发现步骤#2将删除几乎所有重复的文件,从而完全避免了这个问题!
评论
app
module1
module2
app
您可以使用 sourceSets 命令合并不同风格的资源。 SourceSet 允许您管理 buildVariants 资源文件夹 例如,您可以将 App2 风格配置为包括 App2 res 文件夹和 App1 res 文件夹。 示例代码:
sourceSets {
App2Debug{
res.srcDirs = ['src/App1/res', 'src/App2/res']
}
}
评论
if