zoukankan      html  css  js  c++  java
  • 快速打渠道包(分享整理)

    快速打渠道包

    何为渠道包

    每当发新版本时,Android客户端会被分发到各个应用市场,比如豌豆荚,360手机助手等。为了第三方统计平台以及自身服务端统计这些市场的效果(活跃数,下单数等),需要对各个不同的渠道市场所发的apk包用一些方法来唯一标识它们。 
    此外,有一些渠道作为首发渠道,也需要单独打出不一样的包(一般是splash页面有对应渠道的首发标识)。

    Maven式打包

    Maven是一个软件项目管理和自动构建工具,配合使用android-maven-plugin插件,以及maven-resources-plugin插件可以较为自动化地生成渠道包。

    在AndroidManifest.xml的节点中添加如下元素,用来定义渠道的来源

    <!-- 使用Maven打包时会用具体的渠道号替换掉${channel} -->
    <meta-data
            android:name="channel"
            android:value="${channel}" />
    
    再在程序启动时读取渠道号:
    PackageManager pm = context.getPackageManager();
                ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
                return appInfo.metaData.getString("channel");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    缺点:每打一个包都要执行一遍构建过程,效率太低。

    apktool式打包

    apktool是一个逆向工程工具,可以用它解码并修改apk中的资源。接下来详细介绍如何使用apktool生成渠道包。

    前期工作和用Maven打包一样,也需要在AndroidManifest.xml文件中定义元素,并在应用启动的时候读取清单文件中的渠道号。具体请参考前面的代码。

    和Maven不一样的是,每次打包时不再需要重新构建项目。打包时,只需生成一个apk,然后在该apk的基础上生成其他渠道包即可。

    小结:相当于Maven式的改进,不用每次都执行一次构建,节省了不少时间,但方式不太好,且也不够快。

    Gradle 打渠道包

    基本原理是利用Gradle的 manifest merger 功能 
    这个功能的主要用途是能够在运行时替换AndroidManifest.xml里面的内容

    第一步 在AndroidManifest.xml里配置meta-data
    <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />
    第二步 在模块的build.gradle文件的defaultConfig里加上PlaceHolder定义
    
    android {
        ...
    
        defaultConfig {
            ...
            manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ]
        }   
    }
    
    这里的作用有两个,一是声明UMENG_CHANNEL_VALUE是可替换值的PlaceHolder,二是为其设置默认值。
    
    
    第三步 在模块的build.gradle文件里添加ProductFlavors配置
    android {
        productFlavors {
            default_channel{}
            wandoujia{}
            _360{}
            yingyongbao{}
            xiaomi{}
            baidu{}
            huawei{}
            jifeng{}
        }
        productFlavors.all { flavor ->
            flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ]
        }
    }    
    
    
    第四步 一次生成所有渠道包
    
    到工程目录下运行gradlew assembleRelease。
    可以看到这次编译一共产生了对应productFlavors段的不同渠道包。
    
    可以反编译每个apk,打开AndroidManifest.xml看看,发现友盟这一段的配置已经相应的被修改了。
    
    <meta-data
            android:name="UMENG_CHANNEL"
            android:value="default_channel" />
    
    还可以利用Gradle生成单独的渠道包  
    如 gradlew assembleWandoujiaRelease  
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    META-INF 式打包

    可以只修改已有apk的渠道标志 
    快,批量,原理简单

    使用APK注释字段保存渠道信息和MAGIC字节,从文件末尾读取渠道信息,读取速度快

    打包速度快,可用于网站后台动态生成渠道包

    packerNg 式打包

    Android应用使用的APK文件就是一个带签名信息的ZIP文件,根据 ZIP文件格式规范,每个ZIP文件的最后都必须有一个叫 Central Directory Record 的部分,这个CDR的最后部分叫”end of central directory record”,这一部分包含一些元数据,它的末尾是ZIP文件的注释。注释包含Comment Length和File Comment两个字段,前者表示注释内容的长度,后者是注释的内容,正确修改这一部分不会对ZIP文件造成破坏,利用这个字段,我们可以添加一些自定义的数据,PackerNg项目就是在这里添加和读取渠道信息。

    为了提高性能,避免读取整个文件,还需要在注释的最后加入几个MAGIC字节,这样从文件的最后开始,读取很少的几个字节就可以定位渠道名的位置。

    http://www.woaipu.com/shops/zuzhuan/61406
    http://www.znds.com/tv-967956-1-1.html
    http://www.znds.com/tv-967958-1-1.html

    http://www.woaipu.com/shops/zuzhuan/61406
    http://www.znds.com/tv-967956-1-1.html
    http://www.znds.com/tv-967958-1-1.html

  • 相关阅读:
    利用runtime特性来动态调用方法
    点击屏幕获取对应tableviewcell
    IOS7导航栏与状态栏融合适配方法之一
    推送证书生成.p12
    OpenGL基础学习杂文
    android入门1.1
    java基础
    “Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。
    ArcEngine栅格和矢量渲染(含可视化颜色带)
    【转载】C#如何操控FTP,获取FTP文件或文件夹列表,获取FTP文件大小,FTP上传,FTP删除文件,FTP新建文件夹、删除文件夹
  • 原文地址:https://www.cnblogs.com/sy646et/p/7198063.html
Copyright © 2011-2022 走看看