Android Studio中的产品风味

5

我无法让产品口味正常运行。这是我的gradle文件

apply plugin: 'com.android.application'
android {
    defaultConfig {
      minSdkVersion 14
      targetSdkVersion 24
      compileSdkVersion 27
    }
    signingConfigs {
        release {
      }
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
            signingConfig signingConfigs.release
        }
    }
    repositories {
        maven { url "https://jitpack.io" }
    }
    flavorDimensions "dim1", "dim2", "dim3"
    productFlavors {
        flavor1 {
            dimension "dim1"
            applicationId "com.example.dim1.app"
        }
        flavor3 {
            dimension "dim2"
            applicationId "com.example.dim2.app"
        }
        flavor3 {
            dimension "dim3"
            applicationId "com.example.dim3.app"
        }
    }
    sourceSets {
        flavor1 {
          java.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/java/"]
          manifest.srcFile "W:/android-studio-projects/sharedid/app/src/example1/AndroidManifest.xml"
          assets.srcDirs = ["W:/android-studio-projects/sharedid/app/src/example1/assets/"]
          resources.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/res/", "W:/android-studio-projects/sharedid/app/src/example1/res/"]
        }
        flavor2 {
          java.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/java/"]
          manifest.srcFile "W:/android-studio-projects/sharedid/app/src/example2/AndroidManifest.xml"
          assets.srcDirs = ["W:/android-studio-projects/sharedid/app/src/example2/assets/"]
          resources.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/res/", "W:/android-studio-projects/sharedid/app/src/example2/res/"]
        }
        flavor3 {
          java.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/java/"]
          manifest.srcFile "W:/android-studio-projects/sharedid/app/src/example3/AndroidManifest.xml"
          assets.srcDirs = ["W:/android-studio-projects/sharedid/app/src/example3/assets/"]
          resources.srcDirs = ["W:/android-studio-projects/sharedid/app/src/main/res/", "W:/android-studio-projects/sharedid/app/src/example3/res/"]
        }
    }
}
dependencies {
    api 'com.google.android.gms:play-services-maps:15.0.0'
    api 'com.google.android.gms:play-services-location:15.0.0'
    api 'com.android.support:appcompat-v7:27.1.1'
    api 'com.github.PhilJay:MPAndroidChart:v2.0.8'

}

当我到达"Build | Select variant"时,我只能选择

模块:应用程序 构建变体:flavor1Flavor2Flavor3Debugflavor1Flavor2Flavor3Release

我希望得到以下构建变体:

  • flavor1Debugflavor2Debugflavor3Debugflavor1Releaseflavor2Releaseflavor3Release

我尝试过"File | Sync project with gradle file"

...

我会得到以下错误

Caused by: java.lang.RuntimeException: Cannot read packageName from W:\android-studio-projects\sharedid\app\src\main\AndroidManifest.xml

我已经尝试过

  • 没有这样的文件(希望它可以使用产品风味中的一个)
  • 只需将“主”清单定义为所有产品风味之间共享的内容

异常提示无法从AndroidManifest.xml中读取packageName。你的flavors中实际存在哪些清单文件? - Sofi Software LLC
但是为什么你需要三个维度呢?你尝试过只定义一个并使用它吗? - Cata
@Cata 我已经将它改为单个了 - 结果没有任何区别。 - Tom
@SofiSoftwareLLC 我现在已经添加了它 - 但结果没有任何区别。 - Tom
亲爱的,不要错过以下链接 https://dev59.com/blcO5IYBdhLWcg3weRhs#66315794,你的问题将得到完全满足。我使用了以下链接中的代码,它的代码运行良好。 - Er.Prem Singh daksha
显示剩余4条评论
3个回答

2

只需按照以下方式尝试:

 flavorDimensions "dim1"
productFlavors {
    flavor1 {
        dimension "dim1"
        applicationId "com.example.dim1.app"
    }
    flavor3 {
        dimension "dim1"
        applicationId "com.example.dim2.app"
    }
    flavor3 {
        dimension "dim1"
        applicationId "com.example.dim3.app"
    }
}

更多有关构建变体的详细信息,请查看此链接


这仍然会出现相同的错误 - 但感谢提供链接。 - Tom

2

我认为有两个无关的问题:

  • 目前你有两种构建类型(自动创建的debugrelease)和三个维度(dim1dim2dim3),每个维度都有一个变体(dim1flavor1dim2flavor2,...) 这最多给出:

    2 * 1 * 1 * 1 = 2 种组合

    你应该切换到2种构建类型和1个维度(比如dim1),有3个变体(flavor1flaver2flavor3),这样就会有:

    2 * 3 = 6个apk

  • 你应该有一个主清单。与其他资源不同,清单不仅仅是覆盖,而是从多个来源合并而来(更多详情请参见合并多个清单文件)。

    它至少应该包含一个包名(可能与最终的应用程序ID不同),如配置产品风味中所解释的:

注意: 您仍然需要使用main/清单文件中的package属性指定包名。您还必须在源代码中使用该包名来引用R类,或解析任何相对活动或服务注册。这使您可以使用applicationId为每个产品风味提供唯一的打包和分发ID,而无需更改源代码。


0
我希望获得以下构建变体:flavor1Debug,flavor2Debug,flavor3Debug,flavor1Release,flavor2Release,flavor3Release。为此,您需要为所有 flavor 定义相同的维度。
您会收到以下错误: java.lang.RuntimeException: Cannot read packageName from W:\android-studio-projects\sharedid\app\src\main\AndroidManifest.xml 造成这个错误的原因是路径不可达。当应用正在运行时,它怎么可能找到W盘呢?因此,在这里您需要使用相对路径。
此外,根据官方文档(https://developer.android.com/studio/build/build-variants#configure-sourcesets):
如果您有未组织成Gradle所期望的默认源集文件结构的源代码文件,就像上面关于创建源集的部分中所述,您可以使用sourceSets块来更改Gradle查找每个源集组件文件的位置。您不需要重新定位文件;您只需要提供相对于模块级build.gradle文件的路径,Gradle会在这些路径下寻找每个源集组件的文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接