【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文件打包的时候就可以选择相应的版本了。

相关推荐
CYRUS_STUDIO4 分钟前
使用 Dex2C 加壳保护 Android APK 代码
android·安全·逆向
alexhilton1 小时前
理解Jetpack Compose中副作用函数的内部原理
android·kotlin·android jetpack
恋猫de小郭5 小时前
腾讯 Kuikly 正式开源,了解一下这个基于 Kotlin 的全平台框架
android·前端·ios
贫道绝缘子5 小时前
【Android】四大组件之Activity
android
人生游戏牛马NPC1号6 小时前
学习Android(四)
android·kotlin
_祝你今天愉快6 小时前
安卓触摸事件分发机制分析
android
fyr897576 小时前
Ubuntu 下编译goldfish内核并使用模拟器运行
android·linux
心之所向,自强不息6 小时前
关于Android Studio的Gradle各项配置
android·ide·gradle·android studio
隐-梵6 小时前
Android studio学习之路(八)---Fragment碎片化页面的使用
android·学习·android studio
百锦再6 小时前
Kotlin学习基础知识大全(上)
android·xml·学习·微信·kotlin·studio·mobile