美文网首页我爱编程andnroid
Android build.gradle之productFlav

Android build.gradle之productFlav

作者: 一枚平庸的软件工程师 | 来源:发表于2018-04-13 13:14 被阅读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

    相关文章

      网友评论

        本文标题:Android build.gradle之productFlav

        本文链接:https://www.haomeiwen.com/subject/tchckftx.html