将变量声明为 build.gradle 与 applicationId 与 flavors 后缀匹配
Declare variable into build.gradle that match the applicationId with flavors suffix
我不知道如何在 build.gradle
中设置资源值 (resValue
), 取决于构建变体选择 。
这里稍微解释一下。
我正在使用 Skype For Business SDK(以下简称 Sfb),在实施过程中,它询问我添加名为 ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE
.
的资源值
所以我查看了他们的应用示例 (available here),发现在 build.gradle
中他们添加了如下相应的值:
android {
...
defaultConfig {
applicationId "com.microsoft.office.sfb.sfbdemo"
...
resValue ("string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "${applicationId}"
}
...
}
此值随后用于 SfbSDK class,检查它是否与应用程序包名称匹配。
这是我的麻烦,我使用不同的 flavorDimensions
工作,如下面的 build.gradle
所述。
apply plugin: 'com.android.application'
...
android {
...
defaultConfig {
applicationId "com.tsp.test"
...
resValue ("string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "${applicationId}"
}
...
flavorDimensions("customer", "version")
productFlavors {
a {
dimension "customer"
applicationIdSuffix ".a"
}
b {
dimension "customer"
applicationIdSuffix ".b"
}
alpha {
dimension "version"
applicationIdSuffix ".alpha"
}
beta {
dimension "version"
applicationIdSuffix ".beta"
}
release {
dimension "version"
applicationIdSuffix ".release"
}
}
}
...
根据我的 build variant 选择,这会生成 6 个不同的 APK :
- com.tsp.test.a.alpha ; com.tsp.test.a.beta ; com.tsp.test.a.release
- com.tsp.test.b.alpha ; com.tsp.test.b.beta ; com.tsp.test.b.release
所以当进行匹配检查时,我的应用程序崩溃并显示错误消息
Caused by: java.lang.RuntimeException: ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE string not set to applicationId
at com.microsoft.office.sfb.appsdk.Application.initialize(Application.java:110)
at com.microsoft.office.sfb.appsdk.Application.getInstance(Application.java:144)
at com.tsp.test.RootActivity.onCreate(RootActivity.java:89)
当然,因为 com.tsp.test
不匹配 com.tsp.test.a.alpha
(或任何其他 APK)。
我如何根据选择的 构建变体 实现动态 resValue
以匹配正确的应用程序包名称?
编辑:
再解释一下。首先,我选择构建变体如下:
- 客户:A
- 版本:Alpha
然后,在我的 RootActivity#onCreate()
(我的启动器 activity)中,我开始配置 SfbSDK 一个应用程序实例,具体取决于 SfbSDK :
this.mApplication = com.microsoft.office.sfb.appsdk.Application.getInstance(this.getApplication().getApplicationContext());
在getInstance()
方法的某处,SfbSDK在context.getPackageName()
和context.getString(string.ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE);
[=32=之间做一个equals()
]
所以,为了调试,在我的RootActivity#onCreate()
中我只写了这两行
String whatIWant = this.getPackageName(); // give me *com.tsp.test.a.alpha*
String whatIGet = this.getString(R.string.ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE); // give me *com.tsp.test*
这不匹配!所以在SfbSDK中条件没有通过。
您必须在 gradle.properties 中声明变量 ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE,如下所示
//default
org.gradle.jvmargs=-Xmx1536m
ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE=xxx
好吧,感谢 Radesh 和 this link 他向我提供的帮助,我找到了解决方案。
我从 defaultConfig
块中删除了 resValue
然后我在 android
插件任务中添加了一个新块,它创建了 resValue
每个 变体.
apply plugin: 'com.android.application'
...
android {
...
defaultConfig {
applicationId "com.tsp.test"
...
}
...
flavorDimensions("customer", "version")
productFlavors {
a {
dimension "customer"
applicationIdSuffix ".a"
}
b {
dimension "customer"
applicationIdSuffix ".b"
}
alpha {
dimension "version"
applicationIdSuffix ".alpha"
}
beta {
dimension "version"
applicationIdSuffix ".beta"
}
release {
dimension "version"
applicationIdSuffix ".release"
}
}
...
applicationVariants.all { variant ->
variant.resValue "string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "\"${applicationId}\""
}
}
...
这会使用所选变体的包名称正确生成 resValue
。
对于变体 customer A 和 version Alpha, 我得到 resValue = com.tsp.test.a.alpha
.
我不知道如何在 build.gradle
中设置资源值 (resValue
), 取决于构建变体选择 。
这里稍微解释一下。
我正在使用 Skype For Business SDK(以下简称 Sfb),在实施过程中,它询问我添加名为 ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE
.
所以我查看了他们的应用示例 (available here),发现在 build.gradle
中他们添加了如下相应的值:
android {
...
defaultConfig {
applicationId "com.microsoft.office.sfb.sfbdemo"
...
resValue ("string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "${applicationId}"
}
...
}
此值随后用于 SfbSDK class,检查它是否与应用程序包名称匹配。
这是我的麻烦,我使用不同的 flavorDimensions
工作,如下面的 build.gradle
所述。
apply plugin: 'com.android.application'
...
android {
...
defaultConfig {
applicationId "com.tsp.test"
...
resValue ("string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "${applicationId}"
}
...
flavorDimensions("customer", "version")
productFlavors {
a {
dimension "customer"
applicationIdSuffix ".a"
}
b {
dimension "customer"
applicationIdSuffix ".b"
}
alpha {
dimension "version"
applicationIdSuffix ".alpha"
}
beta {
dimension "version"
applicationIdSuffix ".beta"
}
release {
dimension "version"
applicationIdSuffix ".release"
}
}
}
...
根据我的 build variant 选择,这会生成 6 个不同的 APK :
- com.tsp.test.a.alpha ; com.tsp.test.a.beta ; com.tsp.test.a.release
- com.tsp.test.b.alpha ; com.tsp.test.b.beta ; com.tsp.test.b.release
所以当进行匹配检查时,我的应用程序崩溃并显示错误消息
Caused by: java.lang.RuntimeException: ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE string not set to applicationId
at com.microsoft.office.sfb.appsdk.Application.initialize(Application.java:110)
at com.microsoft.office.sfb.appsdk.Application.getInstance(Application.java:144)
at com.tsp.test.RootActivity.onCreate(RootActivity.java:89)
当然,因为 com.tsp.test
不匹配 com.tsp.test.a.alpha
(或任何其他 APK)。
我如何根据选择的 构建变体 实现动态 resValue
以匹配正确的应用程序包名称?
编辑:
再解释一下。首先,我选择构建变体如下:
- 客户:A
- 版本:Alpha
然后,在我的 RootActivity#onCreate()
(我的启动器 activity)中,我开始配置 SfbSDK 一个应用程序实例,具体取决于 SfbSDK :
this.mApplication = com.microsoft.office.sfb.appsdk.Application.getInstance(this.getApplication().getApplicationContext());
在getInstance()
方法的某处,SfbSDK在context.getPackageName()
和context.getString(string.ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE);
[=32=之间做一个equals()
]
所以,为了调试,在我的RootActivity#onCreate()
中我只写了这两行
String whatIWant = this.getPackageName(); // give me *com.tsp.test.a.alpha*
String whatIGet = this.getString(R.string.ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE); // give me *com.tsp.test*
这不匹配!所以在SfbSDK中条件没有通过。
您必须在 gradle.properties 中声明变量 ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE,如下所示
//default
org.gradle.jvmargs=-Xmx1536m
ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE=xxx
好吧,感谢 Radesh 和 this link 他向我提供的帮助,我找到了解决方案。
我从 defaultConfig
块中删除了 resValue
然后我在 android
插件任务中添加了一个新块,它创建了 resValue
每个 变体.
apply plugin: 'com.android.application'
...
android {
...
defaultConfig {
applicationId "com.tsp.test"
...
}
...
flavorDimensions("customer", "version")
productFlavors {
a {
dimension "customer"
applicationIdSuffix ".a"
}
b {
dimension "customer"
applicationIdSuffix ".b"
}
alpha {
dimension "version"
applicationIdSuffix ".alpha"
}
beta {
dimension "version"
applicationIdSuffix ".beta"
}
release {
dimension "version"
applicationIdSuffix ".release"
}
}
...
applicationVariants.all { variant ->
variant.resValue "string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "\"${applicationId}\""
}
}
...
这会使用所选变体的包名称正确生成 resValue
。
对于变体 customer A 和 version Alpha, 我得到 resValue = com.tsp.test.a.alpha
.