Android 多渠道打包

本文详细介绍了Android应用的打包签名过程,包括签名的含义、作用和签名方法。接着,文章讲解了友盟和美团的多渠道打包实现,讨论了各自的优缺点。友盟的多渠道打包依赖于Gradle配置,而美团的方法则是利用apk的zip结构,通过添加特定文件快速生成渠道包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、应用的打包签名

1、打包是什么

打包就是根据签名和其他标识生成安装包。

2、签名是什么

1)在Android应用文件(apk)中保存的一个特别字符串

2)用来标识不同的应用开发者

3)一个应用开发者开发的多款应用使用同一个签名

3、为什么要用签名

1)Android系统要求每一个Android应用程序必须要经过数字签名才能够安装到系统中,也就是说如果一个Android应用程序没有经过数字签名,是没有办法安装到系统中的。

2)不同程序员开发的应用包名可能会相同,导致一个应用覆盖掉另一个应用。

如果只有包名的概念,那么如果B应用与已经安装好的A应用包名一样,那就实现覆盖,不合理。

而事实上是装不上B的,它会提示,存在包名一样,但签名不一样的应用,这就不会覆盖。

4、如何为APK签名

1)用来生成应用签名的文件

默认:debug.keystore

使用AS生成:xxx.jks

debug签名的应用程序不能在Android Market上架销售,它会强制你使用自己的签名。

不同电脑使用此文件生成的签名不一样。那就意味着如果你换了机器进行apk版本升级,那么将会出现上面那种程序不能覆盖安装的问题。

2)打包自己签名的APK(使用Android Studio)

如果有就打开Choose existing... ,如果没有就新建Create new。

> 上面的密码是用来访问最上面的path路径文件的密码。而最上面的文件用来生成一个签名字符串。

> 下面Alias是一个别名。接下来的密码:是用来生成一个签名的时候,还需要的一个密码。与上面的密码可以不一致。

> 再下面的25,指的是有效期。google应用市场规定应用的有效期不低于25年。还可以改为100年。也就是说100年以后,我们的xxx.jks签名文件就失效了。

> 指明生成的apk的位置,Build Type:release:发布版 debug:测试版。

> 点击finish,稍等一会

> 默认在As工程中bin下生成的apk文件也有签名。只是用到了debug_keystore(测试)的模式。而我们想发布到应用市场的话,那就需要我们自己提供一个签名,不能用默认的了,不合适。如下:

查看签名文件:

> 这是生成的用于生成签名的apk文件的文件。而上面的apk文件里已经包含了签名文件。

可能产生的错误:

现象:

Android导出APK包时出现,编译调试时不会出现。

错误信息:

Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" (English) [MissingTranslation]

Error:(63) Error: "baidutieba" is not translated in "en" (English) [MissingTranslation]

Error:(67) Error: "share_to_baidutieba" is not translated in "en" (English) [MissingTranslation]

错误截图:

解决办法:

resources 标签内增加两个属性即可:

xmlns:tools="http://schemas.android.com/tools"  

 tools:ignore="MissingTranslation">  

在哪个xml文件中报错,就在那个文件中添加。

 

把签名好的apk安装进去模拟器:

在AS中再次运行:

会有以下提示:

这就是已经存在包名一样,签名不一样的应用了。点击OK卸载重新安装或者点击Cancel取消安装。

5、在代码中得到应用的签名

6、注意

不要把xxx.keystore/xxx.jks文件弄丢。万一丢了只能重新签名,用户安装时必须先卸载才能成功安装。应用市场上的排行就会从0开始算起。

 

二、友盟多渠道打包

1、说明

1)什么是多渠道包?

渠道包就是要在安装包中添加渠道信息,也就是channel,对应不同的渠道,例如:小米市场、360市场、应用宝市场等。

2)为什么要提供多渠道包?

我们要在安装包中添加不同的标识,应用在请求网络的时候携带渠道信息,方便后台做运营统计(这就是添加渠道信息的用处)。

3)实现多渠道打包的原理:

一般来讲,这个渠道的标识会放在AndroidManifest.xml的Application的一个Metadata中。然后就可以在java中通过API获取对应的数据了。

4)如何实现?

现在android渠道多种多样,其实渠道不仅仅局限于应用市场,一种推广方式也可以看做一个渠道。介绍几个大公司高效的打包方式,借鉴一下。

第一种:友盟就提供了多渠道打包的方式,可用于渠道统计等。

现在Android的构建工具换成了gradle,通过gradle,简单配置后就可以实现自动打所有渠道包。

2、步骤

1)按照umeng的要求,manifest文件中和activity同级需要有

        <meta-data
        android:name="UMENG_CHANNEL"
        android:value="${UMENG_CHANNEL_VALUE}" />

这段配置,value那里就是wandoujia,360之类的渠道名称,但是我们在这里不会去写渠道名,写的是一个占位符,后面gradle编译的时候会动态的替换掉它。

2)在module(一般也就是app)的build.gradle的android{}中添加如下内容:

    productFlavors{
        wandoujia{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi{
            manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }

会出现错误:

Error:All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com

必须要保证所有的flavor 都属于同一个维度。

3.0之前配置多版本打包是不会有问题的,可以正常运行、打包。但是AndroidStudio升级到3.0之后,配置多版本打包运行的时候会提示这个错误。

在defaultConfig{}中添加:

flavorDimensions "default"

productFlavors是android节点的一个自节点。你需要打什么渠道的包,就在这里按umeng的要求用渠道名给UMENG_CHANNEL_VALUE赋值。

3)优化1:上面只是两个渠道,如果有几十个渠道,都这样写,重复的东西太多,观察到每个渠道就是flavor的名称,所以修改如下:

    productFlavors{
        wandoujia{
            //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi{
            //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

优化2:上面经过签名打包后生成的apk的名称是有默认命名规则的,如:xxx-xiaomi-release.apk 但是我们想包含版本信息如:xxx-xiaomi-release-1.0.apk,所以最终打包脚本如下:

    productFlavors{
        wandoujia{
            //manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
        xiaomi{
            //manifestPlaceholders=[UMENG_CHANNEL_VALUE: "xiaomi"]
        }
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }

出现错误:

Error:(65, 0) Could not find method releaseTime() for arguments [] on ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=xiaomiDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
<a href="openFile:E:\AndroidStudioProjects\MyApplication\app\build.gradle">Open File</a>

outputFile这个引用现在是“read-only”(只读)的,不能重新赋予新的对象。

gradle更新到3.0.0以后就不能这样写。

更改:

    applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def fileName
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
                outputFileName = fileName
            }
        }
    }

4)获取渠道

在代码中我们可以通过读取mate-data信息来获取渠道,然后添加到请求参数中,获取方法如下:

    private String getChannel() {
        try {
            PackageManager pm = getPackageManager();
            ApplicationInfo appInfo = pm.getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            return appInfo.metaData.getString("UMENG_CHANNEL");
        } catch (PackageManager.NameNotFoundException ignored) {
        }
        return "";
    }

5)执行签名打包:

这时候你去app中就能看到自动打好的渠道包了,可以看到有两个文件夹,wandoujia和xiaomi。

3、缺点

这样的打包方式效率比较低下,如果是几十个包还可以应付,打一个包快的话需要十几秒,慢的话需要几分钟不等,跟机器性能很有关系。

 

三、美团的多渠道打包

1、原理

把一个Android应用包当作zip文件包进行解压,然后发现在签名生成的目录下(META-INF)添加一个空文件不需要重新签名。利用这个机制,该文件的文件名就是渠道名。这种方式不需要重新签名等步骤,非常高效。

2、方法

已经将美团的打包工具放到了tools下的test01文件中:

tools链接:https://pan.baidu.com/s/1ZI7WjGAyu5j7rpUK9KF-cQ  提取码:nm7t 

1、将要打包的apk放到PythonTool中

2、在PythonTool/info/channel.txt中写入需要的渠道,一个渠道占一行

3、双击执行PythonTool/MultiChannelBuildTool.py文件(需要Python环境),就会生成渠道包

4、获取渠道信息:将JavaUtil文件中的ChannelUtil.java拷贝到工程,调用ChannelUtil.getChannel即可获取渠道

安装

配置环境变量path,添加安装的路径。

在工具下

把没有渠道的拖进,之后双击。就会有产生。

里面的内容:

准备好的渠道信息:

3、优缺点

优点:

这种打包方式速度非常快,900多个渠道不到一分钟就能打完。

缺点:

1、google如果哪天更改打包规则,使得在META-INF中建立空文件还需要重新打包,这种方式将不可用。

2、一些不法的渠道商很容易通过工具修改渠道,如果一个渠道商,通过网络劫持和篡改渠道的组合方式来获取暴利,对于程序开发者来说可能会存在着巨大的经济损失。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值