【Android】使用productFlavors构建多个变体

项目需求

在一个设备上安装两个一样的程序app

需求解决

我们知道每一个app都有一个包名的,如果一个app在Android设备上安装之后,再安装这个app的话会进行覆盖安装,因为他们两个的包名是一样的,默认是一个app。

但是我们现在需要将这一个app多次安装在一个Android设备上,那需要怎么实现这个需求呢?

实现这个需求的话,需要修改包名,我们可以使用productFlavors进行变体的构建和打包,这样的话,我们就可以将同一个app打包成不同包名的apk文件,这样就可以在一个Android设备上进行多次安装了。


Product Flavors允许开发者创建不同的应用版本,每个版本可以有不同的应用ID、版本名称、资源等。常见的用法包括:

  • 免费版与付费版
  • 不同功能集
  • 地区版本

每个变体都可以有不同的配置,包括代码、资源和依赖项。

例如在这个项目里面

我们可以构建两个资源文件目录

在和【res】同级别的目录下创建【res-flavors】文件夹,在这个文件下面创建两个文件夹【compass】和【wireless】两个资源文件夹,在里面放我们需要区别的文字、图片等资源,但是要注意,资源对应的名字是要相同的,资源可以不同。

接下来我们去【build.gradle】文件里面去构建我们的变体。

java 复制代码
android {
    compileSdkVersion 24
    buildToolsVersion "24.0.1"

    defaultConfig {
        applicationId "com.example" //原包名
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 1
        versionName "v" + releaseTime()
    }
    compileOptions {
        encoding 'GBK'
    }

    lintOptions {
        abortOnError false
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def flavorName = variant.flavorName
            if (flavorName == "compass") {
                outputFileName = "xx校正仪.apk" // 为 compass flavor 设置文件名
            } else if (flavorName == "wireless") {
                outputFileName = "xxxxxxxx校验仪.apk" // 为 wireless flavor 设置文件名
            } else {
                outputFileName = "xx校正.apk"
            }
        }
    }

    flavorDimensions "default"
    productFlavors {
        compass {
            applicationId "com.ble.compass"
            versionName "version compass 1.0"
        }

        wireless {
            applicationId "com.ble.wireless"
            versionName "version wireless 1.0"

        }
    }

    sourceSets {
        compass.res.srcDirs = ['src/main/res-flavors/compass']
        wireless.res.srcDirs = ['src/main/res-flavors/wireless']
    }

}

static def releaseTime() {
    return new Date().format("yyyMMdd_HHmm", TimeZone.getTimeZone("GMT+08:00"));
}

在这里面

java 复制代码
   sourceSets {
        compass.res.srcDirs = ['src/main/res-flavors/compass']
        wireless.res.srcDirs = ['src/main/res-flavors/wireless']
    }

是资源文件目录,指向的位置就是我们之前创建的文件地址。

java 复制代码
    productFlavors {
        compass {
            applicationId "com.ble.compass"
            versionName "version compass 1.0"
        }

        wireless {
            applicationId "com.ble.wireless"
            versionName "version wireless 1.0"

        }
    }

这两个就是我们创建的两个变体,里面设置了相应的变体的包名和版本名字。

java 复制代码
    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def flavorName = variant.flavorName
            if (flavorName == "compass") {
                outputFileName = "xx校正仪.apk" // 为 compass flavor 设置文件名
            } else if (flavorName == "wireless") {
                outputFileName = "xxxxxxxx校验仪.apk" // 为 wireless flavor 设置文件名
            } else {
                outputFileName = "xx校正.apk"
            }
        }
    }

这一部分就是在输出我们构建好的apk文件的名字,这样我们在进行构建apk文件之后,就会根据相应的变体显示相应的名字。

通过这样设置之后,【build】构建一下,然后我们在进行apk文件打包的时候就可以选择相应的版本了。

相关推荐
NotesChapter1 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快2 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl2 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江3 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-3 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记
佛系小嘟嘟3 小时前
Android Studio不显示需要的tag日志解决办法《All logs entries are hidden by the filter》
android·ide·android studio
mariokkm4 小时前
Django一分钟:django中收集关联对象关联数据的方法
android·django·sqlite
长亭外的少年4 小时前
如何查看 Android 项目的依赖结构树
android
深海呐6 小时前
Android 从本地选择视频,用APP播放或进行其他处理
android·音视频·从本地选择视频,用app播放·从本地选择视频,并拿到信息·跳转到本地视频列表
深海呐6 小时前
Android Google登录接入
android·google登录接入·android 谷歌登录接入·google登录·android google