Linux安装android SDK及Appium配置

本文将介绍如何在linux上配置android SDK, 运行模拟器和Appium

警告

不要使用 apt 安装android-sdk

不要在需要root权限的文件夹下进行操作(例如/opt)

安卓10不自带计算器应用

supersu不支持7.1.1(不含)以上

前言

下面所有介绍均在一个SDK文件夹下操作(我自己的路径是/home/zx/SDK)

参考资料

安装KVM

这是x86安卓必须要装的

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils

配置kvm

配置用户权限

安装android SDK

下载

官方网站

不用下载studio, 直接下载Command line tools only即可

在SDK文件夹下解压, 得到一个tools文件夹

配置ANDROID_SDK_ROOT环境变量

export ANDROID_SDK_ROOT=/home/zx/SDK

sdkmanager

官方文档

这是一个包管理器, 位于tools/bin下, 可以用来下载images或者各种各样的包, 下载后会存放在SDK文件夹下, 比如你下载了platform-tools, 那么在SDK目录下就会多一个platform-tools文件夹

根据自己需要自行下载, 有些是必要的, 后面会提到

例子, 下载7.1.1版本的镜像

sdkmanager "system-images;android-25;google_apis;x86_64"

avdmanager

官方文档

使用它, 通过命令行创建和管理 Android 虚拟设备

例子, 创建一个7.1.1版本的名字叫root的avd(安卓虚拟设备)

avdmanager create avd -n root -k "system-images;android-25;google_apis;x86_64"

emulator

官方文档

启动模拟器

使用 -skin 720x1280 可以指定分辨率

例子, 以分辨率720P启动名称为root的虚拟设备

emulator -avd root -skin 720x1280

常见问题

  1. PANIC: Broken AVD system path. Check your ANDROID_SDK_ROOT value

stackoverflow解决方案

如果在 sdkmanager 中没有下载一个系统所有所需的安装包, 就会报错, 建立相应的空文件夹即可(emulator, platforms, platform-tools, system-images)

  1. Error: Package path is not valid. Valid system image paths are:ository… null

./sdkmanager "system-images;android-25;google_apis;x86"

./sdkmanager --licenses

重新接受一遍所有证书

杂七杂八

How to get root access on Android emulator?

android emulator 获取 Root权限

api与版本对应关系

安装Appium

安装java8

官方要求java8, 别装11, 要不然会报错”Original error: Could not sign with default certificate”

sudo apt install openjdk-8-jdk

配置java环境变量

export JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")

export PATH=$JAVA_HOME/bin:$PATH

下载Appium

为了减少bug和方便, 我使用AppImage来运行

官方github下载地址

问题

即使你使用 sdkmanager 安装了 build-tools 和 platform-tools, Appium还是可能报错’cant find aapt’, 我用了一个特殊的方法解决, 即把 build-tools 的文件全拷贝到 platform-tools 目录下, 就可以解决此问题

其他问题

uiautomatorviewer

Error obtaining UI hierarchy Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn’t exist

sudo adb kill-server

sudo adb start-server

简单例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from appium import webdriver
import time

desired_caps = dict()
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9.0'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

# 1. id locate
driver.find_element_by_id('com.android.calculator2:id/digit_1').click() # resource-id

# name locate (deserted)(don't use this)
# driver.find_element_by_name('2').click()

# 2. class name locate
temp = driver.find_elements_by_class_name('android.widget.Button') # class
# temp is a list

# 3. XPath locate
temp = driver.find_elements_by_xpath('//android.widget.Button') # class
# temp is a list

driver.find_element_by_xpath('//android.widget.Button[contains(@text,"3")]').click()
driver.find_element_by_xpath('//android.widget.Button[contains(@content-desc,"×")]').click()

# 4. Accessibility ID locate

driver.find_element_by_accessibility_id("left parenthesis").click() # content-desc

# 5. android uiautomator locate

driver.find_element_by_android_uiautomator("new UiSelector().text(\"9\")").click() # text
driver.find_element_by_android_uiautomator("new UiSelector().description(\"minus\")").click() # content-desc

# pause
time.sleep(10)

driver.quit()