一 部署准备

项目地址

部署 Maxim

快捷打开 cmd, 视窗键 +r 打开运行窗口后,输入 cmd 回车

D: 回车进入 D:盘 准备直接 git clone 到 D:盘根目录下

D:\>git clone https://github.com/zhangzhao4444/Maxim.git

Cloning into 'Maxim'...

remote: Counting objects: 70, done.

remote: Compressing objects: 100% (54/54), done.

remote: Total 70 (delta 25), reused 60 (delta 15), pack-reused 0

Unpacking objects: 100% (70/70), done.

部署环境介绍

操作系统

快捷查看 win 系统版本, 视窗键 +r 打开运行窗口后, 输入 winver 回车

Android Sdk

下载地址 http://tools.android-studio.org/index.php/sdk 处下载 android-sdk_r24.4.1-windows.zip

将 android-sdk-windows 解压到你需要的目录下,笔者是 D:\Android\android-sdk-windows

配置 android-sdk 环境变量:

ANDROID_HOME 变量值为 android-sdk 的解压目录,笔者为 D:\Android\android-sdk-windows

PATH PATH 变量值的最后追加 ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools;

接下来你便可以用 D:\Android\android-sdk-windows 下的 SDK Manager.exe 下载配置 SDK 或 AVD Manager.exe 配置 AVD 模拟器了。

如果你需要测试 android 应用的话,请先安装配置好某一版本的 SDK 及其相关工具。

如下图,SDK manager 必要配置:

Tools->Options 设置

其它要下载的:

此处为了与 Macaca 环境兼容,目前稳定没敢乱升级,大家也可用此.

此处的按需选择与 AVD 模拟器配套使用的

该步骤,主要是为了部署 adb 工具而已,当然也有独立部署 adb 的方案.这个你按需选择吧,不过你既然要搞 android 相关了,android sdk 工具的部署最终还是逃不过的.

启动一模拟器后,用 adb 查看连接

D:\>adb devices -l

List of devices attached

192.168.60.101:5555 device product:vbox86p model:Samsung_Galaxy_S7___7_1_0___API_25___1440x2560 device:vbox86p

真机小米 Mix2

需要开启真机开发者选项->USB 调试, 模式和其他相关,主要是调试这一栏要打开的有

用 adb 查看连接

D:\>adb devices -l

List of devices attached

12345678 device product:chiron model:MIX_2 device:chiron

二查看使用帮助

Maxim 目录下 README.md

# Maxim

> A Kotlin implementation of Monkey TEST(Non-Stub) forAndroid that runs on Simulator/Android devices.

https://testerhome.com/topics/11719

## 1. Requirements

- Android 5,6,7,8

- Android5 not support dfs

## 2. Setup

- adb push framework.jar /sdcard

- adb push monkey.jar /sdcard

[- adb push ape.strings /sdcard]

[- adb push awl.strings /sdcard]

## 3. Usage

Maxim can be either started with adb commandline.

- adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar execapp_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatordfs 5000

### 3.1 Args

[dfs mode] --uiautomatordfs monkey use DFS algorithm . About 5 action per second.

[mix mode] --uiautomatormix monkey use AccessibilityService resolve tree node and random choose. About 10-20 action per second.

--pct-uiautomatormix uiautomator action ratio inmix mode

--running-minutes n monkey total run time

--act-whitelist-file /sdcard/awl.strings

--act-blacklist-file

other args is same to Android Monkey

Maxim 目录下 使用帮助.docx

【环境预备】

支持 android 5,6,7,8

注 android 5不支持 dfs mode

将 framework.jar , monkey.jar push 到手机上某个目录中,比如/sdcard

【执行测试】

cmd 命令 :

adb shell CLASSPATH=/data/local/tmp/monkey.jar:/data/local/tmp/framework.jar execapp_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatordfs 5000

蓝: monkey入口类

红: 被测app

绿: 测试策略

策略支持:

1. 模式 DFS

--uiautomatordfs

增加深度遍历算法

2. 模式 Mix

--uiautomatormix

直接使用底层accessibiltyserver获取界面接口 解析各控件,随机选取一个控件执行touch操作。

同时与原monkey 其他操作按比例混合使用

默认accessibilityserver action占比50%,其余各action分剩余的50%

accessibilityserver action占比可配置 --pct-uiautomatormix n

3. 保留原始monkey

4. 总运行时长

--running-minutes 3 运行3分钟

5. --act-whitelist-file /sdcard/awl.strings 定义白名单

--act-blacklist-file

其他参与与原始monkey一致

20180112 增加防跳出及切回、防误点状态栏及下拉状态栏

20180115 增加防睡眠及睡眠唤醒、防假死及自拉活机制

20180116 增加随机输入

随机输入 需要提前安装adbkeyboard

https://github.com/senzhk/ADBKeyBoard

随机输入默认随机输入字符,内容可自定义配置,格式如ape.strings文件,每行为随机输入项。

20180118 增加Activity黑白名单 格式如awl.strings,可对跳转做更细粒度控制,比如控制仅在几个特定Activity中跑monkey

20180119 framework兼容 Android5, 6, 7, 8.0

Android5 不支持dfs 模式,因5的accessibiltyserver缺少一个api。故不支持

增加 APP崩溃时自动保存堆栈信息到 /sdcard/crash-dump.log 注 追加保存

参数说明

tv.panda.test.monkey.Monkey 主调入口 无需修改

-p com.panda.videoliveplatform 待测appid

策略模式

--uiautomatormix 混合模式(70%控件解析随机点击,其余30%按原Monkey事件概率分布)

--pct-uiautomatormix n 可自定义混合模式中控件解析事件概率

--uiautomatordfs DFS深度遍历算法(优化版)(注 Android5不支持dfs)

非以上两种为原始Monkey策略

执行时长

--running-minutes 60 执行60分钟monkey

场景细粒度控制

--act-whitelist-file /sdcard/awl.strings 自定义Activity白名单

例:

com.panda.videoliveplatform.activity.WelcomeActivity

com.panda.videoliveplatform.activity.SplashWakeActivity

com.panda.videoliveplatform.activity.MainFragmentActivity

com.panda.videoliveplatform.activity.LiveRoomActivity

锁定跳转只可进入其中的某个Activity

--act-blacklist-file 同上

其他参数及用法同原始Monkey

三 测试

向手机部署 Maxim 相关 D:\>cdMaxim

D:\Maxim>dir

D:\Maxim 的目录

2018/02/03 10:08

2018/02/03 10:08

2018/02/03 09:55 20 ape.strings

2018/02/03 09:55 447 ape.xpath.actions

2018/02/03 09:55 223 awl.strings

2018/02/03 09:55 1,149,240 framework.jar

2018/02/03 09:55 121,367 monkey.jar

2018/02/03 09:55 1,093 README.md

2018/02/03 09:55 33,644 使用帮助.docx

7 个文件 1,306,034 字节

2 个目录 85,022,330,880 可用字节

D:\Maxim>adb push framework.jar /sdcard

framework.jar: 1 file pushed. 5.1 MB/s (1149240 bytes in0.214s)

D:\Maxim>adb push monkey.jar /sdcard

monkey.jar: 1 file pushed. 0.0 MB/s (121367 bytes in2.628s)

执行

去替换掉 -p com.panda.videoliveplatform 为你的 packagename

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar execapp_process /system/bin tv.panda.test.monkey.Monkey -p com.sinacp.ggaicai --uiautomatormix --running-minutes 3

走你~~~~~~~~~~~~~~~~~

我只能说太特么快了,快到本家的 app,界面都来不及响应.

效果不错,这样我们的测试方案又多了一种了,以前的 Appcrawler 这种适合做随机遍历 或者 定制业务流遍历,

加上 Appetizer 插桩后又可以性能捕获和分析监控了.

个人觉得,这种暴力遍历 + 性能捕获 更能测试 App 稳定性,捕获的 Appetizer 分析报告,开发用了都说参考意义很大的咧.

剩下的要研究下那两个配置文件 ape.strings 和 awl.strings,默认还支持 mokey 原生命令行参数.

稍后更新.

四 更新补充 adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar execapp_process /system/bin tv.panda.test.monkey.Monkey -p com.sinacp.ggaicai --uiautomatormix --running-minutes 3 --throttle 300 -v -v

太快的话,可以加上--throttle 300

--throttle 作用:在事件之间插入固定的时间(毫秒)延迟,你可以使用这个设置来减缓 Monkey 的运行速度,如果你不指定这个参数,则事件之间将没有延迟,事件将以最快的速度生成。一般设置为 300 毫秒,原因是实际用户操作的最快 300 毫秒左右一个动作事件,所以此处一般设置为 300 毫秒

加上-v -v 可以调整日志输出级别

-v -v 作用:Level1(-v -v),提供了较为详细的测试信息,如逐个发送到 Activity 的事件信息。 这样在执行过程日志中,便可以看到遍历到的 currentActivity 当前被执行 Activity 名.

这个可以放入 黑白名单文件中 awl.strings .如

--act-whitelist-file /sdcard/awl.strings 或 --act-blacklist-file /sdcard/awl.strings

整个工具并不难

五 (MIX 模式) 增加支持 特殊事件序列

2018.02.23 update

需要配置 max.xpath.action 文件

案例:

[

{

"prob": 1,

"activity":"tv.panda.account.activity.WebLoginActivity",

"actions": [

{

"xpath": "//*[@class='android.widget.EditText']",

"action": "INPUTTEXT",

"text": "13810751000",

"index": 0,

"throttle": 300

},

{

"xpath": "//*[@class='android.widget.EditText']",

"action": "INPUTTEXT",

"text": "123400",

"index": 1,

"throttle": 300

},

{

"xpath": "//*[@content-desc='登录'and@class='android.view.View']",

"index": 0,

"action": "CLICK",

"throttle": 1000

}]

},

{

"prob": 1,

"actions": [

{

"xpath": "//*[@class='android.view.View']",

"index": 0,

"action": "SWIPE",

"args": "10,1000,800,1000,100",

"throttle": 3000

}]

},

{

"prob": 1,

"actions": [

{

"xpath": "//*[@class='android.view.View']",

"index": 0,

"action": "TOUCH",

"args": "500,1000",

"throttle": 1000

}]

}

]

上述包含 3 个特殊事件

发生概率 prob =1 为 100% 发生

仅当 当前 activity 为 tv.panda.account.activity.WebLoginActivity 时或无 activity 配置时做事件查找

xpath 为待查找控件的 xpath 支持复杂型 xpath,支持 index 索引选择

throttle 为该特殊步骤执行完后 sleep n 毫秒

Action 支持

1.Click 点击匹配到的 xpath 控件

2.INPUTTEXT 在匹配到的 xpath 控件中输入 text 指定字符,输入需要提前安装 adbkeyboard

3.TOUCH 点击指定坐标 args = (x,y)

4.SWIPE 按执行路径滑动 args = (x1,y1,x2,y2,step)

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文

以上是作者的更新,接下来我们来体验

D:\Maxim>git pull

remote: Counting objects: 21, done.

remote: Compressing objects: 100% (6/6), done.

remote: Total 21 (delta 7), reused 13 (delta 7), pack-reused 8

Unpacking objects: 100% (21/21), done.

From https://github.com/zhangzhao4444/Maxim

2fcc38f..d406b60 master -> origin/master

Updating 2fcc38f..d406b60

Fast-forward

README.md | 2 ++

max.config | 2 ++

ape.strings => max.strings | 0

ape.xpath.actions => max.xpath.actions | 0

monkey.jar | Bin 121367 -> 131805 bytes

test/ADBKeyBoard.apk | Bin 0 -> 163634 bytes

"test/max.xpath.actions\346\241\210\344\276\2131" | 27 ++++++++++++++++

"test/max.xpath.actions\346\241\210\344\276\2132" | 35 +++++++++++++++++++++

...5\277\347\224\250\345\270\256\345\212\251.docx" | Bin 33644 -> 102828 bytes

9 files changed, 66 insertions(+)

create mode 100644 max.config

rename ape.strings => max.strings (100%)

rename ape.xpath.actions => max.xpath.actions (100%)

create mode 100644 test/ADBKeyBoard.apk

create mode 100644 "test/max.xpath.actions \346\241\210\344\276\2131"

create mode 100644 "test/max.xpath.actions \346\241\210\344\276\2132"

在工程目录下 D:\Maxim git pull 更新后,我们需要重新向连接的手机 push framework.jar 和 monkey.jar

D:\Maxim>adb push framework.jar /sdcard

framework.jar: 1 file pushed. 5.1 MB/s (1149240 bytes in0.214s)

D:\Maxim>adb push monkey.jar /sdcard

monkey.jar: 1 file pushed. 0.0 MB/s (121367 bytes in2.628s)

先优先编辑好 max.xpath.actions 配置 注意格式 和 英文符号编写

[

{

"prob": 1,

"activity":"com.huasheng.stock.ui.usercenter.LoginUI",

"actions": [

{

"xpath": "//*[@resource-id='com.huasheng.stock:id/account_num']",

"action": "INPUTTEXT",

"text": "13699901888",

"index": 0,

"throttle": 760

},

{

"xpath": "//*[@resource-id='com.huasheng.stock:id/pwd']",

"action": "INPUTTEXT",

"text": "hshshshs",

"index": 0,

"throttle": 760

},

{

"xpath": "//*[@text='登录' and @class='android.widget.Button']",

"index": 0,

"action": "CLICK",

"throttle": 1600

}]

}

]

书写该配置需要学习使用界面元素捕获工具,主要是为了获取 xpath 该值

1 android sdk 工具自带的 ** \tools\uiautomatorviewer.bat

2 appium-desktop 桌面版 appium 带的 inspector

3 Macaca 的 app-inspector

以上均可.

我遇到的问题是,这些元素捕获工具好像没有展示当前所捕获界面的 Activity,所以我只能先 带参数-v -v 来从 Maxim 的执行过程日志里找到,登录界面的 Activity

[Maxim] // : debug, currentActivity is com.huasheng.stock.ui.usercenter.LoginUI

同时注意,目前该 Maxim 版本,若要使用该 max.xpath.actions 配置,还需要将配置好的 max.xpath.actions push 到手机

D:\Maxim>adb push max.xpath.actions /sdcard

max.xpath.actions: 1 file pushed. 0.0 MB/s (744 bytes in0.101s)

同时注意,INPUTTEXT 在匹配到的 xpath 控件中输入 text 指定字符,输入需要提前安装 adbkeyboard , 且还需要在手机中手动设置为当前输入法

该输入法工具 在工程目录 D:\Maxim\test\ADBKeyBoard.apk 下.

D:\Maxim\test>adb installADBKeyBoard.apk

Success

然后我们可以开始执行了:

D:\Maxim>adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar execapp_process /system/bin tv.panda.test.monkey.Monkey -p com.huasheng.stock --uiautomatormix --running-minutes 2 --throttle 680 -v -v

需要注意观察 Special Event 该段读入特殊事件的日志 ,是否读入配置成功.

[Maxim] // Special Event:

[Maxim] // Event1:

[Maxim] // Prob: 1.0

[Maxim] // Actvity: com.huasheng.stock.ui.usercenter.LoginUI

[Maxim] // Step0:

[Maxim] // XPath: //*[@resource-id='com.huasheng.stock:id/account_num']

[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@d4cb746

[Maxim] // Action: INPUTTEXT

[Maxim] // Text: 13699901888

[Maxim] // Throttle: 760

[Maxim] // Step1:

[Maxim] // XPath: //*[@resource-id='com.huasheng.stock:id/pwd']

[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@fa58d07

[Maxim] // Action: INPUTTEXT

[Maxim] // Text: hshshshs

[Maxim] // Throttle: 760

[Maxim] // Step2:

[Maxim] // XPath: //*[@text='鐧诲綍' and @class='android.widget.Button']

[Maxim] // XPathExpression: org.apache.xpath.jaxp.XPathExpressionImpl@4df5e34

[Maxim] // Action: CLICK

[Maxim] // Text:

[Maxim] // Throttle: 1600

还有,该段日志来确认是否正确启用了 adbkeyboard 输入法

[Maxim] // InputMethod ID: InputMethodInfo{com.android.adbkeyboard/.AdbIME, settings: null}.id

OK 效果出来了.

六(MIX 模式)支持黑控件 黑区域屏蔽

2018.02.28 update

1.(MIX 模式)支持黑控件 黑区域屏蔽

配置 max.widget.black

案例

[

{

"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",

"xpath": "//[@class='android.widget.TextView' and @text='我的校园' and @resource-id='com.panda.videoliveplatform:id/tv_title']"

},

{

"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",

"xpath": "//[@class='android.widget.TextView' and @text='车队' and @resource-id='com.panda.videoliveplatform:id/tv_title']",

"index": 0,

"bounds": "[0,633][900,789]"

},

{

"activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",

"bounds": "[0,1107][900,1263]"

}

]

当且仅当 当前 activity == 所配 activity 或未配 activity 时 做黑检查

三种方式:

1.仅配置 bounds

屏蔽某个区域,在该区域内的控件或坐标不会被点击。

2.配置 xpath

查找匹配的控件,屏蔽点击该控件。

3.xpath+bounds

查找匹配的控件,当控件存在时屏蔽指定的区域。

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文

将该文件 push 到 /sdcard/max.widget.black

以上是作者的更新,接下来我们来体验:

在工程目录下 D:\Maxim git pull 更新后,我们需要重新向连接的手机 push framework.jar 和 monkey.jar

先优先编辑好 max.widget.black 配置 注意格式 和 英文符号编写

xpath 就不多说了

今天来指导下什么是 bounds 属性,实际就是坐标值,在 appium API 我们经常会用到 tap 模拟手指点击

tap(self,positions,duration=None) 中的 positions 就是 bounds 属性坐标值.

如确定按钮的 bounds 属性坐标值.

如退出提示弹窗的 bounds 属性坐标值. 同样某一区域也有 bounds 属性坐标值,这样就可以屏蔽不点击某一 activity 下属的某一区域了.

编辑完同样需要将该文件 push 到 /sdcard

adb push max.xpath.actions /sdcard

好了 剩下的 就很简单了. 我就不啰嗦了.

七 TROY 模式(支持特殊事件、黑控件等)

2018.03.22 update

TROY 模式(支持特殊事件、黑控件等)配置 max.xpath.selector troy 控件选择子来定制自有的控件选择优先级,例子如下

[

{

"firstList":

[

{ "xpath": "//[contains(@text,'绝地求生')]" }

],

"selectList":

[

{ "xpath": "//[@clickable='true']" },

{ "xpath": "//[@clickable='true']//[contains(name(),'Text')]" },

{ "xpath": "//[@clickable='true']//[contains(name(),'Button')]" },

{ "xpath": "//[@clickable='true']//[contains(name(),'Image')]" }

],

"lastList":

[

{ "xpath": "//[../[@selected='true']]" },

{ "xpath": "//[../..//[@selected='true']]" },

{ "xpath": "//[../..//[@selected='true'] and contains(@resource-id,'tab_')]" },

{ "xpath": "//[contains(@resource-id,'HorizontalScrollView')]" }

],

"blackList":

[

{ "xpath": "//[contains(@resource-id,'wrapper_in_custom_title_bar')]//[contains(@resource-id,'right_button')]" },

{ "xpath": "//[contains(@resource-id,'share')]" }

]

}

]

控件选择策略 会按 1first 2select 3last 并屏蔽 black 来执行遍历操作。

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatortroy --running-minutes 15 -v -v

另注 max.xpath.selector 需要 push 到/sdcard/

android monkey 工具,Maxim-高速 Android Monkey 工具使用记录相关推荐

  1. android服务器压力测试工具,Android自动化压力测试图解教程——Monkey工具

    有时候我们需要对一个软件进行压力测试,检查该软件的性能.如果是人工进行测试的话,效率会低很多,而且会比较枯燥.这时,中的一个命令行工具Monkey就可以为我们减轻很多重复而又繁琐的工作. 一.Monk ...

  2. 【金阳光测试】--深入Monkey工具和使用--Android系列(3)2014年八月八号

    网上介绍Monkey用法不计其数.我也不想炒剩饭,写的和他们一样.Monkey基本原理是伪随机算法.这个算法我想大致介绍下(不感兴趣的朋友情无视它).伪随机数,或称伪乱数,是使用一个确定性的算法计算出 ...

  3. 行意天下正文 Android Day02-Android中单元测试(junit测试)monkey测试

    Android中junit测试有2种实现方式 第1种:一般Android工程的实现方式 1.在清单文件中添加2项内容 首先在AndroidManifest.xml中加入下面红色代码: <mani ...

  4. java 安卓界面 可视化_Monkey可视化工具开发(android篇)

    前几天分享了pc端的monkey可视化工具,今天来分享一下如何用android实现monkey的运行,原理是执行shell命令,各种传参,该工具需要root授权 先附上两个效果图: image.png ...

  5. android系统(9)---android工具网站

    网站介绍:http://www.androiddevtools.cn/ AndroidDevTools 收集整理Android开发所需的Android SDK.开发中用到的工具.Android开发教程 ...

  6. Android开发所需的Android SDK、开发中用到的工具、Android开发教程、Android设计规范,免费的设计素材

    AndroidDevTools AndroidSDK在线更新镜像服务器 中国科学院开源协会镜像站地址: IPV4/IPV6:mirrors.opencas.cn端口:80 IPV4/IPV6:mirr ...

  7. Monkey工具使用-安卓压测工具

    文章目录 环境配置 1.JDK安装配置 2.Android Studio开发环境安装 3.adb安装配置 使用操作 1.连接真机调试 2.检测连接设备 3.安装测试包 4.执行测试 5.命令介绍 6. ...

  8. 【转】 Android快速开发系列 10个常用工具类 -- 不错

    原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ...

  9. github snap android,GitHub - albuer/heapsnap: HeapSnap 是一个定位内存泄露的工具,适用于Android平台。...

    HeapSnap 1.HeapSnap 是什么 HeapSnap 是一个定位内存泄露的工具,适用于Android平台. 主要特性如下: 对系统负载低 不需要修改目标进程的源代码 支持Andoroid上 ...

最新文章

  1. redis入门(03)redis的配置
  2. 一步一步学lucene——(第四步:搜索篇)
  3. php mysql记录用户行为_PHP实现用session来实现记录用户登陆信息
  4. ie,火狐下滚动条的问题
  5. AMD、CMD、CommonJS、ES6(import/export)
  6. Java Web项目的保存和刷新
  7. 【模型加速】TensorRT安装、测试及常见问题
  8. python利用gzip压缩解压缩StringIO
  9. 【Python实例第15讲】分类概率图
  10. 笔记本电脑怎么清理灰尘_笔记本电脑卡顿,运行慢,似中病毒,看这里 小白教你轻松搞定...
  11. 【车牌识别】基于matlab GUI模板匹配车牌库识别【含Matlab源码 416期】
  12. 后台管理系统--毕业设计02
  13. 调试笔记:BSOD 0xA
  14. 算法设计 分治法 快速排序 C语言实现
  15. OFDM 调制系统框图 OFDM
  16. 什么是WebP图片格式?如何在线把Webp格式转换为JPEG格式?
  17. 基于jQuery实现弹幕效果
  18. Emgucv图像处理二
  19. 【CV】膨胀卷积详解以及时间卷积网络TCN论文笔记和源码实现
  20. matlab在电力电子的应用,MATLAB在电力电子仿真中的应用

热门文章

  1. hdu4322 candy 费用流
  2. ubuntu pci wifi bcm4322 无法使用 解决方法
  3. 10款热门的企业报表工具软件,该如何选择?
  4. VVC帧内预测(六)MIP
  5. 【WebApp】离线webapp (iPad版本)开发手记
  6. 多线程爬取wall.alphacoders壁纸
  7. Houdini运行时崩溃了怎么办?别害怕,还有一点点救!
  8. 文本框导入图片并显示到页面上
  9. 空间数据库Topic推荐-AMiner
  10. 2020年茶艺师(初级)考试题及茶艺师(初级)考试题库