将变量声明为 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 :

所以当进行匹配检查时,我的应用程序崩溃并显示错误消息

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 以匹配正确的应用程序包名称?

编辑:

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

然后,在我的 RootActivity#onCreate()(我的启动器 activity)中,我开始配置 SfbSDK 一个应用程序实例,具体取决于 SfbSDK :

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

getInstance()方法的某处,SfbSDKcontext.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 Aversion Alpha, 我得到 resValue = com.tsp.test.a.alpha.