Android APP测试可修改接口访问链接,无需重装apk
来源:互联网 发布:心理咨询知乎 编辑:程序博客网 时间:2024/05/18 23:14
APP项目开发的时候,我都是用一个全局变量来存放接口访问链接的前缀的。一般起初开发的过程都是在局域网,这个是有就是http://192.168.0.xx这种的。如果发布版本的时候就是http://www.xx.xx,然后某些时候又要改成其他网址,这样一来老是需要重新运行app生成新的apk,那怎么做到无需重装apk就可以修改网址前缀呢?
在你手机上新建一个xml配置文件,效果如下
我们可以通过编辑工具打开xml文件,对其进行修改path的路径然后进行保存、替换。然后我们写个方法每次调用接口的时候,就获取path+/.../...进行拼接。
1、PathXmlConfig.class :是xml文件的创建,写入,读取数据的配置类
/** * @author SoBan * @create 2017/6/2 14:53. */public class PathXmlConfig { private static String filePath = Environment.getExternalStorageDirectory() + "/gpinfo/"; private static String xmlName = "facerecognition.xml"; private static String PATH = "path"; private static String IMGPATH = "imgpath"; public static class PathBean { private String path; private String imgpath; public PathBean() { } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getImgpath() { return imgpath; } public void setImgpath(String imgpath) { this.imgpath = imgpath; } } /** * 生成文件夹 gpinfo */ public static void makeRootDirectory(String filePath) { File file = null; try { file = new File(filePath); if (!file.exists()) { file.mkdir(); } } catch (Exception e) { Log.i("error:", e + ""); } } /** * 生成xml */ public static File makeFilePath(String filePath, String fileName) { File file = null; makeRootDirectory(filePath); try { file = new File(filePath + fileName); } catch (Exception e) { e.printStackTrace(); } return file; } /** * xml是否存在 * @return */ public static boolean isExistsXml() { File file = makeFilePath(filePath, xmlName); if (file.exists()) { return true; } return false; } /** * 向xml写入数据 * * @param bean */ public static void createXML(PathBean bean) { try { // 获取外部存储路径,并创建文件 File file = makeFilePath(filePath, xmlName); if (file.exists()) { return; } // 创建一个文件输出流 FileOutputStream os = new FileOutputStream(file); String enter = System.getProperty("line.separator");//换行 XmlSerializer serializer = Xml.newSerializer(); // 设置输出的编码格式 serializer.setOutput(os, "UTF-8"); // 设置文档的编码格式,这个会在xml中显示出来 serializer.startDocument("UTF-8", true); // 添加 // 注释// serializer.comment("comment, xml file test"); changeLine(serializer, enter); serializer.startTag(null, PATH); serializer.text(bean.getPath()); serializer.endTag(null, PATH); changeLine(serializer, enter); serializer.startTag(null, IMGPATH); serializer.text(bean.getImgpath()); serializer.endTag(null, IMGPATH); serializer.endDocument(); // 文档结束 serializer.flush(); os.close(); // 关闭输出流 } catch (Exception e) { e.printStackTrace(); } } /** * tag标签换行 * * @param serializer * @param enter */ public static void changeLine(XmlSerializer serializer, String enter) { try { serializer.text(enter); } catch (IOException e) { System.out.println(e.getMessage()); } } /** * Pull方式,解析 XML */ public static PathBean pullParseXML() { File file = new File(filePath, xmlName); PathBean bean = null;// StringWriter xmlWriter = new StringWriter(); try {// // 方式一:使用Android提供的实用工具类android.util.Xml// XmlPullParser xpp = Xml.newPullParser(); // 方式二:使用工厂类XmlPullParserFactory的方式 InputStream is = new FileInputStream(file); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, "utf-8"); StringBuffer xmlHeader = null; // 保存xml头部 String ele = null; // Element flag int eventType = xpp.getEventType(); while (XmlPullParser.END_DOCUMENT != eventType) { switch (eventType) { case XmlPullParser.START_DOCUMENT: xmlHeader = new StringBuffer(); // 初始化xmlHeader bean = new PathBean(); break; case XmlPullParser.START_TAG: if (PATH.equals(xpp.getName())) {// eventType = xpp.next();// xmlHeader.append(xpp.getText()); bean.setPath(xpp.nextText()); } else if (IMGPATH.equals(xpp.getName())) {// eventType = xpp.next();// xmlHeader.append(xpp.getText()); bean.setImgpath(xpp.nextText()); } break; case XmlPullParser.TEXT: if (null != ele) { /*if("id".equals(ele)) { person.setId(Integer.parseInt(xpp.getText())); } else if("name".equals(ele)) { person.setName(xpp.getText()); } else if("blog".equals(ele)) { person.setBlog(xpp.getText()); }*/ } break; case XmlPullParser.END_TAG: /*if("person".equals(xpp.getName())){ personsList.add(person); person = null; }*/ ele = null; break; } eventType = xpp.next(); // 下一个事件类型 }// xmlWriter.append(xmlHeader); } catch (XmlPullParserException e) { // XmlPullParserFactory.newInstance e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); }// return xmlWriter.toString(); return bean; }}
2、CommonConfig.class:调用接口是需要的公用配置类
public class CommonConfig {//是否打开本地配置链接文件(要给别人测试并支持修改path的时候是true)public static final boolean isOpenConfig = false;public static String PATH = "http://192.168.0.100/gpa/";public static String IMGPATH = "http://192.168.0.100/";/*** 这里写的url指的是,访问接口链接的后缀*/public static String getPath(boolean isIMG, String url) {if (!PathXmlConfig.isExistsXml()) { PathXmlConfig.PathBean bean = new PathXmlConfig.PathBean(); bean.setPath(API.PATH); bean.setImgpath(API.IMGPATH); PathXmlConfig.createXML(bean); } PathXmlConfig.PathBean pathBean = PathXmlConfig.pullParseXML(); if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) { if (isIMG) { if (!TextUtils.isEmpty(pathBean.getImgpath())) { url = pathBean.getImgpath() + formatImageUrl(url); } else { url = IMGPATH + url; } } else { if (!TextUtils.isEmpty(pathBean.getPath())) { url = pathBean.getPath() + url; } else { url = PATH + url; } } } return url;}public static String getCommonURL(String url) { if (isOpenConfig) { return getPath(false, url); } if (!url.startsWith("http://") && !url.startsWith("https://") && !TextUtils.isEmpty(url)) { url = PATH + url; } return url;}}
3、使用方式:
例如现在要调用登录的接口,链接假设:http://192.168.0.100/gpa/login
这个时候我们调用方法就是getCommonURL("login");
4、适用情况:
用这种情况最好是在测试的时候,不要发布版本的时候用,所以上面多了一个CommonConfig->isOpenConfig的配置,true是指打开xml配置,默认是false。
如果测试有这么多个地址:
http://192.168.0.100/gpa/login
http://127.22.0.100/gpa/login
http://www.baidu.com/gpa/login
不想重新安装apk,只是想改变网址前缀,可以通过这种方式配置
阅读全文
0 0
- Android APP测试可修改接口访问链接,无需重装apk
- Android Patcher应用增量更新(App补丁式更新,无需下载整个apk)
- 自动重装,修改代码后无需重启服务器
- Android 无需root实现APK静默安装
- Android app测试没有问题,导出apk却问题百出
- android限制app的敏感ContentProvider的可访问性
- android 通过反射访问内部类(也可访问其他apk中的类)
- 破解某Wifi APP,无需Root也可查看密码
- 可抓接口的app
- APP接口测试
- App接口测试总结
- dynamic-load-apk动态加载框架 无需安装apk可由宿主调起
- C#修改配置文件无需重启,可立刻生效
- 使Android的system分区可写及安装apk到system/app
- android 修改APK
- 移动手机APP测试链接
- Android APK测试总结
- android apk测试
- Ubuntu修改终端下的语言
- Azure虚拟机监控警报配置
- 前端模块化发展简史
- WEBSITE知识点积累
- [PhantomJS] Https Redirect Problem with PhantomJS + Selenium
- Android APP测试可修改接口访问链接,无需重装apk
- Firefox扩展推荐
- 从一个apk调用另一个apk中的调起Dialog的功能时候遇到的问题,小笔记!
- cmd命令介绍
- 回调的本质
- 简单理解与实验生成对抗网络GAN
- 学习笔记——JAVA反射<2>反射机制的效率问题和操作泛型
- Bitbucket创建新repository
- 我收藏的JS文章