bootstrapのDumpWindowHierarchy

2847 ワード

DumpWindowHierarchy

package io.appium.android.bootstrap.handler;

import android.os.Environment;
import com.android.uiautomator.core.UiDevice;
import io.appium.android.bootstrap.AndroidCommand;
import io.appium.android.bootstrap.AndroidCommandResult;
import io.appium.android.bootstrap.CommandHandler;
import io.appium.android.bootstrap.utils.NotImportantViews;

import java.io.File;

/**
 * This handler is used to dumpWindowHierarchy.
 * https://android.googlesource.com/
 * platform/frameworks/testing/+/master/uiautomator
 * /library/core-src/com/android/uiautomator/core/UiDevice.java
 */
@SuppressWarnings("ResultOfMethodCallIgnored")
public class DumpWindowHierarchy extends CommandHandler {
  // Note that
  // "new File(new File(Environment.getDataDirectory(), "local/tmp"), fileName)"
  // is directly from the UiDevice.java source code.
  private static final File dumpFolder = new File(Environment.getDataDirectory(), "local/tmp");
  private static final String dumpFileName = "dump.xml";
  private static final File dumpFile = new File(dumpFolder, dumpFileName);

  private static void deleteDumpFile() {
    if (dumpFile.exists()) {
      dumpFile.delete();
    }
  }

  public static boolean dump() {
    dumpFolder.mkdirs();

    deleteDumpFile();

    try {
      // dumpWindowHierarchy often has a NullPointerException
      UiDevice.getInstance().dumpWindowHierarchy(dumpFileName);
    } catch (Exception e) {
      e.printStackTrace();
      // If there's an error then the dumpfile may exist and be empty.
      deleteDumpFile();
    }

    return dumpFile.exists();
  }

  /*
   * @param command The {@link AndroidCommand} used for this handler.
   *
   * @return {@link AndroidCommandResult}
   *
   * @throws JSONException
   *
   * @see io.appium.android.bootstrap.CommandHandler#execute(io.appium.android.
   * bootstrap.AndroidCommand)
   */
  @Override
  public AndroidCommandResult execute(final AndroidCommand command) {
    NotImportantViews.discard(true);
    return getSuccessResult(dump());
  }
}

この方法はいくつかの機械で成功せずに多くの人にこの方法をよく知られていないかもしれませんが、私は長い事件の機能遍歴ツールの開発をして、この方法を専門に研究したことがあります.私が前に書いた文章を見て、それが何をしているのか理解しました.
dumpWindowHierarchy
現在の携帯電話のインタフェースのすべてのコントロール情報を取得し、/data/local/tmpのディレクトリの下にツリー構造を保存するdumpです.xmlファイルでは、上記のクラスの定義にはパス、ファイルに関する文字列がたくさん見られます.そのため、appiumのこのDumpWindowHierarchyはまずapiの設定によってレイアウト圧縮を禁止するかどうかです.apiが18以上の場合、レイアウト圧縮が開始され、有用なコントロール情報を取得するのに役立ちます.次にdump()メソッドを実行すると、dumpメソッドが先にディレクトリを作成します.もちろん、このディレクトリは一般的に存在し、作成する必要はありません.次にdumpを削除します.xmlファイルは、新しいものを作成するために、コントロール情報が取得できないように古いものを削除する必要があります.dump.xmlにはまだ情報が返されています.そして呼び出す
UiDevice.getInstance().dumpWindowHierarchy(dumpFileName);

コントロールツリー情報を内部ファイルに保存します.
(android公式サイトにやっとアクセスできました!)