Android Studio 渠道打包 小试

    由于androd的开源性,其平台多种多样,比如 应用宝、豌豆荚、360、小米商店、华为商店、vivo商店、oppo商店…等等,相比于ios,呈现出了一种多平台方式,而这个多平台导致了对于app的要求不同,若需求为使用某一平台的登录用户,如使用小米平台的小米账户或华为平台的华为账户等(往往附带使用了这个平台的支付等功能),那么,就必须为这个平台特意生成一个apk,而这个配置对于其他平台来说又是多余的,此时就需要做一种多渠道打包。再者,若需求为一个产品,如开发一款智慧城市功能app,此时,这款app作为商品化项目开发,必然要求最后以最方便的方式,做出一款针对某一城市或者乡镇的app,功能上可能略有差异,可根据代码或后台数据控制,而除此之外,难道要每次复制一份更改吗?当然不是,只需要配置好.build,那自然可以生成不同需求的app

需求

    需要为城市A、城市B开发一款智慧城市app,此时有城市C也想加入,那最后便是一件商品为三家共用,但是又不相同,若都用同一项目只改接口打包,那必然导致包名相同,不能同时安装,对于客户来讲,会认为产品不是特有的而各种不舒服;

方案

    使用多渠道打包

实施

一. 按照友盟官方文档说明,渠道信息通常需要在AndroidManifest.xml中配置如下值:

<meta-data android:value="Channel ID"android:name="UMENG_CHANNEL"/>

二. 在AndroidManifest.xml里设置动态渠道变量

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

三. build.gradle设置productFlavors

假定我们需要打包的渠道为360、小米、百度、豌豆荚

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

或者(笔者习惯这种方式):

android {  
    productFlavors {
        xiaomi {}
        qh360 {}
        baidu {}
        wandoujia {}
    }  

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

四. 执行 Build -> Generate Signed APK…便会看到效果

当然还有其他方式配置但是都是大同小异,对于使用不同包名的apk可以如下方式

android {  
    productFlavors {
        xiaomi {
            applicationId "cn.**.test1"
            }
        qh360 {
            applicationId "cn.**.test2"
            }
        baidu {
            applicationId "cn.**.test3"
            }
        wandoujia {
            applicationId "cn.**.test4"
            }
    }  

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

当然,可以选择签名编译生成apk,需配置如下:

signingConfigs {
    debug {
        storeFile file('./../signKey.jks')//签名文件路径
        storePassword "123456"
        keyAlias "sign"
        keyPassword "123456"  //签名密码
        println("====== signingConfigs.debug ======")
    }
    release {
        storeFile file('../signKey.jks')//签名文件路径
        storePassword "123456"
        keyAlias "sign"
        keyPassword "123456"  //签名密码
        println("====== signingConfigs.release ======")
    }
}

此时要使签名生效,自然要像方法一样去调用,在buildTypes节点中调用即可,例如

buildTypes {
    debug {
        ...
        signingConfig signingConfigs.debug
        ...
    }
    release {
        ....
        signingConfig signingConfigs.release
        ...
    }
}

如此,签名即可在打包时生效,而这个打包并非是使用Build -> Generate Signed APK…,而是让其自动构建,打开studio右侧的Gradle

gradle

assembleDebug、assembleRelease双击或右键选择run即可进行编译,编译结果可在Project格式的目录app -> build -> outputs -> apk文件夹中查看到,此时生成的apk便是已经签名了的

其中,若需要使生成的apk使用特定名称,可在android节点下进行如下配置即可

android.applicationVariants.all {
        variant -> variant.outputs.each {
        output -> output.outputFile = new File(output.outputFile.parent, "DialogTest_" + defaultConfig.versionCode +  "_v" + defaultConfig.versionName +"_"+buildType.name+ ".apk");
    }
}

当然,这个格式并没有定式,可根据需求进行相应更改。

如有疏漏,欢迎指正,必当虚心接受!

猜你喜欢

转载自blog.csdn.net/jerycoupter/article/details/64210894