1. 程式人生 > >友盟多渠道打包 Android Apk

友盟多渠道打包 Android Apk

目前專案中使用到了多渠道打包的功能,首先理解多渠道打包,渠道可理解成安卓apk應用市場平臺,所以多渠道打包可以理解成在打包多個應用市場的apk,要在每個應用市場上打包一個安卓Apk,這樣好處是可以在檢視apk在每個安卓市場的下載量,活躍度,便於公司進行重點運營和推廣,因為友盟多渠道統計比較成熟,所以公司採用的是友盟的多渠道打包統計;

多渠道打包的步驟:
1,首先去到上面官網為自己的應用申請Appkey
2,然後下載整合SDK,本人是使用AndroidStudio整合的,好處是直接在app Module 的build.gradle中新增如下依賴就可以:

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

3.manifest的配置主要包括新增許可權,以下許可權缺一不可,填寫Appkey和填寫渠道id三部分

<manifest……>
<uses-sdk android:minSdkVersion="8"></uses-sdk>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <application ……> …… <activity ……/> <meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"
/>
</application> </manifest>

上面不清楚可以去到官網仔細瀏覽一遍;
從第三部開始 我自己Module 中 manifest的應用配置如下:

    <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>

        <meta-data
            android:name="UMENG_APPKEY"
            android:value="4f83c5d852701564c0000011" /><!--友盟 Appkey 自己應用註冊申請來的-->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" /> <!--渠道號,多渠道這裡使用了佔位符$-->
    </application>

因為我們要在多個應用市場上面打包,所以這裡的value的值我們不能寫死,比如寫huawei,這樣只打華為應用市場的apk,而我們是多個市場的,所以這裡使用佔位符是動態獲取;
下面要渠道app build.gradle中進行配置

1.首先要新增一個 渠道號

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "multi_channel.shion.com.multichannel"
        minSdkVersion 9
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        // AndroidManifest.xml 裡面UMENG_CHANNEL的value為 ${UMENG_CHANNEL_VALUE}
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]//新增一個預設渠道號
    }

2.配置打包相關

  //新增我們簽名檔案配置
    signingConfigs {
        debug {
            storeFile file("liverpool.jks")//key store
            storePassword "123456"
            keyAlias "multichannel"
            keyPassword "123456"
        }
        release {
            storeFile file("liverpool.jks")
            storePassword "123456"
            keyAlias "multichannel"
            keyPassword "123456"
        }
    }

    //打包相關配置
    buildTypes {
        debug {
            shrinkResources true // 移除無用的resource檔案
            minifyEnabled false //不啟用混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',
                    'proguard-fresco.pro'
            //簽名配置
            signingConfig signingConfigs.debug
        }
        release {
            shrinkResources true // 移除無用的resource檔案
            minifyEnabled false //不啟用混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //簽名配置
            signingConfig signingConfigs.release
        }
    }

上面都有註釋 打包相關配置buildTypes中分別配置了測試(debug)和釋出(release),我們最主要關心的是簽名配置 signingConfig 的值,我們都寫在了signingConfigs的配置了,而且這個要寫在 buildTypes 的上面,不然打包的時候會報如下錯誤:
這裡寫圖片描述
至於release {
storeFile file("liverpool.jks")
storePassword "123456"
keyAlias "multichannel"
keyPassword "123456"
}

是我們申請apk打包的的時候都必須要自己弄得,(沒搞過的話,自己隨便建個工程打包就知道了)

3.下面就是最關鍵的部分了

配置多渠道打包:也是我們公司產品要釋出的應用市場

 //多渠道打包支援
    productFlavors {
        Alpha {//自己打包測試使用
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Alpha]
        }
        Tencent {//投放應用寶市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Tencent]
        }
        Baidu {//投放百度市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Baidu]
        }
        Wandoujia {//投放豌豆莢市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Wandoujia]
        }
        PP {//投放PP助手市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: PP]
        }
        Qihoo {//投放PP助手市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Qihoo]
        }
        Vivo {//投放vivo市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Vivo]
        }
        Oppo {//投放oppo市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Oppo]
        }
        Xiaomi {//投放小米市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Xiaomi]
        }
        Meizu {//投放魅族市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Meizu]
        }
        Huawei {//投放華為應用市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Huawei]
        }
        Lenovo {//投放聯想市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Lenovo]
        }
        Letv {//投放樂視市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Letv]
        }
        Gionee {//投放金立市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: Gionee]
        }
        HiMarket {//投放安卓市場
            //     manifestPlaceholders = [UMENG_CHANNEL_VALUE: HiMarket]
        }

    }
    //注意我註釋掉的,可以去掉註釋,那樣的話,下面這句就可以不用了
    productFlavors.all {
        flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

解釋:productFlavors 支援多渠道打包,使用它的話,可以為下面每一個市場打包一個apk,裡面也是用了manifestPlaceholders 使用相關的值替換了UMENG_CHANNEL_VALUE
如果怕麻煩,可以像上面那樣寫使用

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

會遍歷productFlavors下面所有的名稱替換UMENG_CHANNEL_VALUE ;
最後使用gradlew assembleRelease 打生產包 ;gradlew assembleDebug 打測試包
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述