Android 多渠道打包

需求

為什么打那么多的渠道包纱意,相信這個不需要說明了,中國android發(fā)布的渠道多也是沒有辦法的峦朗。

多渠道打包的原理參照美團(tuán)多渠道打包,python的實現(xiàn)方法參照GavinCT

我的Java實現(xiàn)

我是做Android的薯酝,所以就用java實現(xiàn)了一遍。一個鞏固一下知識砂代,二是Android 的環(huán)境下面一定都有java環(huán)境了,不需要再裝python的環(huán)境了率挣。下面是具體的步驟泊藕。

  • 目錄排版如下
  • info
    • apks //存放需要添加渠道的apk文件
    • channel.txt //渠道信息文件
    • czt.txt //空文件
  • 第一步 加載 apks目錄下載所有的 apk文件
    private void initApks(){
        if (apks == null) {
            apks = new ArrayList<>();
        }else {
            apks.clear();
        }
        File apkDir = new File(channelConfigPath, "info/apks");
        if (!apkDir.exists()){
            throw new IllegalArgumentException("can't find apk files in :"  + apkDir.getAbsolutePath());
        }
        File[] files = apkDir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith(".apk");
            }
        });

        for (File f : files){
            apks.add(f);
        }

        if (apks.isEmpty()){
            throw new RuntimeException("not fond apk in :" + apkDir.getAbsolutePath());
        }

        System.out.println("init apk finish");
    }
  • 第二步加載渠道文件,文件內(nèi)容結(jié)構(gòu)如下:

360
baidu
等等

    private void initChannel(){
        if (channels == null){
            channels = new ArrayList<>();
        }else {
            channels.clear();
        }

        File channelFile = new File(channelConfigPath, "info/channel.txt");
        if (!channelFile.exists()){
            throw new IllegalArgumentException("can't find channel file at :"  + channelFile.getAbsolutePath());
        }

        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(channelFile));
            String ch = null;
            while ((ch = reader.readLine()) != null){
                channels.add(ch);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new RuntimeException("read channel file error");
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("read channel file error");
        }finally {
            if (reader != null){
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        System.out.println("init channel finish");
    }
  • 第三步生成一個空文件,用來添加到apk里面
    private void initEmptyFile(){
        if (srcEmptyFile == null){
            srcEmptyFile = new File(channelConfigPath, "info/czt.txt");
        }

        if (!srcEmptyFile.exists()) {
            try {
                srcEmptyFile.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
                throw new RuntimeException("create czt.txt file eroor");
            }
        }
    }
  • 最后生成渠道的apk文件
private void buildChannelApk(){


        for (File f : apks){
            String fileName = f.getName();
            String filerRealName = fileName.split("\\.")[0];

            File storeDir = new File(f.getParentFile(), filerRealName);
            if (!storeDir.exists()){
                storeDir.mkdirs();
            }

            for (String channel : channels){
                File outChannelFile = new File(storeDir, filerRealName + "_" + channel + ".apk");
                try {
                    FileUtils.copyFile(f, outChannelFile);
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException("copy apk file error" + f.getAbsolutePath());
                }
                try {
                    Map<String, String> env = new HashMap<>();
                    env.put("create", "true");
                    // locate file system by using the syntax
                    // defined in java.net.JarURLConnection
                    URI uri = URI.create("jar:" + outChannelFile.toURI());

                    try (FileSystem zipfs = FileSystems.newFileSystem(uri, env)) {
                        Path externalTxtFile = Paths.get(srcEmptyFile.toURI());
                        Path pathInZipfile = zipfs.getPath(String.format(CHANNEL, channel));
                        // copy a file into the zip file
                        Files.copy(externalTxtFile, pathInZipfile,
                                StandardCopyOption.REPLACE_EXISTING);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    throw new RuntimeException("build file error");
                }finally {

                }

                System.out.println("build " + outChannelFile.getName() +  " finish");
            }

            System.out.println("build apk finish");
        }
    }

獲取渠道信息的代碼參見GavinCT娃圆。
當(dāng)前項目的源代碼參見github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玫锋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子讼呢,更是在濱河造成了極大的恐慌撩鹿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悦屏,死亡現(xiàn)場離奇詭異节沦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)础爬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門甫贯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人看蚜,你說我怎么就攤上這事叫搁。” “怎么了供炎?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵渴逻,是天一觀的道長。 經(jīng)常有香客問我音诫,道長惨奕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任竭钝,我火速辦了婚禮梨撞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘香罐。我一直安慰自己卧波,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布穴吹。 她就那樣靜靜地躺著幽勒,像睡著了一般嗜侮。 火紅的嫁衣襯著肌膚如雪港令。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天锈颗,我揣著相機(jī)與錄音顷霹,去河邊找鬼。 笑死击吱,一個胖子當(dāng)著我的面吹牛淋淀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播覆醇,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼朵纷,長吁一口氣:“原來是場噩夢啊……” “哼炭臭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起袍辞,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤鞋仍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后搅吁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體威创,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年谎懦,在試婚紗的時候發(fā)現(xiàn)自己被綠了肚豺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡界拦,死狀恐怖吸申,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寞奸,我是刑警寧澤呛谜,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站枪萄,受9級特大地震影響隐岛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瓷翻,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一聚凹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧齐帚,春花似錦妒牙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至剪菱,卻和暖如春摩瞎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背孝常。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工旗们, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人构灸。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓上渴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子稠氮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 目錄一曹阔、Python打包及優(yōu)化(美團(tuán)多渠道打包)二、Gradle打包三隔披、其他打包方案:修改Zip文件的commen...
    守望君閱讀 5,689評論 4 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,099評論 25 707
  • 我們做Android用戶級應(yīng)用開發(fā)的時候都要考慮這樣的問題次兆,目前的應(yīng)用市場有很多,我們的安裝包是通過哪個渠道進(jìn)入用...
    尹star閱讀 8,763評論 11 26
  • Android多渠道打包 概述 每當(dāng)發(fā)新版本時锹锰,Android客戶端會被分發(fā)到各個應(yīng)用市場芥炭,比如豌豆莢,360手機(jī)...
    礪雪凝霜閱讀 2,133評論 2 11
  • 故障描述 redis機(jī)器的一個ssd盤出故障恃慧,只能讀不能寫园蝠。其他盤寫入速度也很慢。導(dǎo)致redis實例的aof刷新一...
    誰是2071閱讀 1,251評論 0 1