友盟多渠道打包

1.添加友盟统计依赖库
dependencies {
   compile 'com.umeng.analytics:analytics:latest.integration'
}

allprojects {
    repositories {
            mavenCentral()     
    }
}
2.Manifest中配置权限和Key
<manifest……>
<uses-sdk android:minSdkVersion="8"></uses-sdk>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<application ……>
……
<activity ……/>
<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/>
<meta-data android:value="${UMENG_CHANNEL_VALUE}" android:name="UMENG_CHANNEL"/>
</application>    
</manifest>
3.app build.gradle动态配置Manifest的占位符和默认值
defaultConfig {
        ...
        multiDexEnabled true // 突破方法数65535限制
        manifestPlaceholders = [UMENG_CHANNEL_VALUE:"umeng"]
    }
4.配置签名文件信息,注意:signingConfigs要在buildTypes之前
// 配置签名文件
    signingConfigs {
        debug {}
        release {
            keyAlias 'key0'
            keyPassword '123456'
            storeFile file('commom.jks')
            storePassword '123456'
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }
5.添加渠道信息
productFlavors {
        xiaomi{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        wandoujia{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
        }
    }
为了简单可以用脚本去替换重复代码
productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }
7.在Android studio的Terminal中使用命令gradlew assembleRelease进行打包(mac或Linux下使用./gradlew assembleRelease ),会在app的build下生成对应渠道的apk包
 8.可以配置多渠道打包输出的名字,比如打包的名字就是渠道名字
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
            //指定我们release包输出文件名就是我们渠道的名字
            applicationVariants.all { variant ->
                variant.outputs.each{ output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith(".apk")) {
                        def fileName = "${variant.productFlavors[0].name}"+".apk"
                        output.outputFile = new File(outputFile.parent, fileName);
                    }
                }
            }
        }
    }

9.其他技巧:
①可以给不同渠道的apk赋不同的应用名
productFlavors {
        xiaomi{
//            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
            resValue "string", "app_name", "xiaomi"
        }
        wandoujia{
//            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
            resValue "string", "app_name", "wandoujia"
        }
    }
②给测试打不同功能点可以安装在同一个手机上的测试包
    productFlavors {
//        xiaomi{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
//            resValue "string", "app_name", "xiaomi"
//        }
//
//        wandoujia{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
//            resValue "string", "app_name", "wandoujia"
//        }
        okhttp {
            applicationIdSuffix "okhttp"
            resValue "string", "app_name", "okhttp"
        }
        jpush {
            applicationIdSuffix "jpush"
            resValue "string", "app_name", "jpush"
        }
    }

// Android Studio3.0以后的写法
            android.applicationVariants.all { variant ->
                variant.outputs.all {
                    outputFileName = "${variant.productFlavors[0].name}.apk"
                }
            }

flavorDimensions "color"

android { ...

defaultConfig { ...

manifestPlaceholders = [ UMENG_CHANNEL_VALUE:"default_channel" ] }

productFlavors {

default_channel{}

wandoujia{}

_360{}

yingyongbao{}

xiaomi{}

baidu{}

huawei{}

jifeng{}

}

productFlavors.all { flavor -> flavor.manifestPlaceholders = [ UMENG_CHANNEL_VALUE:name ] }}

友盟渠道打包工具主要是提供基本的通过工程源码打包的功能。 常见错误见这里目前不支持的Apk特性见这里(可能会导致发布的SDK产生严重bug)。 Google 现在已经发布了最新的构建系统(New Building System) , 在 Android Studio 中已经支持了最新的 构建系统,如果开发者已经迁移,可以使用新的系统方面的生成渠道包,这是取代渠道打包工具的最佳方式。 1. 工程结构 工程结构图 : - CommonTools 共用的工具类,包括对 `Apktool` , `Jarsigner` , `zipalign` 的封装 - UIControls_35   共用的UI类,对大部分控件的样式都是在这里设置的 - UmengMarket  Marekt 组件,现在还没有实现 - UmengPackage 打包组件 - UmengTools 工程主要UI,管理 UmengMarket, UmengPackage, UmengTools 三个组件 - UmengWidget 小工具组件,目前仅有解包分析的功能 打包工具组件: - Source - Builder - ApkBuilder.cs     通过 APK 打包的 Builder 实现                    - Builder.cs            抽象 Builder 类,提供打包的主要逻辑                    - SourceBuilder.cs通过源码打包的 Builder 实现 (目前代码还没有实现)          - Worker.cs 打包过程对外接口 3. 打包流程 V2.0 版本仅实现了通过 .apk 打包的方式,本质上对  apk 文件进行反编译,修改 AndroidManifest.xml 文件后,再重新打包,我们使用的工具是开源的拆包工具 Apktool 将  apktool  添加到当前 process 的环境变量 执行 apktool d --no-src -f xxxx.apk temp 拆解apk 替换或者添加 AndroidManifest.xml 中的 友盟channel 执行apktool b temp  unsigned.apk 重新打包apk 执行 SignApk.jar 生成签名后的 apk 文件 执行 zipAlign 生成对齐优化后的 apk 文件 回到 3 替换新的渠道 完成打包 使用  JarSigner.jar 给 Apk 签名, SignApk.jar  文件是我们修改过的 apk 签名工具,实现了和 ADT 中一样的签名方式,使用如下: Usage: signapk file.{keystore} keystore_password key_entry key_password input.apk output.apk
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值