Android多渠道(平台)打包

2024-05-26 17:18

本文主要是介绍Android多渠道(平台)打包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android多渠道(平台)打包

  • Android多渠道平台打包
    • 一认识Gradle
    • 二多渠道打包配置
      • 配置多渠道
      • 自定义渠道Apk名字
      • 不同渠道使用不同的签名
      • 打包
    • 三进阶开发配置
      • 配置不同的资源
      • 配置不同的代码
      • 版本号管理

前言:
开发中难免会遇到这样的两个需求:

  • 国内有n个Android市场,根据不同市场打包出渠道名不同的APK来统计下载量;
  • 同一个APK要给自己公司旗下不同的代理商使用,功能基本相同,但是图标等资源有较大差异,又或者签名也不同、服务器地址不同等等;

遇到这样的需求怎么做呢,难道要新建一个或者多个工程吗,或者在同一个工程上修改再一次次的打包吗?直觉告诉我们肯定有更简便的方法的,而且Android Studio和Gradle这么智能,所以我们就来一步步探究下。


一、认识Gradle

Gradle是一个集合了Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。

Gradle配置文件在项目中展示如下:
Gradle

build.gradle(Project: xxx):代表项目的基础配置文件。
build.gradle(Module: xxx):表示该模块的配置文件,也是项目最主要的配置文件。
setting.gradle(Project Settings):全局的项目配置文件,里面主要声明一些需要加入gradle的Module。

接下来我们主要看下build.gradle(Module: xxx)文件:

apply plugin: 'com.android.application'android {// 编译SDK的版本compileSdkVersion 25// buildTools版本buildToolsVersion "25.0.2"// 默认的配置defaultConfig {// 应用的包名applicationId "com.cooloongwu.multichannel"minSdkVersion 14targetSdkVersion 25versionCode 1versionName "1.0"testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"}buildTypes {release {// 是否进行代码混淆minifyEnabled false// 混淆文件的位置proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
}// 依赖项目
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:25.3.1'compile 'com.android.support.constraint:constraint-layout:1.0.2'testCompile 'junit:junit:4.12'
}

项目建好后,基本配置就这么多,下面我们一步步增加内容来实现多渠道(平台)的打包过程。

二、多渠道打包配置

1. 配置多渠道

在android标签中配置productFlavors,比如我的是天气应用,要给三个平台使用day,night,cold(没啥别的意思就是这么整的),那么分别进行如下配置,如果不同渠道的包名不同的话可以添加applicationId进行修改,通过manifestPlaceholders进行渠道名的配置。然后在AndroidManifest.xml的application标签中配置meta-data即可。

//多渠道打包配置,signingConfig可配置不同签名,在AndroidManifest.xml的application标签中配置meta-data即可,如下所示://<meta-data//android:name="CHANNEL"//android:value="${CHANNEL_VALUE}" />productFlavors {day {applicationId = "com.cooloongwu.multichannel.day"manifestPlaceholders = [CHANNEL_VALUE: "day"]//signingConfig signingConfigs.day}night {applicationId = "com.cooloongwu.multichannel.night"manifestPlaceholders = [CHANNEL_VALUE: "night"]//signingConfig signingConfigs.night}cold {applicationId = "com.cooloongwu.multichannel.cold"manifestPlaceholders = [CHANNEL_VALUE: "cold"]//signingConfig signingConfigs.cold}

上面是直接在gradle中配置的,当然也可以在File→Profile Structure中配置,如下图所示:

Flavors

配置好后点击Sync Project with Gradle Files同步项目,然后在Android Studio左下角的Build Variants中就多了你配置的渠道,如下所示:

Variant

当你选中其中一个比如coldDebug时,那么你点击“Run App”只会打包并运行这么一个coldDebug版本的,要想所有的一次性打包出来的话,可以见下文“打包”。

2. 自定义渠道Apk名字

根据不同的渠道名生成带渠道名前缀的Apk方便上传到不同的市场,需在android标签中配置applicationVariants.all,代码如下:

//自定义打包发布apk名字的格式:xxx_multichannel_1.2.1.apkapplicationVariants.all { variant ->variant.outputs.each { output ->def outputFile = output.outputFileif (variant.buildType.name == 'release') {def fileName = "${variant.productFlavors[0].name}_multichannel_${defaultConfig.versionName}.apk"output.outputFile = new File(outputFile.parent, fileName)}}
}

3. 不同渠道使用不同的签名

在android标签中配置signingConfigs,代码如下:

//多渠道签名配置signingConfigs {// day签名day{keyAlias day //别名keyPassword 'xxx'//别名密码storeFile file('D:/Key/day/ day.jks')//签名文件路径storePassword 'xxx'//签名密码}//night签名night{keyAlias night//别名keyPassword 'xxx'//别名密码storeFile file('D:/Key/night/night.jks')//签名文件路径storePassword 'xxx'//签名密码}//cold签名cold{keyAlias cold//别名keyPassword 'xxx'//别名密码storeFile file('D:/Key/cold/cold.jks')//签名文件路径storePassword 'xxx'//签名密码}
}

然后在productFlavors标签中各个渠道下,添加相应的签名配置即可,例如:signingConfig signingConfigs.day

4. 打包

按照上述配置配置完后,点击右侧栏中的Gradle,然后依次展开MultiChannel→:app→Tasks→build,可以看到有下方这些选项了:

Gradle

assemble以及其他各种assembleXXX顾名思义就是打包出相应的程序了,我们双击assembleRelease(打包所有渠道的Release版本),打包完后可以在MultiChannel\app\build\outputs\apk文件夹下看到相应的三个APK文件,并且文件名也自动生成好了:

三、进阶开发配置

1. 配置不同的资源

如果每个APK的应用名称需要定义的话,那么可以在productFlavors下每个渠道标签下配置:resValue “string”, “app_name”, ” XXX”。如果在这里配置了,那么在strings.xml中就不再需要配置了,否则会提示冲突并报错。
也可以在app→src下建立相应的文件夹,比如我这里建立了day文件夹,文件夹中内容同main文件夹类似,表示day这个渠道的应用会使用这个文件夹下的资源文件等,在strings.xml中配置不同的应用名称即可。
同理应用图标等图片各种资源也是这样的用法,如下图所示:

res

2. 配置不同的代码

这里要说的是类似微信登录、分享等的回调机制。这种回调机制需要固定的“包名+类名”来实现。来看下微信分享接受返回值的要求,如下图所示:

CallBack

这时问题就来了,你更改了包名,但是代码中的这处回调却没有,所以要在src下建立相应的目录及回调类,其中几点要求:

  1. 新建的目录层级要跟你在gradle文件中productFlavors下定义的applicationId一致。例如我这里是day,day的applicationId = “com.cooloongwu.multichannel.day”,一定要注意层级,千万不可出错;

day

2.当你复制WXEntryActivity.java文件到新目录后,记得要更改包名

packageName

3.在gradle中配置AppID等信息时,请注意字符串写法,如下图所示(当然这些信息不应直接暴漏出来,我这里只作为演示Demo使用);

Key

4.修改AndroidMainfast.xml中的WXEntryActivity节点代码,不同之处就是多了${APPLICATIONID},这个就是我们在gradle中配置的应用包名,这样确保能正确根据路径回调到相应的代码;

 <activityandroid:name="${APPLICATIONID}.wxapi.WXEntryActivity"android:exported="true"/>

3. 版本号管理

每次发布新版前忘记更改版本号怎么办,当然我们可以使用gradle来定义啊!可以参考http://www.jianshu.com/p/a1b0bc453319。
下面主要罗列两种方式吧(还是有缺陷,以后有好的方式再修改吧):

1、直接使用Git提交次数来定义VersionCode

def cmd_code = 'git rev-list HEAD --first-parent --count'
def gitVersionCode = cmd_code.execute().text.trim().toInteger()

2、使用日期和Git提交次数来定义VersionCode和VersionName

//(其实版本名这个东西还是需要靠手动控制,毕竟定版本信息还是需要靠人来决定,这个只是保证你每次提交代码后会更新下编译的版本号,版本名你可以自己定义,伪代码在下面了)
ext.majorCode = 1       //主版本号,手动修改
ext.minorCode = 0       //次版本号,手动修改
ext.revisionCode = 1    //修订版本号,手动修改
//ext.revisionDescriptionCMD = 'git describe --always'
//ext.tempRevisionDescription = revisionDescriptionCMD.execute().getText().trim()
//ext.revisionDescription = (tempRevisionDescription == null || (tempRevisionDescription).size() == 0) ? new Date().format("yyMMddhhss") : (tempRevisionDescription).substring((tempRevisionDescription).size() - 6)ext.compileCodeCMD = 'git rev-list HEAD --count'
ext.compileCode = compileCodeCMD.execute().getText().trim().toInteger()//编译版本号,自动修改,按照Git提交次数生成然后在gradle文件中定义两个方法来获取版本号和版本名称。
def getVersionCode(boolean isRelease) {// 正式环境if (isRelease) {majorCode * 1000000 + minorCode * 10000 + revisionCode + compileCode}// debug环境else {//直接返回一个日期Integer.parseInt(new Date().format("yyMMddhhss"))}
}def getMyVersionName() {majorCode + "." + minorCode + "." + revisionCode + "." + compileCode
}

最后在自定义打包apk文件名的代码中根据release或者debug来判断使用不同的版本名称:

//自定义打包发布apk名字的格式:xxx_multichannel_1.2.1.apkapplicationVariants.all { variant ->if (variant.buildType.name == 'release') {variant.mergedFlavor.versionCode = getVersionCode(true)} else {variant.mergedFlavor.versionCode = getVersionCode(false)}variant.outputs.each { output ->def outputFile = output.outputFileif (variant.buildType.name == 'release') {def fileName = "${variant.productFlavors[0].name}_multichannel_${defaultConfig.versionName}.apk"output.outputFile = new File(outputFile.parent, fileName)}}}

最后的最后,文章的源代码在GitHub:MultiChannel

这篇关于Android多渠道(平台)打包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1005089

相关文章

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短