多渠道打包

多渠道打包

01-应用的打包签名

 打包是什么?

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

 签名是什么?

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

 

 

2.用来标识不同的应用开发者:开发者A,开发者B

 

 

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

> 就好比是一个人写文章,签名就相当于作者的署名。

> 如果两个应用都是一个开发者开发的,那么签名就是一样的。

> 这个开发者,可以是个人,也可以是公司、团体。

 为什么要用签名?

原因1:最简单直接的回答: 系统要求的。

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

 

 

原因2:

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

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

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

 

 

 

 

 

 如何为APK签名?

  用来生成应用签名的文件

   默认: debug.keystore

 

 

 

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

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

 

 

 

   使用eclipse生成: xxx.keystore

   使用AS生成:xxx.jks

  打包自己签名的APK(使用android studio)

 

 

 

 

> 如果没有key store文件,那就创建一个

 

> 这里指定一个文件名。注意:在as中,签名文件keystore类型的文件变为jks格式的文件。

> 这里输入的是表明是谁,不适合写一个包名。

 

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

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

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

 

 

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

> 点击finish,稍等一会

 

 

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

 

 

 

查看签名文件:

 

     

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

 

 

 

 在代码中得到应用的签名?

public void getSingInfo() {

    try {

        PackageInfo packageInfo = getPackageManager().getPackageInfo(

                "com.atguigu.p2p", PackageManager.GET_SIGNATURES);

        Signature[] signs = packageInfo.signatures;

        Signature sign = signs[0];

        parseSignature(sign.toByteArray());

    } catch (Exception e) {

        e.printStackTrace();

    }

}

public void parseSignature(byte[] signature) {

    try {

        CertificateFactory certFactory = CertificateFactory

                .getInstance("X.509");

        X509Certificate cert = (X509Certificate) certFactory

                .generateCertificate(new ByteArrayInputStream(signature));

        String pubKey = cert.getPublicKey().toString();

        String signNumber = cert.getSerialNumber().toString();

        Log.e("TAG", "pubKey:" + pubKey);

        Log.e("TAG", "signNumber:" + signNumber);

    } catch (Exception e) {

        e.printStackTrace();

    }

}

 

 注意

  千万不要把xxx.keystore/xxx.jks文件弄丢了

  万一丢了只能重新签名了

案例:

公司程序员A写的应用,然后走了。后来来了一个程序员B把应用更新以后,又重新打包发布,使用的签名不一致。那完了。

导致出现更新不了应用的情况。必须把应用卸载了才能重新装。那想象一下,如果一个20万用户的应用,在更新时,发现安装不了。那可能随后就卸载了。或者就不更新了。

另外还影响的是:应用市场有下载量排名,如果重新签名,那就得重头来算。

 

 

 

   用户安装时必须先卸载才能成功安装

   应用市场上的排行就会从0开始了

 问题

现象:

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 标签内增加两个属性即可:

 

  tools:ignore="MissingTranslation">  

 

02-友盟的多渠道打包

 说明

1.什么是多渠道包?

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

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

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

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

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

 

 

4.如何实现?

现在android渠道多种多样,其实渠道不仅仅局限于应用市场,一种推广方式也可以看做一个渠道,比如:通过人拉人的方式去推广,官网上推广,百度推广等。所以说渠道成千上万,为了推广,有时候一次也会打成千的安装包,那你半天或者一天啥都别干了,所以介绍几个大公司高效的打包方式,借鉴一下。

 

 

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

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

 友盟打包实现步骤

1.按照umeng的要求,manifest文件中需要有

 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"]

          }

      }

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]

 }

 

 

3.优化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)

        }

    }

 }

 

 

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/build/outputs/apk中就能看到自动打好的渠道包了。

 

 缺点

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

03-美团多渠道打包

 原理

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

 方法

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

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

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

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

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

 优缺点

优点:

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

 

 

缺点:

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

 

 

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

 

04-360多渠道打包

 原理

apk文件本质就是zip文件,利用zip文件“可以添加comment(摘要)”的数据结构特点,在文件的末尾写入任意数据,而不用重新解压zip文件,我们就可以将渠道信息写入摘要区

 用法

已经将360多渠道打包工具放入了tools的test02文件中

 

 

1、将要写入渠道信息的apk放入MCPTool文件夹中

2、修改MCPTool.bat批处理文件,更改渠道和密码(渠道信息为了安全需要加密)

 

 

3、将apk拖到MCPTool.bat上执行,将会生成渠道包

 

 

4、修改MCPTool-check.bat中的密码和MCPTool.bat中的密码一致

 

 

5、将渠道包拖到MCPTool-check.bat上执行,就可以检查渠道信息是否正确

 

 

6、获取渠道:将MCPTool.java添加到工程或者将MCPTool.jar导入工程,调用MCPTool.getChannelId(this,"12345678","") 第一个参数为context,第二个是密码,第三个是默认值

 优缺点

优点:

1、5M的apk,1秒种能打300个

2、在下载apk的同时,服务端可以写入一些信息,例如邀请码,分享信息等

 

 

缺点:

渠道信息也是很容易修改,虽然可以加密,只是提高了修改的门槛

你可能感兴趣的:(Android基本开发)