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