配置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 -h
和adb
- 这里出现了问题
- 原来,在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相比较果然飞快!!!