Android APK签名及友盟多渠道打包

概述

  • 打包:根据签名和其他标识生成安装包。
  • 签名:在APK中保存唯一标识符,版权标识,也避免包名相同导致应用的覆盖。
  • 多渠道打包:在APK中添加渠道唯一标识符,便于做数据统计。
  • 生成签名文件及友盟多渠道打包步骤。


生成签名文件


1. Build --- Generate Signed APK --- Create new

2. 填写保存路径、密码及App相关信息 --- OK


友盟多渠道打包


1. 注册登录友盟 --- 创建新应用 --- 生成Appkey

2. 在AndroidManifest.xml中配置友盟Appkey和渠道名占位符

<!-- 友盟Appkey -->
<meta-data
    android:name="UMENG_APPKEY"
    android:value="刚生成Appkey" />
<!-- 渠道名占位符 -->
<meta-data
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}" />

3. 在应用app的build.gradle中注入友盟库依赖

dependencies {
    compile 'com.umeng.analytics:analytics:latest.integration'
}

不用友盟以上步骤只留 ‘ 占位符 ’ 即可。

4. 签名

// 1. 配置签名
signingConfigs {
    debug {}
    // 给发布版配置
    release {
        storeFile file("ApkPack.jks")
        storePassword "111111"
        keyAlias "ApkPack"
        keyPassword "222222"
    }
}
// 2. 添加签名
signingConfig signingConfigs.release

5. 在应用app的build.gradle中编写脚本,动态替换渠道占位符。

// 渠道名
productFlavors{
    Aa{}
    Bb{}
    Cc{}
}

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

6. 指定APK文件名规则 --- 渠道名_版本号.apk

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            def fileName = "${variant.productFlavors[0].name}" + "_${defaultConfig.versionName}.apk"
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

7. Terminal控制台 --- gradlew assembleRelease --- 完成所有版本的打包

  • 只打包Aa的release --- gradlew assembleAaRelease
  • 只打包Aa的debug --- gradlew assembleAaRelea
  • 打包Aa的2个版本 --- gradlew assembleAa
1. 如果没有gradle,Android Studio会自行下载
2. 由于下载太慢,也不显示进度,可手动下载https://downloads.gradle.org/distributions/gradle-2.14.1-all.zip
3. 解压后放到C:\Users\Administrator\.gradle\wrapper\dists即可
4. 文件夹名一定要是gradle-2.14.1-all,与下载包文件名一致


完整代码


1. AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.eczom.apkpack">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 友盟Appkey -->
        <meta-data
            android:name="UMENG_APPKEY"
            android:value="58c583bec72dca7a5800078b" />
        <!-- 渠道名占位符 -->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

    </application>

</manifest>

2. build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.eczom.apkpack"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    // 配置签名
    signingConfigs {
        debug {}
        // 给发布版配置
        release {
            storeFile file("ApkPack.jks")
            storePassword "111111"
            keyAlias "ApkPack"
            keyPassword "222222"
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            // 添加签名
            signingConfig signingConfigs.release

            // 渠道名
            productFlavors {
                Aa {}
                Bb {}
                Cc {}
            }

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

            // 指定APK文件名规则 --- 渠道名_版本号.apk
            applicationVariants.all { variant ->
                variant.outputs.each { output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.endsWith('.apk')) {
                        def fileName = "${variant.productFlavors[0].name}" + "_${defaultConfig.versionName}.apk"
                        output.outputFile = new File(outputFile.parent, fileName)
                    }
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.2.0'
    testCompile 'junit:junit:4.12'

    //友盟库依赖
    compile 'com.umeng.analytics:analytics:latest.integration'
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值