Android多渠道打包,有網頁版,Gradle版,Python版、BAT腳本、Jar版

jopen 9年前發布 | 24K 次閱讀 Android Android開發 移動開發

 MutiChannelPackup Android多渠道打包,有網頁版,Gradle版,Python版、BAT腳本、Jar版…看大家的喜好選擇

  • META-INF渠道識別型:網頁版、Python版、BAT腳本、Jar版、

  •   Manifest渠道識別型:Gradle版

    META-INF渠道識別詳情請查看美團team博客 點擊查看

功能描述

  • 支持修改manifest渠道配置

  • 支持在apk的META-INFO目錄下生成渠道文件

  • APK不需要重新簽名

  • 現只對umeng渠道統計做了支持

  • 不需要第二次簽名

  • 對包無損害

功能更新中

  • 支持更多的第三方渠道統計工具

  • 編寫windowns bat腳本

  • 添加網頁版用戶體系、權限和數據庫配置

  • ……

網頁版

  • META-INF渠道識別

  • 使用簡單,非技術小白也可以用

  • 功能相對強大(設計中…)

    1、在android中獲取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "當前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 從apk中獲取版本信息  * @param context  * @param channelPrefix 渠道前綴  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //從apk包中獲取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默認放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; 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(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、在build-config.properties中配置渠道識別前綴(可選)

    3、把AndroidChannelBuild.war上傳到Java服務CHANNEL_VALUE器上

    4、輸入http://www.xxx.yyy/AndroidChannelBuild/

    5、上傳文件、填寫渠道前綴(可選)、輸入渠道名稱

    6、下載打包完成的渠道包

Gradle版

  •             支持manifest渠道配置

  •             使用簡單不易出錯

manifest渠道配置

    網絡上有好多人都是通過添加

android {  
    productFlavors {
        xiaomi {}
        360 {}
        baidu {}
        wandoujia {}
    }  

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

    代碼實現的多渠道打包,這樣有個問題,我們項目渠道號經常變,每個版本都有不同的渠道號,不停的在增加導致gradle文件就非常長。我今天特別為這個事情糾結了一上午發現還可以這么寫:

productFlavors {
        for (int i = 0 ; i < channelArray.size(); i++) {
            def channel = channelArray[i]
            "${channel}"{
                manifestPlaceholders = [CHANNEL_VALUE: channel]
            }
        }
    }

    讓我格外的驚喜,這里分享給大家

使用方法

    1、添加channels.properties渠道信息配置文件

#默認渠道 channel.default=paojiao #全部渠道列表 channel.list=baidu,360,hiapk....

    2、在module build.gradle引入channels.gradle配置文件

apply from: "https://raw.githubusercontent.com/MutiChannelPackup/gradle-build/master/channels.gradle"

    或者將channels.gradle下載到本地引入

apply from: "../channels.gradle"

    3、在manifest中添加

<meta-data android:name="UMENG_CHANNEL" android:value="${CHANNEL_VALUE}" />
<meta-data android:name="JPUSH_CHANNEL" android:value="${CHANNEL_VALUE}" />
...

    4、執行打包./gradlew assembleRelease或通過android studio->generate signed apk打包

    5、在module目錄下可以看到所有的渠道包

Python版

  •             支持META-INF渠道識別

  •             極速生成渠道包

  •             使用簡單不易出錯

使用方法

    1、在android中獲取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "當前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 從apk中獲取版本信息  * @param context  * @param channelPrefix 渠道前綴  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //從apk包中獲取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默認放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; 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(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、配置channels-config.ini文件

[Build-Config] #配置apk路徑 apk.path = /Users/pengjianbo/Documents/dev/android_dev/workspace/GradleBuildChannels/app/demo.apk #配置渠道識別前綴 channel.prefix = channel- #配置渠道列表 channel.list = baidu,qq,360,paojiao

    3、執行build-channels-script.py腳本

python build-channels-script.py

    4、可以看到生成了一個apks_{apk file name}的文件夾

Jar版

  •             支持META-INF渠道識別

  •             極速生成渠道包

  •             使用簡單不易出錯

使用方法

    1、在android中獲取渠道名:

    /**  * 友盟配置  */ private void umengConfig() { String channel = getChannelFromApk(this, "channel-"); if (StringUtils.isEmpty(channel)) {
            channel = "paojiao";
        } if ( Constants.DEBUG ) { Toast.makeText(IApplication.this, "當前渠道:" + channel, Toast.LENGTH_SHORT).show();
        } AnalyticsConfig.setChannel(channel);
    } /**  * 從apk中獲取版本信息  * @param context  * @param channelPrefix 渠道前綴  * @return  */ public static String getChannelFromApk(Context context, String channelPrefix) { //從apk包中獲取 ApplicationInfo appinfo = context.getApplicationInfo(); String sourceDir = appinfo.sourceDir; //默認放在meta-inf/里, 所以需要再拼接一下 String key = "META-INF/" + channelPrefix; 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(channelPrefix); String channel = ""; if (split != null && split.length >= 2) {
            channel = ret.substring(key.length());
        } return channel;
    }

    2、配置build-config.properties文件

#配置apk路徑 apk.path = /Users/pengjianbo/Documents/dev/android_dev/workspace/GradleBuildChannels/app/demo.apk #配置渠道識別前綴 channel.prefix = channel- #配置渠道列表 channel.list = baidu,qq,360,paojiao

    3、執行JarBuild.jar

java -jar JarBuild.jar

    4、可以看到在apk.path文件夾下生成了所有渠道包

BAT版

Upcoming...

項目主頁:http://www.baiduhome.net/lib/view/home/1445052311654

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!