Android Studio Gradle 多渠道,多appkey签名打包

关于多渠道签名打包可以直接参考 友盟官方提供的gradle脚本

umeng-muti-channel-build-tool

由于项目中引用了多个三方插件(如:地图服务、推送服务、统计服务等)

对应的 包名不一样(为了方便测试 区分了 测试&正式 版本),所以对应的服务 appkey也不一样

所以对这个脚本进行了修改

build.gradle

apply plugin: ‘com.android.application‘

dependencies {
    compile fileTree(dir: ‘libs‘, include: [‘*.jar‘])
    compile fileTree(dir: ‘libs‘, include: ‘**/*.so‘)
    compile ‘com.android.support:appcompat-v7:20.0.0‘
}

android {

    compileSdkVersion Integer.parseInt(project.ANDROID_BUILD_SDK_VERSION)
    buildToolsVersion project.ANDROID_BUILD_TOOLS_VERSION

    defaultConfig {
        applicationId project.ANDROID_BUILD_APPLICATIONID_DEBUG

        minSdkVersion Integer.parseInt(ANDROID_BUILD_MIN_SDK_VERSION)
        targetSdkVersion Integer.parseInt(ANDROID_BUILD_TARGET_SDK_VERSION)
        versionCode Integer.parseInt(project.VERSION_CODE)
        versionName project.VERSION_NAME
    }

    //渠道
    productFlavors {
        develop { }
        production {
            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
        }
        googleplay {
            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
        }
        wandoujia {
            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
        }
//        store91 {
//            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
//        }
//        qq {
//            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
//        }
//        anzhi {
//            applicationId project.ANDROID_BUILD_APPLICATIONID_PRODUCTION
//        }
    }

    sourceSets {
        main {
            assets.srcDirs = [‘assets‘]
            jniLibs.srcDirs = [‘libs‘]
        }
    }

    //签名
    signingConfigs{
        release {
            storeFile file("keystore路径")
            storePassword "***"
            keyAlias "***"
            keyPassword "***"
        }
    }

    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘
            signingConfig signingConfigs.release
        }
    }

    packagingOptions {
        exclude ‘META-INF/DEPENDENCIES‘
        exclude ‘META-INF/NOTICE‘
        exclude ‘META-INF/LICENSE‘
        exclude ‘META-INF/LICENSE.txt‘
        exclude ‘META-INF/NOTICE.txt‘
    }

    //这个是解决lint报错的代码
    lintOptions {
        abortOnError false
        // 防止在发布的时候出现因MissingTranslation导致Build Failed!
        disable ‘MissingTranslation‘
    }

}

tasks.withType(Compile) {
    options.encoding = "UTF-8"
}

//替换AndroidManifest.xml的UMENG_CHANNEL_VALUE字符串为渠道名称 By Remex Huang
android.applicationVariants.all{ variant ->
    variant.processManifest.doLast{

        //之前这里用的copy{},我换成了文件操作,这样可以在v1.11版本正常运行,并保持文件夹整洁
        //${buildDir}是指./build文件夹
        //${variant.dirName}是flavor/buildtype,例如GooglePlay/release,运行时会自动生成
        //下面的路径是类似这样:./build/manifests/GooglePlay/release/AndroidManifest.xml
        def manifestFile = "${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml"

        //将字符串UMENG_CHANNEL_VALUE替换成flavor的名字
        def updatedContent = new File(manifestFile).getText(‘UTF-8‘).replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
        //替换包名、appkey
        if ("develop".equalsIgnoreCase("${variant.productFlavors[0].name}")){
            updatedContent = updatedContent.replaceAll("BAIDU_APPKEY_VALUE", "${project.BAIDU_APPKEY_VALUE_DEBUG}").replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_DEBUG}").replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_DEBUG}").replaceAll("APPLICATIONID", "${project.ANDROID_BUILD_APPLICATIONID_DEBUG}")
        } else {
            updatedContent = updatedContent.replaceAll("BAIDU_APPKEY_VALUE", "${project.BAIDU_APPKEY_VALUE_PRODUCT}").replaceAll("UMENG_APPKEY_VALUE", "${project.UMENG_APPKEY_VALUE_PRODUCT}").replaceAll("JPUSH_APPKEY_VALUE", "${project.JPUSH_APPKEY_VALUE_PRODUCT}").replaceAll("APPLICATIONID", "${project.ANDROID_BUILD_APPLICATIONID_PRODUCTION}")
        }
        new File(manifestFile).write(updatedContent, ‘UTF-8‘)

        //将此次flavor的AndroidManifest.xml文件指定为我们修改过的这个文件
        variant.processResources.manifestFile = file("${buildDir}/intermediates/manifests/${variant.dirName}/AndroidManifest.xml")

    }
}

gradle.properties

ANDROID_BUILD_TOOLS_VERSION=19.1.0
ANDROID_BUILD_SDK_VERSION=19

VERSION_NAME=1.0
VERSION_CODE=1
GROUP=com.fallenpanda.app

ANDROID_BUILD_MIN_SDK_VERSION=7
ANDROID_BUILD_TARGET_SDK_VERSION=15

#DEBUG包名
ANDROID_BUILD_APPLICATIONID_DEBUG=com.fallenpanda.app.demo
#PRODUCTION包名
ANDROID_BUILD_APPLICATIONID_PRODUCTION=com.fallenpanda.app

BAIDU_APPKEY_VALUE_DEBUG=百度地图服务 DEBUG包名对应的appkey
BAIDU_APPKEY_VALUE_PRODUCT=百度地图服务 PRODUCTION包名对应的appkey

UMENG_APPKEY_VALUE_DEBUG=友盟服务 DEBUG包名对应的appkey
UMENG_APPKEY_VALUE_PRODUCT=友盟服务 PRODUCTION包名对应的appkey

JPUSH_APPKEY_VALUE_DEBUG=极光推送服务 DEBUG包名对应的appkey
JPUSH_APPKEY_VALUE_PRODUCT=极光推送服务 PRODUCTION包名对应的appkey

AndroidManifest.xml

其中需要替换包名的地方用 APPLICATIONID 替代

渠道用 UMENG_CHANNEL_VALUE 替代

appkey分别用 BAIDU_APPKEY_VALUE、UMENG_APPKEY_VALUE、JPUSH_APPKEY_VALUE 替代

------------------------------------

最后clean

分别执行assembleGoogleplayRelease,分别生成渠道包

或者直接执行assembleRelease,一起生成

即可在项目build\outputs\apk目录下找到生成的apk

技术分享

-unaligned 后缀的apk仅仅是中间产物,直接无视

-release 后缀的就是各个渠道正式签名后的apk了


参考原文地址:http://my.oschina.net/uboluo/blog/157483

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。