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中调用方式:
1 | 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文件查看
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库