日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...

發(fā)布時間:2023/12/10 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

今天寫一篇文章來總結(jié)下android批量打渠道包美團(tuán)版本。之前項目上一直用的是gradle 批量打包方式,那個速度啊真是令人發(fā)指,15個渠道得跑上半個小時,出去吃頓飯回來,還在跑。特別是趕上項目上線的話,如果給測試提交了正式版本1.0,突然發(fā)現(xiàn)有小bug要修復(fù),修復(fù)后又得重新批量打包半個小時。。。。無語啦。。。真佩服以前的耐心。。。。好了今天來看下打包方案 - 美團(tuán)多渠道打包方案。至于為撒是美團(tuán),應(yīng)該是這個方案是美團(tuán)的哪一位大神放出來的吧。

為什么要打渠道包

為什么要渠道打包,一個包不是挺好的嗎,一個包也可以發(fā)布到各個應(yīng)用市場嘛?以前剛?cè)腴T時候也是傻乎乎的這么想的。如果現(xiàn)在你老板提出這樣需求場景:亮仔呀,我想知道我們的APP在哪個應(yīng)用市場渠道下載的最多,我們以后就重點推廣這個渠道,用錢砸到排名前面!!! 亮仔傻眼了!!—— 所以不同渠道打包主要用來做統(tǒng)計分析,特別是游戲應(yīng)用,特別注意哪個渠道推廣的最有效。

下面是友盟平臺,APP統(tǒng)計各個渠道的分析圖:

TIM圖片20170620101652.png

從統(tǒng)計圖可以看出APP在各個渠道的用戶、活躍度、啟動次數(shù)、活動時長....還是比較詳細(xì)的,對運(yùn)營團(tuán)隊有著很大的指導(dǎo)作用哈。

怎么打渠道包

怎么渠道打包呢?亮仔就開始想了:這還不簡單,三步搞定:

1.我在Adminifest.xml文件里面配一個meta-data值,這個值寫死成某個渠道;

2.在用戶安裝了我們的APP后,我獲取這個寫死的渠道值然后上傳到后臺;

3.我挨個修改meta-data值,改成各個渠道然后編譯打包10分鐘搞定;

很快亮仔就開始上手,很快實現(xiàn)了老板提出的需求!!! 好景不長... 老板:亮仔啊,我們這個應(yīng)用下載量不給力啊,推廣不夠啊,這樣我們把我們APP發(fā)到市場上所有渠道上,廣撒網(wǎng)捕魚嘛,也不多就100多個渠道吧!!! 亮仔慌了:我擦,我打一個包需要2分鐘,100個包 3個多小時啊 這一天光打包了.....

所以基于上面的場景,我們發(fā)現(xiàn)主要有兩個問題:

打包的本質(zhì)是將渠道標(biāo)識傳遞給后臺

這一步已經(jīng)有第三方平臺幫我們做了,實現(xiàn)的思路應(yīng)該也也差不多,我們集成友盟的渠道統(tǒng)計分析即可。沒有必要寫一套自己的渠道統(tǒng)計分析。友盟渠道統(tǒng)計接入傳送門>>

怎樣快速打包

為什么打包會花那么長時間?因為每個渠道打一次包,就要重新編譯一次,所以耗時長。其實只要想辦法將打好的一個包,替換里面的meta-data值即可。我們來看下美團(tuán)多渠道打包是怎么做的:

1.首先你需要安裝python環(huán)境

不要被python環(huán)境搭建嚇到,其實就跟安裝一個普通的exe軟件差不多,下一步。。安裝后不需要配置什么環(huán)境變量之類。 [python下載傳送門 >>](https://www.python.org/downloads/)

2.項目中接入友盟統(tǒng)計

2.1 申請友盟的賬號

在Adminifest.xml中配置友盟ID和渠道標(biāo)識

android:name="UMENG_APPKEY"

android:value="***************">

android:name="UMENG_CHANNEL"

android:value="baidu" />

2.2 應(yīng)用啟動時上傳渠道標(biāo)識給友盟

ChannelUtil 是封裝的一個獲取渠道標(biāo)識的工具類

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

String channel=ChannelUtil.getChannel(this, "default channel");//獲取渠道名

AnalyticsConfig.setChannel(channel);//調(diào)用umeng api設(shè)置umeng渠道

}

}

ChaneUtil工具類直接偷來的~~

import java.io.IOException;

import java.util.Enumeration;

import java.util.zip.ZipEntry;

import java.util.zip.ZipFile;

import android.content.Context;

import android.content.SharedPreferences;

import android.content.SharedPreferences.Editor;

import android.content.pm.ApplicationInfo;

import android.content.pm.PackageManager.NameNotFoundException;

import android.preference.PreferenceManager;

import android.text.TextUtils;

public class ChannelUtil {

private static final String CHANNEL_KEY = "cztchannel";

private static final String CHANNEL_VERSION_KEY = "cztchannel_version";

private static String mChannel;

/**

* 返回市場。 如果獲取失敗返回""

* @param context

* @return

*/

public static String getChannel(Context context){

return getChannel(context, "");

}

/**

* 返回市場。 如果獲取失敗返回defaultChannel

* @param context

* @param defaultChannel

* @return

*/

public static String getChannel(Context context, String defaultChannel) {

//內(nèi)存中獲取

if(!TextUtils.isEmpty(mChannel)){

return mChannel;

}

//sp中獲取

mChannel = getChannelBySharedPreferences(context);

if(!TextUtils.isEmpty(mChannel)){

return mChannel;

}

//從apk中獲取

mChannel = getChannelFromApk(context, CHANNEL_KEY);

if(!TextUtils.isEmpty(mChannel)){

//保存sp中備用

saveChannelBySharedPreferences(context, mChannel);

return mChannel;

}

//全部獲取失敗

return defaultChannel;

}

/**

* 從apk中獲取版本信息

* @param context

* @param channelKey

* @return

*/

private static String getChannelFromApk(Context context, String channelKey) {

//從apk包中獲取

ApplicationInfo appinfo = context.getApplicationInfo();

String sourceDir = appinfo.sourceDir;

//默認(rèn)放在meta-inf/里, 所以需要再拼接一下

String key = "META-INF/" + channelKey;

String ret = "";

ZipFile zipfile = null;

try {

zipfile = new ZipFile(sourceDir);

Enumeration> entries = zipfile.entries();

while (entries.hasMoreElements()) {

ZipEntry entry = ((ZipEntry) entries.nextElement());

String entryName = entry.getName();

if (entryName.startsWith(key)) {

ret = entryName;

break;

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (zipfile != null) {

try {

zipfile.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

String[] split = ret.split("_");

String channel = "";

if (split != null && split.length >= 2) {

channel = ret.substring(split[0].length() + 1);

}

return channel;

}

/**

* 本地保存channel & 對應(yīng)版本號

* @param context

* @param channel

*/

private static void saveChannelBySharedPreferences(Context context, String channel){

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

Editor editor = sp.edit();

editor.putString(CHANNEL_KEY, channel);

editor.putInt(CHANNEL_VERSION_KEY, getVersionCode(context));

editor.commit();

}

/**

* 從sp中獲取channel

* @param context

* @return 為空表示獲取異常、sp中的值已經(jīng)失效、sp中沒有此值

*/

private static String getChannelBySharedPreferences(Context context){

SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(context);

int currentVersionCode = getVersionCode(context);

if(currentVersionCode == -1){

//獲取錯誤

return "";

}

int versionCodeSaved = sp.getInt(CHANNEL_VERSION_KEY, -1);

if(versionCodeSaved == -1){

//本地沒有存儲的channel對應(yīng)的版本號

//第一次使用 或者 原先存儲版本號異常

return "";

}

if(currentVersionCode != versionCodeSaved){

return "";

}

return sp.getString(CHANNEL_KEY, "");

}

/**

* 從包信息中獲取版本號

* @param context

* @return

*/

private static int getVersionCode(Context context){

try{

return context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;

}catch(NameNotFoundException e) {

e.printStackTrace();

}

return -1;

}

}

3.運(yùn)行打包腳本打包

3.1 下載打包腳本

下載解壓

3.2 配置渠道

配置渠道

3.3 拷貝apk包到PythonTool目錄下(與py同級)

apk包放置目錄

3.4 運(yùn)行py腳本 MultiChannelBuildTool.py即可打包完成。

(生成的渠道apk包在output_** 目錄下)

打包完成

ok,寫完啦!剛開始練習(xí)寫總結(jié)文章,有講的不清楚的,歡迎指正!!

搬磚啦

總結(jié)

以上是生活随笔為你收集整理的android打包工具多渠道批量打包,Android 快速渠道批量打包详解教程-美团多渠道打包方案...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。