我有一个包含多个构建变体的应用。这些变体用于为不同的公司构建相同应用程序的版本。所以,我有几种不同的变体可以构建不同的应用程序:
build.gradle文件处理得非常好:
productFlavors {
app1 {
applicationId "com.acme.app1"
}
app2 {
applicationId "com.schmoe.app2"
}
app3 {
applicationId "com.yop.app3"
}
}
这是我的问题。我正在将Dropbox集成到我的应用程序中。必须为每个变体更改AndroidManifest.xml文件,以包含相应的应用程序密钥(存储在我的字符串文件中)。 Dropbox对清单文件添加了以下内容:
<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:launchMode="singleTask"
android:configChanges="orientation|keyboard">
<intent-filter>
<!-- Change this to be db- followed by your app key -->
<data android:scheme="db-abcdef" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
每个构建变体都需要更改以下行:
<data android:scheme="db-abcdef" />
为每个应用变体的适当值。换句话说,我需要根据构建变量替换上面的部分字符串。例如
App1的
<data android:scheme="db-111111" />
App2
<data android:scheme="db-222222" />
App3的
<data android:scheme="db-333333" />
对于每个变体,直到文本&#34; db - &#34;的行是相同的。
我需要的是动态替换字符串的可变部分(x值)&#34; db-xxxxxx&#34;用我的字符串文件中的字符串。
我认为这可以通过gradle脚本完成,但我是一个带有gradle的完整newb。帮助!
如果你可以提供帮助,请非常具体地了解自从我在gradle文件和脚本编写时出现的问题。提前谢谢!
答案 0 :(得分:15)
您也可以将字符串保存在build.gradle
中:
productFlavors {
app1 {
applicationId "com.acme.app1"
resValue "string", "my_app_key", "db-abc"
}
app2 {
applicationId "com.schmoe.app2"
resValue "string", "my_app_key", "db-def"
}
app3 {
applicationId "com.yop.app3"
resValue "string", "my_app_key", "db-ghi"
}
}
然后使用它:
<data android:scheme="@string/my_app_key" />
答案 1 :(得分:4)
您可以使用与使用字符串资源修改应用名称相同的方式执行此操作。在您的清单中,包括:
<data android:scheme="@string/db_scheme" />
接下来,为各种构建类型添加资源文件夹,并在每个构建类型中放置资源文件的自定义副本,例如res/values/flavor.xml
:
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<resources>
<string name="app_name">Customer 1 App</string>
<string name="db_scheme">db-111111</string>
</resources>
这将允许您为各种口味提供不同的API密钥,方案,应用程序名称,图标等。
答案 2 :(得分:1)
对于在2019年参观此产品的人们:您可以针对每种口味使用manifestPlaceholders
。
就您而言:
productFlavors {
app1 {
applicationId "com.acme.app1"
manifestPlaceholders.scheme = "db-111111"
}
app2 {
applicationId "com.schmoe.app2"
manifestPlaceholders.scheme = "db-222222"
}
app3 {
applicationId "com.yop.app3"
manifestPlaceholders.scheme = "db-333333"
}
}
,然后在清单中使用它:
<activity
android:name="com.dropbox.client2.android.AuthActivity"
android:launchMode="singleTask"
android:configChanges="orientation|keyboard">
<intent-filter>
<!-- Change this to be db- followed by your app key -->
<data android:scheme="${scheme}" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
答案 3 :(得分:0)
另一种与希贝姆的答案有些相似的方法:
android {
defaultConfig {
manifestPlaceholders = [schemeName: "default-scheme"]
}
...
app1 {
applicationId "com.acme.app1"
manifestPlaceholders = [schemeName: "db-111111"]
}
...
}
在您的清单中
<intent-filter>
...
<data android:scheme="${schemeName}" />
...
</intent-filter>
的更多内容