将变量声明到 build.gradle 中,该变量与 applicationId 与 flavors 后缀匹配



我不知道如何在我的build.gradle中设置资源值(resValue(,具体取决于构建变体的选择

这里有一点解释。

我正在使用Skype for Business SDK(以下简称Sfb(,在实施过程中,它要求我添加一个名为ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE的资源值。

所以我在他们的应用程序示例中查找(可在此处获得(,发现他们build.gradle添加了以下相应的值:

android {
...
defaultConfig {
applicationId "com.microsoft.office.sfb.sfbdemo"
...
resValue ("string", "ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE", "${applicationId}"
}
...
}

然后,此值在 SfbSDK 类中使用,检查它是否与应用程序包名称匹配。

这是我的麻烦,我使用不同的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"
}
}
}
...

根据我的构建变体选择,这将为我生成 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.testcom.tsp.test.a.alpha(或任何其他APK(不匹配。

如何根据所选的与正确的应用程序包名称匹配的构建变体实现动态resValue

编辑:

再解释一下。首先,我选择构建变体如下:

  • 客户 :A
  • 版本 :阿尔法

然后,在我的RootActivity#onCreate()(我的启动器活动(中,我开始根据SfbSDK使用应用程序实例配置SfbSDK

this.mApplication = com.microsoft.office.sfb.appsdk.Application.getInstance(this.getApplication().getApplicationContext());

getInstance()方法的某个地方,SfbSDKcontext.getPackageName()context.getString(string.ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE);之间做一个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中,条件没有通过。

好吧,感谢Radesh和他提供给我的这个链接,我找到了我的解决方案。

我从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

对于变体客户A版本Alpha,我得到resValue = com.tsp.test.a.alpha.

您必须清除 gradle 中的变量ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE,如下所示的属性

//default
org.gradle.jvmargs=-Xmx1536m
ENTERPRISE_AUTHENTICATOR_ACCOUNT_TYPE=xxx

最新更新