Android多渠道打包且根据不同产品打包不同的assets资源目录

因为项目中存在多种环境,既要区分bebug与release版本,release又要区分测试环境与生产上线环境,每次打包都得浪费不少的等待时间;并且哪个版本有问题还得去切换环境一个个打包,关键是还得牢记每次切换环境需要修改的内容,尽管每次都检查仔细,但总有可能疏忽的时候,一旦有问题既浪费自己的时间又浪费测试人员的时间;因此不得不去研究一键切换环打包的功能

一、区别debug与release

首先在build.gradle中配置签名信息,为debug配置差异属性

android { 
 
defaultConfig {
    versionName "v2.2.2" 
    versionCode 20
}
 
signingConfigs {
        release {
            storeFile file('/Users/ram/WorkSpace/AndroidWorkSpace/....keystore')//签名key所在目录
            keyAlias '...'
            keyPassword '...'
            storePassword '...'
        }
    }
 
buildTypes {
    release {
        buildConfigField "Boolean", "isDebug", "false"//参数1:类型 参数2:变量名 参数3:变量值
        debuggable false
        minifyEnabled true //删除无用代码
        shrinkResources true//删除无用资源
        zipAlignEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release//签名
    }
    debug {
        buildConfigField "Boolean", "isDebug", "true"//参数一:类型,参数二:变量名,参数三:变量值
        debuggable true // debug模式下,显示log
        versionNameSuffix "-debug" // 为版本名添加后缀
        minifyEnabled false  
        zipAlignEnabled false  
        shrinkResources false   
    }
}

签名文件及其他通用代码应该都会熟悉,这里主要区别定义的一个常量

buildConfigField "Boolean", "isDebug", "false"//参数一:类型,参数二:变量名,参数三:变量值

这是用于区别是否调试版本,用于是否打印log日志时所用,java中调用方式:

public static final boolean isDebug = BuildConfig.isDebug;


在代码中就可以通过这个值判断是否需要开启Log;还有一个versionNameSuffix "-debug",这个是我的项目中需要显示版本号,在versionName后追加了一个名称,用以区分

二、多渠道区分,配置不同产品的差异属性

同样是在grdle中android{}目录里面添加

    productFlavors {//设置不同产品的特性
        uat {//测试环境
            buildConfigField "String", "HOST", "".....""
            versionName "v2.2.2.2" 
        }
        prod {//正式上线环境
            buildConfigField "String", "HOST", "".....""
            versionName "v2.2.2" 
        }
    }

这里配置两个不同产品渠道,根据自己的需求可增加删除,其中buildConfigField "String", "HOST", "".....""

同上面isDebug一样是根据环境差异增加的一个常量,我这里是用于访问服务器的地址更改;根据自己需求也可以增删改,这里要注意的是第三个参数字符串的双引号需要用转义字符;

同样在java中的调用方法:

public static final String ROOTHOST = BuildConfig.HOST;
其中versionName是对版本号名称的重命名,这是我项目中对不同环境做版本号区分所用;

三、打包apk文件的重命名

继续在grdle中android{}目录里面添加

 //apk文件重命名
    applicationVariants.all { variant ->
        variant.outputs.all {
            def fileName = "xxx-" + versionName + ".apk"
            outputFileName = fileName
//            output -> output.outputFileName = "NYTalk_" + buildType.name + "_" + defaultConfig.versionName + "_" //+ new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) + ".apk"
        }
    }

这个是用于打包的时候根据自己的需求重命名apk,简单点就自己项目名称加版本号,需要时间等其他参数也可用注释掉的代码,或者自行个更改;需要注意的是defaultConfig.versionName调用的是开始默认的versionName,需要用自己后面修改过的versionName命名,不加defaultConfig即可;

四、assets资源目录做区分

前面主要做的区分都是一些java代码可调用的变量;那么原生assets资源目录如何根据环境做区分:

1.项目结构视图调整为project,在src目录下,mian的同级目录创建uat与prod文件夹(根据productFlavors自己定义的不同产品渠道创建),并创建assets资源目录,这里资源目录里就可以放置不同渠道的同名不同资源,例如:

 

2.然后继续在grdle中android{}目录里面根据flavors指向定义的资源目录

sourceSets {
 assets.srcDirs = ['src/assets']
    uat{
        assets.srcDirs = ['src/ust/assets']
    }
    prod {
        assets.srcDirs = ['src/prod/assets']
    }
}

差异的资源根据产品做区分存放,通用的assets资源按原来的存放方式不变

3.不过我的项目因为是以前的eclipse迁移过来的,src下直接存放是java代码,res与src是同级目录,所以我这里创建的uat与prod文件夹是与src、res同级的,然后在gradle中的配置如下:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
        jniLibs.srcDirs = ['libs']
    }
    uat{
        assets.srcDirs = ['uat/assets']
    }
    prod {
        assets.srcDirs = ['prod/assets']
    }
 
}

五、环境一键切换,更改Build variants中相应即可,运行手机上切换平台就行

 

六、一键打包不同平台的apk

Gradle---项目名称下的Tasks---build---assemble,也可以根据不同的assemble生成特定apk

编译生成的apk在build--outputs下查看:

打包好的apk可以自行验证assets资源是否是对应的平台资源,可直接解压apk文件查看

原文地址:https://www.cnblogs.com/Im-Victor/p/11400830.html