Android Studio中的产品风格

时间:2018-05-22 15:02:52

标签: android android-studio android-productflavors

我不能让产品口味有效。我有这个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 |选择变体" 我只能选择

模块:应用的 构建变体: flavor1Flavor2Flavor3Debug flavor1Flavor2Flavor3Release

我本来希望得到

  • 以下构建变体: flavor1Debug flavor2Debug flavor3Debug flavor1Release flavor2Release flavor3Release

我试过"文件|使用gradle文件同步项目"

...

我收到此错误

  

引起:java.lang.RuntimeException:无法从中读取packageName   宽:\机器人工作室项目\ sharedid \应用\ SRC \主\的AndroidManifest.xml

我试过两个

  • 没有这样的文件(希望它能带来产品味道吗?)
  • 拥有" main" manifest只定义所有产品风格之间的共享内容

4 个答案:

答案 0 :(得分: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"
    }
}

有关构建变体see this link

的更多详细信息

答案 1 :(得分:2)

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

  • 目前您有2种构建类型(自动创建的debugrelease)和3个维度(dim1dim2dim3) ,每个都有1个变体(flavor1dim1flavor2dim2,...) 这最多给出了:

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

    你应该切换到2个构建类型和1个维度(比如dim1),它们有3个变体(flavor1flaver2flavor3),以便:

    2 * 3 = 6 apks

  • 你应该有一个主清单。与其他资源不同,清单不是简单地覆盖,而是从多个来源合并(有关详细信息,请参阅Merge Multiple Manifest Files)。

    它至少应包含一个包名(可能与最终的applicationId不同),如Configure Product Flavors中的本说明所述:

  

注意:您仍需要使用属性指定包名称   在主/ 清单文件中。您还必须使用该包名称   您的源代码引用R类,或解析任何相对   活动或服务注册。这允许您使用 applicationId   为每种产品风味提供独特的包装ID   分发,无需更改源代码。

答案 2 :(得分:1)

基于此https://developer.android.com/studio/build/build-variants文档,您需要应用程序的此类层次结构。从所有构建版本中删除assets.srcDirs,您可以尝试使用这种结构。

赞: Flavor ImageAndroidManiFest file

buildTypes {
  release {
    // ... the usual stuff here
  }
  releaseAlt {
    // .. the usual stuff here too like signing config etc...
  }
}

文件层次结构您应该具有:

project/
- app/
 - src/
  - main/
   - assets/
    - logo.png // Generic assets go here
   - java/
   - res/
   - ...

  - flavor1/
   - assets/
    - logo.png // Specific assets for all the flavor1 Variants

  - release/
   - assets/
    - logo.png // Specific assets for all the releaseAlt Variants.

  - flavor1Release/
   - assets/
    - logo.png // very specific assets for the flavor1ReleaseAlt Variant
- SDK/

答案 3 :(得分:0)

  

我本来希望得到

     

以下构建变体:   flavor1Debug,flavor2Debug,flavor3Debug,flavor1Release,flavor2Release,flavor3Release

为此,您需要为所有口味定义相同维度

  

我收到此错误

     

引起:java.lang.RuntimeException:无法从中读取packageName   宽:\机器人工作室项目\ sharedid \应用\ SRC \主\的AndroidManifest.xml

您收到此错误,因为路径无法访问。

试想一下,应用如何在运行时找到 W:

所以,你需要在这里使用相对路径。

同样来自官方文件(https://developer.android.com/studio/build/build-variants#configure-sourcesets):

  

如果您的源没有组织到默认源集中   Gradle期望的文件结构,如上一节中所述   关于创建源集,您可以使用sourceSets块进行更改   Gradle看起来为源集的每个组件收集文件。   您不需要重新定位文件; 你只需要提供Gradle   与路径相对于模块级build.gradle文件,   Gradle应该为每个源集合组件找到文件