Android Emulator快照标志不起作用

问题描述

Android Emulator快照标志未按预期运行。我使用

创建了一个名为Mydevice的新avd
let myStylesheet = document.styleSheets[0];
const elementA = document.getElementsByClassName('element-a')[0];
let elementAWidth = window.getComputedStyle(elementA).getPropertyValue('width');

const calculateHalfWidth = (elementAWidth) => {

  myStylesheet.insertRule('.halfWidth { width: ' + (parseInt(elementAWidth) / 2) + 'px; }',myStylesheet.cssRules.length);
}

calculateHalfWidth(elementAWidth);

// ================================================================================
// THE SCRIPT BELOW USES A ResizeObserver TO WATCH THE RESIZABLE .element-a DIV
// ================================================================================

const elementAObserver = new ResizeObserver(entries => {
  for (let entry of entries) {
    if (entry.contentRect.width !== elementAWidth) {
      calculateHalfWidth(entry.contentRect.width);
    }
  }
});

elementAObserver.observe(elementA);

现在我使用

运行此avd
body {
  font-family: sans-serif;
}

div.element {
  float: left;
  width: 200px;
  height: 100px;
  margin: 12px 3px;
  text-align: center;
  border: 1px solid rgb(0,0);
}

div.element h2 {
  font-size: 18px;
}

div.element-a {
  resize: horizontal;
  overflow: auto;
}

div.element-b {
  width: 300px;
}


div.halfWidth {
  height: 40px;
  margin: 0 auto;
  border: 1px dashed rgb(255,0);
}

div.halfWidth h2 {
  font-size: 14px;
}

仿真器成功启动后,我使用拍摄快照

<div class="element element-a">
<h2>Element A</h2>
  
  <div class="halfWidth">
    <h2>halfWidth</h2>
  </div>
  
</div>

<div class="element element-b">
  <h2>Element B</h2>
  
  <div class="halfWidth">
    <h2>halfWidth</h2>
  </div>
  
</div>

成功创建了快照。

现在我停止使用运行的模拟器

tools/bin/avdmanager create avd --force --name Mydevice --abi google_apis/x86 --package 'system-images;android-29;google_apis;x86' --device "Nexus 6P" &

现在,我再次使用-read-only标志运行模拟器,并使用已保存的快照运行

sudo emulator/emulator -avd Mydevice  -no-window -port 5554

但是-snapshot似乎被忽略了,因为仿真器仍然需要与启动相同的时间。

我还尝试删除了只读标志,但这没有帮助。

解决方法

-snapshot的参数是快照标记名称,而不是路径。

首先,像这样列出快照:

emulator/emulator -avd mydevice -snapshot-list

将会产生这样的输出(到目前为止,我还没有弄清楚如何在不实际启动仿真器的情况下列出快照,但现在只需运行此命令后关闭仿真器即可):

ID        TAG                 VM SIZE                DATE       VM CLOCK
--        snap_2020-12-03_13-31-29    90M 2020-12-03 13:31:29   01:11:57.073
--        default_boot            68M 2020-12-03 14:15:33   00:02:08.928

然后,使用“ TAG”列中的值之一启动仿真器,例如:

emulator/emulator -avd mydevice -snapshot snap_2020-12-03_13-31-29

对于Android Studio,AVD Manager中设备的“高级设置”还具有用于选择快照以启动设备的下拉菜单。

作为旁注,我发现从快照大幅度地启动仿真器映像可以改善其性能,至少在我的Linux机器上如此。使用快照标志时,仿真器的磁盘写入是正常的;如果没有快照标志,由于某种原因,仿真器本质上会不断地向磁盘写入数据,从而使所有内容缓慢进行爬网。老实说,我不知道为什么。