摘要

其实这个应该是要放到最先的部分去将的,先说下updateStrings到底是做什么吧,它实际上就是加载我们apk文件中的string.xml将其中的内容转换成JsonObject的格式,进行保存,后续查找控件元素的时候会用到它。

正文

appium Server

这次我们先不看源代码,我们先看看我们通过appium安装apk的时候,它都做了什么,这里我们直接截取appium Server的log吧。
这里写图片描述
做的操作真的很多

  1. 获取系统的语言
  2. 获取string.xml文件将其转换成strings.json,将其推送的/data/local/tmp的文件目录下
  3. aapt解析 AndroidManifest.xml文件
  4. 重签名apk,重签名后的apk命名为 MD5+apk
  5. 判断对应的应用是否安装,未安装的话则先清空/data/local/tmp下的文件,将重签名的apk推送过去
  6. 先进行卸载对应的应用,再进行安装
  7. 最后推送boottrap.jar包,imeapk,setting.apk,unlocak.apk

UpdateStrings

public static boolean loadStringsJson() {
    Logger.debug("Loading json...");
    try {
      String filePath = "/data/local/tmp/strings.json";
      final File jsonFile = new File(filePath);
      // json will not exist for apks that are only on device
      // because the node server can't extract the json from the apk.
      if (!jsonFile.exists()) {
        return false;
      }
      final DataInputStream dataInput = new DataInputStream(
          new FileInputStream(jsonFile));
      final byte[] jsonBytes = new byte[(int) jsonFile.length()];
      dataInput.readFully(jsonBytes);
      // this closes FileInputStream
      dataInput.close();
      final String jsonString = new String(jsonBytes, "UTF-8");
      Find.apkStrings = new JSONObject(jsonString);
      Logger.debug("json loading complete.");
    } catch (final Exception e) {
      Logger.error("Error loading json: " + e.getMessage());
      return false;
    }
    return true;
  }

以上的代码首先先判断string.json这个文件是否存在,因为如果你的是通过制定对应的package以及activity来启动应用的话,string.json是无法获得的,这里从上面的log应该就能够很多的判断出来,只有是安装的apk才能够获取到string.json文件。
若string.json存在的话,就读取其中的文件内容,并将其转换成JSONobject对象赋值给Find.apkStrings。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐