天天看點

Gradle 多管道打包

Studio中基于 umeng 統計的多管道打包。

1.配置友盟環境

在AndroidMainfest.xml的<application>标簽中添加相關資訊:APP_KEY和管道号。這裡管道号隻是一個占位符,在打包的階段可以動态的替換占位符裡的資訊。

<application
    ... >
    <meta-data
        android:name="UMENG_APPKEY"
        android:value="@string/UMENG_APPKEY"/>
    <meta-data
        android:name="UMENG_CHANNEL" 
        android:value="${UMENG_CHANNEL_VALUE}" 
        />
    ...
</application>
           

2.配置簽名資訊

app

module

中的

build.gradle

添加下列資訊:别名、别名密碼、簽名檔案位址和簽名密碼

signingConfigs {
    release {
        keyAlias 'xxx'
        keyPassword 'xxx'
        storeFile file('C:/Users/Administrator/Desktop/xxx.jks')
        storePassword 'xxx'
    }
}
           

3.設定

buildTypes

的簽名配置

因為要打

release

包,是以需要設定

buildTypes

release

的簽名配置,如下

buildTypes {
    // 設定debug版本預設管道設定
    debug {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng_channel"]
    }
    // 正式版本簽名設定
    release {
        zipAlignEnabled true
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release // 加上這句話即可
    }
}
           

4.配置管道資訊

管道号是自己定的,比如wandoujia(豌豆莢)等。不要使用數字開頭的命名方式,也不要使用

unknow

這樣的名字 。build.gradle(Module:app) 設定productFlavors。xml 中的管道号占位符

${UMENG_CHANNEL_VALUE}

,這裡就是要動态的替換占位符的内容,配置資訊如下:

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

5.執行打包指令

gradlew clean
gradlew assembleRelease
           

3.sycn project一下再打包即可,Build-->Generate signed APK,Flavors中多選,選擇需要的管道

5.完成,注意生成目錄

6.隐藏簽名資訊

簽名資訊這種東西屬于私密的資訊,應該保護起來,最好不要明文寫到 build.gradle 裡,更不要上傳到代碼倉庫中去。應該放在單獨的檔案中,在 build.gradle 裡去引用這個檔案讀取簽名資訊。

清空 signingConfigs

// TODO

7.跟蹤打包過程

建議在指令後面加上

--stacktrace

參數,這樣萬一指令執行失敗,可以看到詳細的出錯資訊

gradlew clean --stacktrace
gradlew assembleRelease --stacktrace
           

8.定制 apk 的檔案名:

app_版本名稱_版本号_日期_管道号.apk

def packageTime() {
    return new Date().format("yyyyMMdd-HHmmss", TimeZone.getTimeZone("UTC"))
}

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // 重命名産出的apk檔案
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                File outputDirectory = new File(outputFile.parent);
                def fileName
                if (variant.buildType.name == "release") {
                    fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
                } else {
                    fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
                }
                output.outputFile = new File(outputDirectory, fileName)
            }
        }
    }
}
           

輸出的目錄:

app/build/outputs/apk

9.删除備援的

unaligned apk

檔案

在 app/build/outputs/apk 檔案夾中,可以看到一些檔案名末尾帶有 unaligned 文字的備援檔案,這些檔案沒有用,可以删掉,隻需要在 build.gradle 中添加下列指令就好了

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // 重命名産出的apk檔案
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            File outputDirectory = new File(outputFile.parent);
            def fileName
            if (variant.buildType.name == "release") {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_${variant.productFlavors[0].name}.apk"
            } else {
                fileName = "app_v${defaultConfig.versionName}_${defaultConfig.versionCode}_${packageTime()}_debug.apk"
            }
            output.outputFile = new File(outputDirectory, fileName)
        }

        // 删除unaligned apk
        if (output.zipAlign != null) {
            output.zipAlign.doLast {
                output.zipAlign.inputFile.delete()
            }
        }
    }
}
           

繼續閱讀