论文复现

配置jdk

  • 将下载下来的 jdk-8u241-linux-x64.tar.gz 进行解压
sudo tar zxvf ./jdk-8u241-linux-x64.tar.gz
  • 设置环境变量
sudo vim /etc/profile
  • 在其中添加:
#set Java environment
export JAVA_HOME=/home/ubuntu/jdk1.8.0_241
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
  • 生效环境变量配置,命令行输入:
source /etc/profile
  • 使用命令 java -version 检查Java是否已经安装在Ubuntu上

安装Android studio以及配置sdk和adb

  • 下载安装包https://www.androiddevtools.cn/
  • 安装软件:解压压缩包,运行studio.sh脚本,完成剩下的安装。这个要在进入root模式之后进行:
sh /home/ubuntu/android-studio/bin/studio.sh
  • 按照提示,一步一步安装。
  • 之后会自动下载sdk文件,我的在/root/Android/Sdk下;
  • 配置环境变量:
sudo vim /etc/profile
  • 在其中添加:
export ANDROID_HOME=/root/Android/Sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools
export PATH=${PATH}:${ANDROID_HOME}/build-tools 
  • 生效环境变量配置,命令行输入:
source /etc/profile
  • 检查是否配置成功: android -hadb

  • 这里出现了问题
  • 原来,在Android Studio官网的sdkmanager页面中,明确提到了在Android SDK Tools25.2.3及以后提供了sdkmanager command-line tools 以及舍弃android命令.
  • 参考的解决方法
  • 我这里选择下载了android-sdk_r24.4.1-linux.tar,然后解压,复制其中的tools目录,覆盖原来的tools目录。
  • 然鹅还是不行。。。。算了先回复成原来的吧。。

安装KVM

What's KVM?

KVM实际是linux内核提供的虚拟化架构,可将内核直接充当hypervisor来使用。KVM需要处理器硬件本身支持虚拟化扩展,如intel VT 和AMD AMD-V技术。KVM自2.6.20版本后已合入主干并发行,除此之外,还以模块形式被移植到FreeBSD和illumos中。除了支持x86的处理器,同时也支持S/390,PowerPC,IA-61以及ARM等平台。

工作原理

KVM包含一个内核模块kvm.ko用来实现核心虚拟化功能,以及一个和处理器强相关的模块如kvm-intel.ko或kvm-amd.ko。KVM本身不实现任何模拟,仅仅是暴露了一个/dev/kvm接口,这个接口可被宿主机用来主要负责vCPU的创建,虚拟内存的地址空间分配,vCPU寄存器的读写以及vCPU的运行。有了KVM以后,guest os的CPU指令不用再经过QEMU来转译便可直接运行,大大提高了运行速度。但KVM的kvm.ko本身只提供了CPU和内存的虚拟化,所以它必须结合QEMU才能构成一个完整的虚拟化技术。

What's QEMU-KVM?

QEMU-KVM,是QEMU的一个特定于KVM加速模块的分支,里面包含了很多关于KVM的特定代码,与KVM模块一起配合使用。
目前QEMU-KVM已经与QEMU合二为一,所有特定于KVM的代码也都合入了QEMU,当需要与KVM模块配合使用的时候,只需要在QEMU命令行加上 --enable-kvm就可以。

  • 执行以下命令以验证服务器的硬件是否支持虚拟化。如果输出结果大于 0,就意味着支持虚拟化。
egrep -c '(vmx|svm)' /proc/cpuinfo
  • 在linux终端安装东西的时候都要 sudo apt-get update 一下,然后安装KVM依赖:
sudo apt-get install qemu-kvm
sudo apt-get install qemu
sudo apt-get install virt-manager
sudo apt-get install virt-viewer 
sudo apt-get install libvirt-bin 
sudo apt-get install bridge-utils
  • 验证下,终端键入 kvm-ok,出现下面的界面,就说明已经装好了
  • 终端键入 sudo virt-manager ,可以进入图形界面。
  • 配置KVM:添加用户到kvm,libvirtd组,打开Terminal终端,输入:(例如你的用户名为xxx)
sudo adduser xxx kvm
sudo adduser xxx libvirtd

  • 可以使用以下命令测试安装是否成功:
virsh list --all

配置aapt

aapt 为 Android Asset Packaging Tool , 在SDK的build-tools/目录下. 该工具可以查看, 创建, 更新ZIP格式的文档附件(zip, jar, apk). 也可将资源文件编译成二进制文件。

  • 配置环境变量:
sudo vim /etc/profile
  • 在其中添加:
# Add Android build-tools AAPT variable
export AAPT_HOME=/root/Android/Sdk/build-tools/29.0.3
export AAPT_HOME
export PATH=$PATH:$AAPT_HOME
  • 生效环境变量配置,命令行输入:
source /etc/profile
  • 使用命令 aapt 检查:

Add android-sdk/tools/lib to LD_LIBRARY_PATH.

  • 在终端下输入 sudo vim /etc/profile ,添加
export LD_LIBRARY_PATH=/root/Android/Sdk/tools/lib:$LD_LIBRARY_PATH
  • 生效环境变量配置,命令行输入:
source /etc/profile
  • 然后再输入 echo $LD_LIBRARY_PATH 即会显示:

配置emulator

  • 在配置abd环境的时候其实就已经配置好这个了,它在sdk目录下的tools文件目录下。
  • 但是我发现这个命令只能在root权限下运行。。

遇到的问题

问题1

  • 店家帮我装好了anaconda和pycharm,但是我打开pycharm的时候发现没有菜单栏,连settings都找不到。
  • 解决方法:
    • 按Ctrl + Shift + A打开“Action”对话框,键入“Experimental features”,然后按Enter键。
    • 把linux.native.menu选项旁边的复选框的钩子去掉,变成空白选项,应用更改并关闭对话框。
    • 重启PyCharm

问题2

  • 使用 pip 安装需要的模块的时候,出现下面这样的问题:
you are using pip version 10.0.1,however version 20.0.2 is available
You should consider upgrading via the ‘pip install --upgrade pip’ command.
  • 使用提示的更新命令:
pip install --upgrade pip --user
  • 更新成功并可以安装所需模块:
  • 在安装urllib3==1.9的时候出现了如下错误,但是最后显示还是安装成功了,不知道会不会对后续的实验有影响,先把图放在这里吧:
  • 错误消息:
ERROR: requests 2.19.1 has requirement urllib3<1.24,>=1.21.1, but you'll have urllib3 1.9 which is incompatible.
  • 在pycharm中添加conda的interpreter时候,出现如下问题:
  • 错误信息:
/home/ubuntu/anaconda3/lib/python3.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.9) or chardet (3.0.4) doesn't match a supported version!
  RequestsDependencyWarning)
pip install --upgrade urllib3
pip install --upgrade requests
  • 后来又遇到下面问题,重新安装pycharm即可。

  • 我发现在命令行使用命令 pip list 显示所安装好的包之后,在pycharm的解释器环境中找不到对应安装好的包,使用命令 which python 查看ubuntu中安装的python路径,然后就可以找到在命令行安装好的包啦。

问题3

  • 额。。,居然死机了,鼠标键盘都不动了。可能是我打开的窗口太多了。。
  • Ctrl + Alt + PrtSc (SysRq) + reisub ,再说明白一点,就是按住Ctrl,Alt和PtrSc(SysRq),按住他们的同时你需要按r,e,i,s,u,b 这样就能安全地重启linux

问题4

  • 在配置完LD_LIBRARY_PATH之后,应该是这个环境变量配置错误,导致把PATH覆盖了(此时的我快崩溃了)
  • 恢复办法如下:
/usr/bin/sudo vim /etc/profile          (由于找不到sudo,所以必须写全路径,其他命令如果提示找不到,也需要写全路径)
  • 在末尾加上:
export PATH="$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
  • 执行以下命令生效
source /etc/profile

2020.5.1

  • 今天打开测试运行环境,也也也太神奇了吧,上次这个 LD_LIBRARY_PATH 添加之后还不成功,今天打开居然检测成功啦!太开心了吧!就剩一个环境了!加油呀!

  • 嗯嗯,今天什么都没解决。。。


2020.5.2

  • 我卡在运行make_device.py这里了,怎么都运行不了,昨天那个的emulator64-x86也还是no,死机了。

  • make_device.py中的这句话:

p = pexpect.spawn('android create avd -n {} -t android-17 --snapshot'
            ' --sdcard 200M --abi x86'.format(sys.argv[1]), timeout=2)
  • 其中 spawn() 方法用来执行一个程序,它返回这个程序的操作句柄,以后可以通过操作这个句柄来对这个程序进行操作。
  • 命令 android create avd -n {} -t android-17 --snapshot --sdcard 200M --abi x86
参数 含义
-n AVD的名称(该项是必须的)
-t 运行的android的平台版本编号id
--snapshot 在AVD中设置一个快照文件
--sdcard 新的sd卡的大小
--abi 指定cpu架构 android list targe查看支持的cpu
  • timeout=2 就指定超时时间

  • p 就是 spawn() 的程序操作句柄了,之后对这个程序的所有操作都是基于这个句柄的,它可以说是最重要的部分。

  • 我好像知道问题的原因了,因为这个Android sdk是在安装Android studio的时候自动安装的,不支持 android 命令。┭┮﹏┭┮ 好吧,我重新装一下。

  • 先记录一下,这是目前为止配置的环境变量:

  • 下载https://dl.google.com/android/repository/tools_r25.2.3-linux.zip,然后直接把文件拖进sdk文件,直接覆盖,解决啦哈哈哈哈!


2020.5.3

  • android 命令是可以执行。
  • 但是运行make_device.py还是老问题,总是说avdname的事情(还是对python不够熟悉)
  • 还是make_device.py中的这句代码,发现运行的时候需要传参:
p = pexpect.spawn('android create avd -n {} -t android-17 --snapshot'
            ' --sdcard 200M --abi x86'.format(sys.argv[1]), timeout=2)
  • argv是一个list,它是sys模块下的一个全局变量(也称sys模块的属性),它的第一个元素是模块名、后面的元素是依次传入的参数!argv[1]代表第一个参数,这里是创建的avd的名字。

  • 传参之后出现了如下错误:

  • 查阅资料说是可能是权限的问题,然后 sudo su 进入root,再次执行 python3 make_device.py (这里我修改了一下代码不用传参) :

  • 分析发现异常的原因是expect()语句超时,期望得到的结果没有得到,直到超时抛出异常。

  • 查看已有的或新创建的AVD: android list avd

  • 运行指定的AVD: emulator -avd AVD名


2020.5.4

  • 出现pexpect.EOF异常错误、pexpect.TIMEOUT异常错误
  • 查阅资料说这两个错误可以使用try语句来处理报错,于是我在def main()中进行了如下修改:
try:
    ……
except pexpect.EOF:
    pass
except pexpect.TIMEOUT:
    pass
  • 是没有继续报错,查看创建的avd的时候并没创建成功。
  • try这个关键字来捕获异常:
try:尝试执行的代码
except:出现错误的处理
  • 所以上面的修改并没有实质性地解决问题。。。

  • 发现其中有个错误是运行的android的平台版本编号id无效。

  • 使用 android list targets 查询android版本编号,将代码中原来的17更改为29

  • 更改后再次运行,发现如下问题:没有ABI,然后在命令行使用命令 android sdk 打开 Android SDK Manager ,然后选择安装ABI,注意:下载时必须下载带有system image的项目,不然创建AVD时就会报如下的错误。参考

  • 下载完成之后再次运行,又出现了问题。。。

  • 查看了这篇文章,说是要添加前缀,就是下图红色框框中的:

  • 添加之后可以运行啦!

  • 运行的过程中会出现类似以下这样的问题,我就照着在相应的位置(运行卡住的模块后面)添加对应的模块,一共添加了如下九个模块(猜测可能是因为修改了android的平台版本编号导致)。








  • 使用命令 android list avd 查看新创建的AVD,发现错误 The following Android Virtual Devices could not be loaded


2020.5.5

  • 查了好多资料,说这个问题的原因是Android Studio安装和Sdk的安装位置不在同一个盘符下面,还有就是ANDROID_AVD_HOME这个环境变量要是SDK目录,然后我修改了环境变量,整体的环境变量如下:

  • 之后再次运行make_device.py,没抱希望的情况下,居然成功啦!老泪纵横o(╥﹏╥)o

  • 不过马上又有了新的问题,执行命令emulator -avd y 运行刚刚创建的avd:

  • 参考这篇博客,将 /Android/ubuntu/Android/Sdksystem-imagesandroid-27google_apisx86 目录下的“kernel-ranchu-64” 文件改名为 “kernel-qemu”,然后重新 start 虚拟机

  • 居然告诉我设备上没有空间。。。

  • 累到没有骂人的力气。。

  • 来看一下上面是warning:

emulator: WARNING: System image is writable
  • 说明启动可写方式成功,但此时terminal处于等待状态,无法再进行操作,如果关闭当前terminal,打开的模拟器也会随之关闭。所以需要再重新打开一个terminal进行后续操作。
emulator: WARNING: Classic qemu does not support SMP. The hw.cpu.ncore option from your config file is ignored.
  • 更新sdk tools,不过我更新之后还是不行

2020.5.30

  • 之前实验设备空间不够,又斥巨资买了一个大一点的环境,按照上面的步骤重新设置了实验环境,下面是遇到的一些问题。
  • 没有 intel atom system image 这一项,刷新后也仍然没有:大概是连接不到官网更新的问题。

  • SDK需要使用国内镜像地址更新,但是我把这里的镜像都试过了,都不行,后来开了一个代理,地址 127.0.0.1 ,端口 10809 。然后提权了一下居然可以了!!!感恩!!

2020.5.31

  • 在创建虚拟机的时候出现了下面的问题,这也不是一个报错的语句啊,回想到在之前环境中做实验说不支持SMP,查阅资料说应该是创建虚拟机和选择的cpu构架与有冲突

  • 查看之前的记录发现是缺少一些模块,这里把之前环境调试好的代码粘贴了过来。

  • 在执行 make_device.py 的时候又出现了相同的问题:

Failed to parse properties from /home/ubuntu/Android/Sdk/.android/avd/y.avd/config.ini
  • 根据官网的描述,虚拟机数据路径默认规则是:
~/.android/avd/name.avd/
  • 其中 name 就是虚拟机的名称, ~ 是主机上的android主目录,可以通过 ANDROID_SDK_HOME 来动态指定。

2020.6.1

  • 上面这个问题整整困扰了我一天半的时间。。。

  • 创建过程中出现的问题如下,发现有很多 EOF 和 TIMEOUT 的字样,查阅资料,分析异常:

  • TIMEOUT 异常:如果子程序没有在指定的时间内生成任何 output,那么 expect()read() 都会产生 TIMEOUT 异常。超时默认是 30s,可以在 expect()spawn 构造函数初始化时指定为其它时间。若想让 expect()read() 忽略超时限制,即无限期阻塞住直到有 output 产生,设置 timeout 参数为 None。

  • 原来的代码如下:

p = pexpect.spawn('android create avd -n {} -t android-17 --snapshot'
            ' --sdcard 200M --abi x86'.format(sys.argv[1]), timeout=2)
  • 这个等待 2s 是不是有点短,试着改成 None 之后,居然成功了(真的是等了好久才创建出来),热泪盈眶o(╥﹏╥)o

  • 执行命令 emulator -avd y 运行刚刚创建的avd:
  • 终于创建成功!!!妈耶不容易。。。
  • 虽然可以显示出来,但在运行的过程中有很多warning如下:
  • 不知道会不会对后面实验有影响,先记录一下吧,希望后面实验不要太费事了,要秃了。。
WARNING: Force to use classic engine to support snapshot.
emulator: WARNING: System image is writable
emulator: WARNING: Classic qemu does not support SMP. The hw.cpu.ncore option from your config file is ignored.
emulator: WARNING: Host CPU is missing the following feature(s) required for x86 emulation: SSSE3
Hardware-accelerated emulation may not work properly!
[139693859899136]:WARNING:./android/base/files/IniFile.cpp:158:Failed to process .ini file /home/ubuntu/Android/Sdk/.android/avd/y.avd/snapshots.img.default-boot.ini for reading.
...
[139693859899136]:WARNING:./android/base/files/IniFile.cpp:158:Failed to process .ini file /home/ubuntu/Android/Sdk/.android/emu-update-last-check.ini for reading.
...

2020.6.3

  • 与KVM模块配合,通过命令启动虚拟机(这里注意提权,不提权打不开):
emulator64-x86 -avd y -no-snapshot-load -qemu -m 512 -enable-kvm
  • Snapshot的意思是“快照”:能够保存AVD关闭时的状态,然后再下一次启动的时候显示上一次关闭时的状态,类似缓存机制。
命令行选项 说明
-no-snapshot-load 阻止模拟器从快照存储加载 AVD 状态。执行完整启动。执行冷启动,并在退出时保存模拟器状态。
-no-snapshot-save 如果可能,执行快速启动,但在退出时不保存模拟器状态。也就是阻止模拟器在退出时将 AVD 状态保存到快照存储,这意味着所有更改都将丢失。
-m 512 是给客户机分配512MB内存
-enable-kvm 利用 KVM 来访问硬件提供的虚拟化服务



  • 打开的速度和上次没有使用kvm相比较果然飞快!!!

运行程序

检查试验环境

参考文献

原文地址:https://www.cnblogs.com/yangdd/p/12996488.html