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

转:http://my.oschina.net/fallenpanda/blog/373183?p={{page}}



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

umeng-muti-channel-build-tool

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

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

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

build.gradle

?
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值