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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章