我爱编程andnroid

Android build.gradle之productFlav

2018-04-13  本文已影响315人  一枚平庸的软件工程师

封装产品的特性,只需配置 productFlavors {} 。productFlavors支持与 defaultConfig{} 相同的属性,这是因为 defaultConfig 实际上属于 ProductFlavor类。这意味着,您可以在 defaultConfig {} 代码块中提供productFlavors的基本配置,productFlavors{}里面的每种均可更改任何这些默认值,也可以指定不同的特性、设备需求、资源和应用程序ID,同时共享公共源代码和资源.

android {
    ...
    defaultConfig {...}
    buildTypes {...}
    productFlavors {
        demo {
            applicationIdSuffix ".demo"
            versionNameSuffix "-demo"
        }
        full {
            applicationIdSuffix ".full"
            versionNameSuffix "-full"
        }
    }
}

Gradle 会根据您的buildType{}和productFlavors自动创建构建变体,并按照 <product-flavor><Build-Type> 的格式命名这些变体。

下面是它的一些常用属性:

属性 描述
applicationId 应用的包名
versionCode 版本号
versionName 版本名
versionNameSuffix 版本名后缀
map<String,Object> manifestPlaceholders 定义Manifest变量占位符

applicationId

每个 Android 应用均有一个唯一的应用 ID,像 Java 软件包名称一样,如 com.example.myapp。 此 ID 可以在设备上和 Google Play 商店中对您的应用进行唯一标识。 如果您想要上传新版本的应用,应用 ID必须与原始 APK 相同 - 如果您更改应用 ID,Google Play 商店会将 APK 视为完全不同的应用。所以您发布应用后,绝不应更改应用 ID

当您在 Android Studio 中创建新项目时,applicationId 会完全匹配您在设置时选择的 Java 风格软件包名称。 不过,除了这一点,应用 ID 和软件包名称彼此无关。您可以更改代码的软件包名称(代码命名空间),这不会影响应用 ID,反之亦然(但同样,您发布应用后不应再更改应用 ID)

尽管应用 ID 看起来像传统的 Java 软件包名称,但应用 ID 的命名规则有更多限制:
1.必须至少包含两段(一个或多个圆点)。
2.每段必须以字母开头。
3.所有字符必须为字母数字或下划线 [a-zA-Z0-9_]。

注意Context.getPackageName() 方法会返回您的应用 ID。 无论何时都不需要在应用代码以外分享代码真实的软件包名称。

ProductFlavor类里面的buildConfigField方法在配置中的使用:

buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField "int", "VERSION_TYPE", "1"

这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值。
上面的意思是:LOG_DEBUG = true ;VERSION_TYPE = 1
可以用在代码中:

if(BuildConfig.LOG_DEBUG){
   //Debug,打印日志
    Logger.init("AppPlusLog").setLogLevel(LogLevel.FULL);
}else{
    //release,关闭日志
    Logger.init("AppPlusLog").setLogLevel(LogLevel.None);
}

String versionType = BuildConfig.VERSION_TYPE;

将Build文件中声明的变量属性使用到Manifest中

比如:
1.配置主机ip地址,名称

android {
   defaultConfig {
       manifestPlaceholders = [hostName:"www.example.com",post:"8080"]
   }
   ...
}

然后你可以把其中的key插入到Manifest文件属性值:

<intent-filter ... >
    <data android:scheme="http" android:host="${hostName}" ... />
    ...
</intent-filter>

你还可以用这些属性值作为命名空间,比如定义action name

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

你可以将application ID插入到action name,如下:

<intent-filter ... >
    <action android:name="${applicationId}.TRANSMOGRIFY" />
    ...
</intent-filter>

当你运行的是free版本的时候,它就类似于:

<intent-filter ... >
   <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
    ...
</intent-filter>

过滤变体

Gradle 会为您配置的产品风味与构建类型的每个可能的组合创建构建变体。不过,某些特定的构建变体在您的项目环境中并不必要,也可能没有意义。您可以在模块级 build.gradle 文件中创建一个变体过滤器,以移除某些构建变体配置。

以上一部分中的构建配置为例,假设您计划为演示版本的应用仅支持 API 级别 23 和更高级别。您可以使用 variantFilter {}代码块过滤出组合了“minApi21”和“演示”产品风味的所有构建变体配置:

android {
  ...
  buildTypes {...}

  flavorDimensions "api", "mode"
  productFlavors {
    demo {...}
    full {...}
    minApi24 {...}
    minApi23 {...}
    minApi21 {...}
  }

  variantFilter { variant ->
      def names = variant.flavors*.name
      // To check for a certain build type, use variant.buildType.name == "<buildType>"
      if (names.contains("minApi21") && names.contains("demo")) {
          // Gradle ignores any variants that satisfy the conditions above.
          setIgnore(true)
      }
  }
}
...

在您向构建配置添加变体过滤器并点击通知栏中的 Sync Now后,Gradle 将忽略满足您指定的条件的任何构建变体,在您点击菜单栏中的 Build > Select Build Variant(或工具窗口栏中的 Build Variants)时,这些构建变体将不会再显示在下拉菜单中。
https://developer.android.com/studio/build/manifest-build-variables.html

上一篇下一篇

猜你喜欢

热点阅读