Android配置变体

作者: 奔跑吧李博 | 来源:发表于2023-04-26 20:03 被阅读0次

    每种 build 变体都代表您可以构建的一个不同的应用版本。例如,您可能希望为应用构建两个版本,一个是内容有限的免费版本,另一个是包含更多内容的付费版本。那这里就模拟写一个SDK来做一个功能,利用构建变体来打出免费版和专业(付费版)的两个变体给客户端接入。

    构建类型

    构建类型 = productFlavors + buildTypes
    构建类型的数量为productFlavors和buildTypes笛卡尔的乘积

    配置 build 类型

    当您创建新模块时,Android Studio 会自动创建“debug”build 类型和“release”build 类型。那这里我们再自建一个other类型,就要来点不一样的。

        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
            debug {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
            other {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    
    配置产品变种

    创建产品变种与创建 build 类型相似。将产品变种添加到 build 配置中的 productFlavors 代码块,并添加所需设置。 产品变种支持与 defaultConfig 相同的属性,这是因为,defaultConfig 实际上属于 ProductFlavor类。

    所有变种都必须属于一个指定的变种维度,即一个产品变种组。您必须将所有变种分配给某个变种维度。

    如下示例,配置了维度"activate",配置了2个变体free和pro,代表免费版与专业版,

        flavorDimensions "activate"
        productFlavors{
            free {
                dimension "activate"
                //会在应用的包名后面追加.free
                versionNameSuffix "-free"
                buildConfigField 'boolean', 'IS_FREE_TRIAL', 'true'
            }
            pro {
                dimension "activate"
                //会在应用的包名后面追加.pro
                versionNameSuffix "-pro"
                buildConfigField 'boolean', 'IS_FREE_TRIAL', 'false'
            }
        }
    

    同步完成后,Gradle 会根据 build 类型和产品变种自动创建 build 变体,并按照 <product-flavor><Build-Type> 为其命名。最后的构建类型为上面三种类型的笛卡尔积


    这里就可以直接打出各个不同的变体来:


    若要选择要构建并运行的 build 变体,请依次前往 Build > Select Build Variant,然后从菜单中选择一个 build 变体。


    Build之后,buildConfig类下就会多出FLAVOR变量来


    但是此时Sdk还不能被app客户端依赖,因为客户端需要加一个属性定义才行。
    配置missingDimensionStrategy:

    defaultConfig {
            //使用missingDimensionStrategy指定lib module中的两个flavor,"activate"为lib module中定义的dimension
          //不然,app module将无法sync成功和找到lib module中的类
            missingDimensionStrategy "activate", "free", "free"
    }
    

    大概意思是:告诉编译插件缺少“activate”维度的free或pro两个flavor。
    此时依赖能正常编译,lib中的类也都能被app module中找到和使用了。

    到这里就可以引用库里面的代码了,可以选择直接引用project,可以打出aar包引用,也可以上传仓库引用。

    开发测试

    在sdk中编写类:

    object FlavorType {
    
        /**
         * 获取当前sdk功能版本是否为免费版
         */
        fun isCurVersionFree(): String {
            return BuildConfig.FLAVOR
        }
    }
    

    在app模块下调用测试:

            findViewById<TextView>(R.id.tv_flavor).apply {
                text = "当前SDK的版本是" + FlavorType.isCurVersionFree()
            }
    

    测试结果:


    成功读取到sdk中变体的配置值。

    参考:

    https://developer.android.com/studio/build/build-variants?hl=zh-cn
    https://blog.csdn.net/qq_29951983/article/details/112850442
    https://blog.csdn.net/u012149399/article/details/88124473

    相关文章

      网友评论

        本文标题:Android配置变体

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