Android 友盟多渠道快速打包

Android Studio Gradle 打包

友盟渠道设置

 data
     android:name="UMENG_APPKEY"
     android:value=""/>
 data
     android:name="UMENG_CHANNEL"
     android:value=""/>

通常都是在AndroidManifest.xml文件中写入一个meta标签,用来标识该渠道,每次打包就要更改清单文件,所以一般渠道不多的,可以通过Ant或者Gradle、apktool 来给程序进行多渠道批量打包.

Ant 打包与apktool 则要重新签名这两种方式比较麻烦,As 作为谷歌推荐新一代构建工具,Gradle 命令可以批量打包,缺点时间久。

步骤1 配置占位符

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

步骤二 配置Gradle

apply plugin: 'com.android.application'

def releaseTime() {
    return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}

android {
    def globalConfiguration = rootProject.extensions.getByName("ext")

    compileSdkVersion globalConfiguration.getAt("androidCompileSdkVersion")
    buildToolsVersion globalConfiguration.getAt("androidBuildToolsVersion")

    defaultConfig {
        applicationId "com.lazy.gank"
        minSdkVersion globalConfiguration.getAt("androidMinSdkVersion")
        targetSdkVersion globalConfiguration.getAt("androidTargetSdkVersion")
        versionCode 1
        versionName "1.0"

    }

    //配置签名文件
    signingConfigs {
        myConfig {
            //绝对路径和相对路径都可以
            storeFile file("lazy.jks")
            storePassword "123456"
            keyAlias "android"
            keyPassword "123456"
        }
    }

    //下面的代码开始打批量包
    productFlavors {
        // Define separate dev and prod product flavors.
        xiaomi {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
        }
        QQ {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "QQ"]
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    //改文件名
    applicationVariants.all { variant ->

        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = "Gank_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
                //def fileName = outputFile.name.replace(".apk", "-gra${defaultConfig.versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }

}

步骤三 运行打包命令

在项目根目录,以终端执行以下命令, assembleRelease 是生成所有productFlavorsv下的Release渠道包

gradlew assembleRelease ## 打Release包
gradlew assembleDebug ## 只打Debug包, DebugRelease 区别不用多说
gradlew assembleQQRelease ## 只打QQ渠道包

Python 脚本打包(美团自动化打包)

直接参考 美团Android自动化之旅—生成渠道包

META-INF

谷歌签名打包算法,如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。这种打包方式我亲身体验过速度的确非常快。

步骤1 利用Python 脚本向apk 的META-INF 目录写入带渠道标识为命名的空文件

步骤2 动态解析apk里的META-INF目录下的带有渠道标识命名的文件获取该渠道

Zip注释字段

在apk的末尾有一个 注释字段,修改该字段,同样对apk 签名无影响,因为它并不属于apk文件, 所以无非写入注释,读取带注释的渠道名

步骤1 向apk文件写入注释

步骤2 向apk读取注释(渠道)

coding

Android中如何 获取apk文件 path

ApplicationInfo 类

/**
 * Full path to the base APK for this application.
 */
public String sourceDir;

umeng 动态设置 channel

MobclickAgent.UMAnalyticsConfig config = new MobclickAgent.UMAnalyticsConfig(this, Config.UMENG_APPKEY, mChannelId);
MobclickAgent.startWithConfigure(config);

你可能感兴趣的:(Android)