android上传应用程序,需要区分各个信道。

通常更改配置文件中的一个通道id,假设有多个通道,手动更改并生成apk这将是非常麻烦的,及增加误差的概率。

在这个课堂上分享一个打包工具。也可在网上类似的。我是做IT优化的基础上,,特别是封装so文件,一句小小的命令废了好大劲。

我们项目中使用的umeng做统计分析工具。 umeng在分渠道打包的时候须要改动manifest.xml中的

<meta-data  android:name="UMENG_CHANNEL" android:value="@string/channel_name" />  value值。

该值放到了strings.xml中<string name="channel_name">app_channel</string>,所以在编译的时候仅仅需改动app_channel。

以下是工具类,直接执行就可以.

package com.yang.main;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
/*** @description: android渠道打包工具类,确保路径填写无误,渠道名称填入channels中* @author: hytfly@gamil.com* @time:    2012-10-23下午5:17:47*/
public class CompiledApkUpdate {private static final String androidSDK_PATH = "D:\\android\\android-sdk-windows\\";        //android SDK路径public static final String APK_NAME = "duitang.apk";public static final String PROJECT_LIBARY = "";public static final String PROJECT_PATH = "D:\\android\\workspace\\tmp\\duitang\\";        //要打包的project路径public static final String APK_PATH = "D:\\android\\workspace\\tmp\\apk\\duitang_";        //打包后存放apk的路径  duitang_是前缀private static final String apk_PATH_keystore = "D:\\android\\keystore\\bb";        //apk签名文件路径private static final String channelFlag = "app_channel";//    public static String[] channels = {"duitang"}; private static String currentChannelName = "";public static String[] channels = {"duitang","91","360","QQ","jifeng","anzhuo","anzhi","youyi","appchina","wangyi","baidu","souhu","3g","nduo","xiaomi","huawei","meizu","lianxiang","aliyun","taobao","google","nearme","mumayi","wandoujia","crosscat","dangle","maopao","feiliu"}; public static void main(String[] args) { replaceChannel();}/*** 替换渠道名称*/public static void replaceChannel() {try {String outPath = PROJECT_PATH + "res\\values\\strings.xml"; // 输出文件位置String content = read(outPath);for(int channelid=0;channelid<channels.length;channelid++){String tmpContent = content;tmpContent = tmpContent.replaceFirst(channelFlag, channels[channelid]);currentChannelName = channels[channelid];write(tmpContent,outPath);System.out.println("replace channel name over...");packageRes(); // 一次渠道号的更改完毕。能够进行打包了。createUnsignedApk();signedApk(channelid);}write(content,outPath);        //完毕后还原channel_nameSystem.out.println("execute over!");} catch (Exception e) {e.printStackTrace();}}/*** class文件打包成classes.dex*/public static void packageDex(){try { System.out.println("dx.bat start...");Process process = Runtime.getRuntime().exec(androidSDK_PATH+"platform-tools\\dx.bat --dex --output="+PROJECT_PATH+"bin\\classes.dex "+PROJECT_PATH+"bin\\classes "+PROJECT_PATH+"libs\\*.jar"); new MyThread(process.getErrorStream()).start();new MyThread(process.getInputStream()).start();process.waitFor();  process.destroy();  System.out.println("dx.bat over...");} catch (Exception e) { e.printStackTrace(); } }/*** res assets文件打包成res.zip*/public static void packageRes(){try{System.out.println(currentChannelName+" create resources.ap");String library = "";if(PROJECT_LIBARY!=null&&!PROJECT_LIBARY.equals("")){library = "-S " + PROJECT_LIBARY + "res ";}Process process = null;process = Runtime.getRuntime().exec(  androidSDK_PATH+ "platform-tools\\aapt.exe package -f " +"-M " + PROJECT_PATH + "AndroidManifest.xml " +            //-M 指定配置文件"-S " + PROJECT_PATH + "res " +                            //-S 指定资源文件library +"-A " + PROJECT_PATH + "assets " +                        //-A 指定assets"-I " + androidSDK_PATH + "platforms\\android-16\\android.jar " +    //-I 指定android类"-F " + PROJECT_PATH + "bin\\resources.ap_ --auto-add-overlay"); // 将资源文件打包resources.ap_new MyThread(process.getErrorStream()).start();new MyThread(process.getInputStream()).start();process.waitFor();process.destroy();System.out.println(currentChannelName+" resources.ap over...");}catch(Exception e){e.printStackTrace();}}/*** classes.dex res.zip AndroidManifest.xml组合成未签名的apk*/public static void createUnsignedApk(){try{System.out.println(currentChannelName+" createUnsignedApk start");Process process = null;process = Runtime.getRuntime().exec(androidSDK_PATH+ "tools\\apkbuilder.bat "+ PROJECT_PATH + "bin\\"+APK_NAME+" -u -z "+ PROJECT_PATH + "bin\\resources.ap_ -f "+ PROJECT_PATH + "bin\\classes.dex"+" -rj "+ PROJECT_PATH + "libs"     //这里非常重要假设要打包libs的jar包请增加到上面字符串+" -nf "+ PROJECT_PATH + "libs"       //这里是我试了好多次翻阅各种资料才成功的,给大家分享了。

这样打包才干够把so文件也打包进去。 ); // 生成未签名的apk. new MyThread(process.getErrorStream()).start(); new MyThread(process.getErrorStream()).start(); process.waitFor(); process.destroy(); System.out.println(currentChannelName+" createUnsignedApk over"); }catch(Exception e){ e.printStackTrace(); } } /** * 签名apk */ public static void signedApk(int channelid){ try{ System.out.println(currentChannelName+" signed apk start"); Process process = null; String jarsigner; jarsigner = "jarsigner -keystore "+apk_PATH_keystore+" -storepass ***** -keypass ****** " + "-signedjar " + APK_PATH + channels[channelid] + ".apk " + PROJECT_PATH + "bin\\"+APK_NAME+" *****"; //签名apk process = Runtime .getRuntime() .exec(jarsigner); // 对apk进行签名 new MyThread(process.getErrorStream()).start(); new MyThread(process.getInputStream()).start(); process.waitFor(); process.destroy(); System.out.println(currentChannelName+" signed apk over"); // 一条渠道的打包完毕。

文件会输出到指定文件夹 }catch(Exception e){ e.printStackTrace(); } } /** * 这是google签名的打包方式。

跟上面一个方法差点儿相同的 zipalign apk */ public static void zipalignApk(int channelid){ try{ System.out.println(currentChannelName+":zipalign apk start"); String apkPath=APK_PATH.replace("{c}", channels[channelid]); File file=new File(apkPath); if(!file.getParentFile().isDirectory()) file.getParentFile().mkdirs(); Process process = null; String jarsigner; jarsigner = "cmd.exe /C "+androidSDK_PATH+"tools/zipalign.exe -v 4 " + apkPath + ".apk " + apkPath + "-z.apk"; //签名apk process = Runtime .getRuntime() .exec(jarsigner); // 对apk进行签名 new MyThread(process.getErrorStream()).start(); new MyThread(process.getInputStream()).start(); process.waitFor(); process.destroy(); System.out.println(currentChannelName+":zipalign apk over"); // 一条渠道的打包完毕。文件会输出到指定文件夹 }catch(Exception e){ e.printStackTrace(); System.exit(0); } } public static String read(String path) { StringBuffer res = new StringBuffer(); String line = null; try { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path),"UTF-8")); while ((line = reader.readLine()) != null) { res.append(line + "\n"); } reader.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return res.toString(); } public static boolean write(String cont, String dist) { try { OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(new File(dist)),"utf-8"); writer.write(cont); writer.flush(); writer.close(); return true; } catch (IOException e) { e.printStackTrace(); return false; } } public static class MyThread extends Thread{ BufferedReader bf; public MyThread(InputStream input) { bf = new BufferedReader(new InputStreamReader(input)); } public void run() { String line; try { line = bf.readLine(); while (line != null) { System.out.println(line); line = bf.readLine(); } } catch (IOException e) { e.printStackTrace(); } } } }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4638162.html,如需转载请自行联系原作者

写你自己 android 多通道打包工具 可以包libs和.so文件相关推荐

  1. android快速打包工具下载,【Android】多渠道打包,其实可以更快

    现状 多渠道打包,相信很同学都知道.在Android Studio中只要经过配置,就能打出对应市场的渠道包.打过包的同学可能都会有这样的感受:散热器疯狂地转.打包速度那叫一个慢.这时候除了无奈,还是无 ...

  2. 几个常见的Android多渠道打包工具介绍

    Android项目开发完,多途径打包是必不可少的环节.其原理在于,通过在Android安卓包中增加不同的标识,区别各个途径下载来源,用于计算App在不同使用市场或途径合作中的各项数据. 工欲善其事,必 ...

  3. android app 马甲包,关于Android多渠道打包和马甲包问题

    多渠道打包 最近项目用到多渠道打包,虽然网上又很多资料, 但是我在实际使用的过程中还是遇到了些问题, 在这里记录下,希望能帮助到你! 首先配置你的渠道信息 : 配置渠道信息 这个时候渠道使用的签名配置 ...

  4. Android自动化打包工具,利用Jenkins实现Android自动化打包

    Jenkins简介 What is Jenkins? Jenkins is a self-contained, open source automation server which can be u ...

  5. android 渠道打包工具,Walle —— Android多渠道打包神器

    图片只为致敬斯坦·李 Walle为了android多渠道打包而生的工具,废话不多说直接上用法 配置build.gradle 在项目的build.gradle文件中添加walle插件依赖 depende ...

  6. android 自动打包工具,AutopackingAndroid

    -------------------------------------------------------------------------------------- 2.8.5 更新包括: 1 ...

  7. 手写小程序摇树优化工具(三)——遍历json文件

    见素包朴,少私寡欲,绝学无忧 github: miniapp-shaking 上一章我们介绍了遍历js文件的方法,接下来我们介绍其他文件的遍历. 1. 遍历JSON文件 对于json文件,我们直接读取 ...

  8. Android Studio打包SDK后,为什么没有bundles文件夹?

    在Android Studio中,将项目打包成jar包,按照网上说的方法打包完成后,在intermediates文件夹下没有bundles,AS版本3.1.2,后来发现,原来是intermediate ...

  9. android 渠道打包工具,Android渠道打包技术小结

    导读 本文对比了渠道4种渠道打包方式: 与iOS的单一渠道(AppStore)不同,Android平台在国内的渠道多入牛毛.以我们的App为例,就有27个普通渠道(应用宝,百度,360这种)和更多的推 ...

最新文章

  1. ubuntu 如何右上角显示键盘
  2. Leetcode 18. 四数之和 (每日一题 20211011)
  3. wxpython bind自定义_wxPython的 - 如何从自定义对话框WX
  4. 【招聘(北京)】北森测评招聘 .NET 架构师、高级工程师
  5. nowcoder 河 我 车 题 错 天 乐 赛 倍增处理
  6. 参数少一半、速度快3倍:最新目标检测核心架构来了
  7. 教学思路ASP.Net之服务器控件: 四、FileUpload
  8. 【MyBatis笔记】16-多对多关系建表
  9. mariadb multi-source replication(mariadb多主复制)
  10. FTP+SSL(加密的ftp)
  11. 上位机与1200组态步骤_新入S7-1200系统值得注意几点(博图平台)
  12. JS 打印 data数据_用D3.js 十分钟实现字符跳动效果
  13. c语言编辑回文数,C语言实例 回文数
  14. fiddler中文乱码解决方案
  15. Matlab2017a/b激活license.lic文件
  16. 上网软件 Chrome/FireFox插件-gooreplacer
  17. 触龙——可解释推荐系统
  18. 微信小程序(四) 节点查询 | wx.createSelectorQuery
  19. 国科大《自然语言处理》复习(宗成庆老师)
  20. bilibili管理课程笔记——中层管理者的四种领导角色

热门文章

  1. 如何把不同尺寸ico格式图标_iConvert Icons——图标创建转换工具
  2. Nisus Writer Pro for Mac拆分视图和注释技巧
  3. Idea配置sbt(window环境)
  4. python之路-02 Python基础
  5. Spark Streaming 原理剖析
  6. width 、 height 与 box-sizing : border-box ,content-box 的关系
  7. java拷贝构造函数
  8. Android开发技巧——PagerAdapter再简单的包
  9. 第二阶段冲刺报告(六)
  10. sccm安装手动下载必备组建