『APP稳定性测试干货』| 基于Monkey的移动端/APP稳定性测试过程和方法

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 『APP稳定性测试干货』| 基于Monkey的移动端/APP稳定性测试过程和方法

1 什么是Monkey?

  • Monkey是一个Android平台自动化测试的一个工具,主要用来测试稳定性的;
  • Monkey可以模拟用户的一系列操作,比如触摸屏幕、滑动、按键等,对这些操作进行压力测试,检测程序多久会出现异常;
  • MonkeyAndroid系统自带的,使用java编写的;
  • Monkey的存放路径为:
/system/framework/monkey.jar

在这里插入图片描述

2 Monkey的启动

  • monkey.jar启动使用shell脚本,而shell脚本存放的路径在:
 /system/bin/monkey

在这里插入图片描述

  • 启动有两种方式:
# 方式1(直接在PC上的命令行执行):
adb shell monkey {
   
   参数}

# 方式2(进入设备执行):
进入到设备:adb shell 
monkey {
   
   参数}
  • 比如可以查看monkey的参数:
adb shell monkey -help
C:\Users\Administrator>adb shell monkey -help
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
              [-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
              [--ignore-crashes] [--ignore-timeouts]
              [--ignore-security-exceptions]
              [--monitor-native-crashes] [--ignore-native-crashes]
              [--kill-process-after-error] [--hprof]
              [--pct-touch PERCENT] [--pct-motion PERCENT]
              [--pct-trackball PERCENT] [--pct-syskeys PERCENT]
              [--pct-nav PERCENT] [--pct-majornav PERCENT]
              [--pct-appswitch PERCENT] [--pct-flip PERCENT]
              [--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
              [--pct-permission PERCENT]
              [--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
              [--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
              [--wait-dbg] [--dbg-no-events]
              [--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
              [--port port]
              [-s SEED] [-v [-v] ...]
              [--throttle MILLISEC] [--randomize-throttle]
              [--profile-wait MILLISEC]
              [--device-sleep-time MILLISEC]
              [--randomize-script]
              [--script-log]
              [--bugreport]
              [--periodic-bugreport]
              [--permission-target-system]
              COUNT

3 Monkey的工作原理是什么?

  • 其工作原理是:利用socket通讯的方式来模拟用户操作,比如按键输入、触摸屏输入、手势输入等;
  • 再细化说(来源于网络总结):

1、runMonkeyCyles()获取事件,一个事件结束之后,通过调用getNextEvent()方法获取下一个事件;
2、从事件队列里面获取事件,需要组建事件队列MonkeyEventQueue,队列由MonkeyEvent构成;
3、MonkeyEvent通过command设计模式将具体的事件(如:MonkeyActivityEventMonkeyKeyEventMonkeyMotionEvent)通过injectEvent()方法逐一注入到系统。

4 Monkey的使用方法

4.1 测试指定app

4.1.1 参数说明

  • 使用-p参数即可;
  • 该参数主要是让monkey允许系统启动指定的app
  • 比如指定一个包,我们下载了一个支持安卓6.0的qq安卓6.0QQ

    4.1.2 错误排查

  • 使用命令安装后,如果提示以下信息:
Failure [INSTALL_FAILED_NO_MATCHING_ABIS]
  • 这是因为该APP和模拟器的CPU架构不一样,我这里修改了下模拟器的CPU架构为ARM的,之前创建的是X86架构的;
  • 换了新的架构后进入了系统,并且重新安装apk
adb install QQv5.apk /data/local/tmp
F:\monkey_test>adb install ls /data/local/tmp
Performing Push Install
adb.exe: need APK file on command line

F:\monkey_test>adb install QQv5.apk /data/local/tmp
Performing Push Install
QQv5.apk: 1 file pushed, 0 skipped. 11.8 MB/s (22506899 bytes in 1.817s)
        pkg: /data/local/tmp/QQv5.apk
        ver: /data/local/tmp
Success
  • 终于安装成功了,如下:
    在这里插入图片描述

    4.1.3 启动指定apk

  • 使用以下命令查看下安装的路径以及包的名字为com.tencent.mobileqqi
adb shell ls /data/data
com.android.smoketest
com.android.smoketest.tests
com.android.soundrecorder
com.android.statementservice
com.android.systemui
com.android.vpndialogs
com.android.wallpaper.livepicker
com.android.webview
com.android.widgetpreview
com.example.android.apis
com.example.android.livecubes
com.example.android.softkeyboard
com.svox.pico
com.tencent.mobileqqi
jp.co.omronsoft.openwnn
  • 使用monkey启动com.tencent.mobileqqi并做2个计数:
adb shell monkey -p com.tencent.mobileqqi 2
  • 如果想使用mokey随机启动某个apk并发送N个随机事件,使用:
adb shell monkey -p 包名 N

4.2 显示日志级别

4.2.1 参数说明

  • 使用-v参数,可反馈日志级别;
  • 日志级别有三个:
级别 参数 说明
Level0 -v 启动、测试完成、最终结果信息
Level1 -v -v 详细日志,每个Activity事件信息
Level2 -v -v -v 最详细日志

4.2.2 日志显示

  • Level0日志信息:
F:\monkey_test>adb shell monkey -p com.tencent.mobileqqi -v 2
:Monkey: seed=1701146443923 count=2
:AllowPackage: com.tencent.mobileqqi
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: -0.0%
//   6: 25.0%
//   7: 15.0%
//   8: 2.0%
//   9: 2.0%
//   10: 1.0%
//   11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity;end
    // Allowing start of Intent {
   
    act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity } in package com.tencent.mobileqqi
:Sending Touch (ACTION_DOWN): 0:(191.0,846.0)
  • Level1日志信息:
F:\monkey_test>adb shell monkey -p com.tencent.mobileqqi -v -v 2
:Monkey: seed=1701146536977 count=2
:AllowPackage: com.tencent.mobileqqi
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   + Using main activity com.tencent.mobileqq.activity.SplashActivity (from package com.tencent.mobileqqi)
// Selecting main activities from category android.intent.category.MONKEY
// Seeded: 1701146536977
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: -0.0%
//   6: 25.0%
//   7: 15.0%
//   8: 2.0%
//   9: 2.0%
//   10: 1.0%
//   11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity;end
    // Allowing start of Intent {
   
    act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity } in package com.tencent.mobileqqi
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 23    // KEYCODE_DPAD_CENTER
    // Allowing start of Intent {
   
    cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.LoginActivity } in package com.tencent.mobileqqi
    // activityResuming(com.tencent.mobileqqi)
Events injected: 2
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=1915ms (0ms mobile, 0ms wifi, 1915ms not connected)
// Monkey finished
  • Level2日志信息:
F:\monkey_test>adb shell monkey -p com.tencent.mobileqqi -v -v -v 2
:Monkey: seed=1701146594293 count=2
:AllowPackage: com.tencent.mobileqqi
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   - NOT USING main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
//   - NOT USING main activity com.android.dialer.DialtactsActivity (from package com.android.dialer)
//   - NOT USING main activity com.android.settings.Settings (from package com.android.settings)
//   - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser)
//   - NOT USING main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
//   - NOT USING main activity com.android.deskclock.DeskClock (from package com.android.deskclock)
//   - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
//   - NOT USING main activity com.android.camera.GalleryPicker (from package com.android.gallery)
//   - NOT USING main activity com.android.camera.Camera (from package com.android.camera)
//   - NOT USING main activity com.android.music.MusicBrowserActivity (from package com.android.music)
//   - NOT USING main activity com.android.messaging.ui.conversationlist.ConversationListActivity (from package com.android.messaging)
//   - NOT USING main activity com.example.android.apis.ApiDemos (from package com.example.android.apis)
//   - NOT USING main activity com.android.gesture.builder.GestureBuilderActivity (from package com.android.gesture.builder)
//   - NOT USING main activity com.android.widgetpreview.WidgetPreviewActivity (from package com.android.widgetpreview)
//   - NOT USING main activity com.android.backuptester.MainActivity (from package com.android.backuptester)
//   - NOT USING main activity com.android.calculator2.Calculator (from package com.android.calculator2)
//   - NOT USING main activity com.android.customlocale2.CustomLocaleActivity (from package com.android.customlocale2)
//   - NOT USING main activity com.android.development.Development (from package com.android.development)
//   - NOT USING main activity android.app.AliasActivity (from package com.android.development_settings)
//   - NOT USING main activity com.android.providers.downloads.ui.DownloadList (from package com.android.providers.downloads.ui)
//   - NOT USING main activity com.android.quicksearchbox.SearchActivity (from package com.android.quicksearchbox)
//   + Using main activity com.tencent.mobileqq.activity.SplashActivity (from package com.tencent.mobileqqi)
// Selecting main activities from category android.intent.category.MONKEY
//   - NOT USING main activity com.android.launcher3.Launcher (from package com.android.launcher3)
//   - NOT USING main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
//   - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings)
// Seeded: 1701146594293
// Event percentages:
//   0: 15.0%
//   1: 10.0%
//   2: 2.0%
//   3: 15.0%
//   4: -0.0%
//   5: -0.0%
//   6: 25.0%
//   7: 15.0%
//   8: 2.0%
//   9: 2.0%
//   10: 1.0%
//   11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity;end
    // Allowing start of Intent {
   
    act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity } in package com.tencent.mobileqqi
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(0.0,-1.0)
    // Allowing start of Intent {
   
    cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.LoginActivity } in package com.tencent.mobileqqi
    // activityResuming(com.tencent.mobileqqi)
Events injected: 2
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=5630ms (0ms mobile, 0ms wifi, 5630ms not connected)
// Monkey finished
  • 启动后的界面显示:
    在这里插入图片描述

    4.2.3 保存日志

  • 使用重定向的方法可以将日志保存到指定的目录,比如当前目录下:
adb shell monkey -p com.tencent.mobileqqi -v -v -v 2 > ./monkey_qq.log

在这里插入图片描述

4.2.4 错误排查

  • 关于ANR问题:日志中搜索ANR即可;
  • 关于崩溃问题:日志中搜索Exception
  • 正常执行:在monkey执行完后,在日志最后显示执行事件的次数和时间,且以monkey finished结束,表示执行完成;
    在这里插入图片描述

    4.3 跳过执行操作

    4.3.1 忽略异常崩溃

  • 使用--ignore-crashes参数可以忽略异常崩溃,这样monkey会执行完所有事件;
adb shell monkey -p com.tencent.mobileqqi -v > --ignore-crashes 2

4.3.2 忽略超时

  • 使用--ignore-timeouts可忽略程序超时,monkey不会因超时而停止运行;
adb shell monkey -p com.tencent.mobileqqi -v > --ignore-timeouts 2

4.3.3 忽略许可错误

  • 使用--ignore-security-exceptions可忽略许可错误,如证书、网络许可等;
adb shell monkey -p com.tencent.mobileqqi -v > --ignore-security-exceptions 2

4.4 事件参数

4.4.1 参数说明

  • 以-pct开头控制事件百分比的参数,针对不通的测试类型可以调整百分比;
    在这里插入图片描述

  • 有关事件参数说明如下(均表示百分比):

参数 说明
--pct-touch PERCENT 单击事件
--pct-motion PERCENT 直线滑动事件
--pct-trackball PERCENT 曲线滑动事件
--pct-syskeys PERCENT 导航栏(HomeBack等)
--pct-nav PERCENT 导航事件(上下左右)
--pct-majornav PERCENT 导航事件(返回、确认、菜单)
--pct-appswitch PERCENT Activity的启动比率
--pct-flip PERCENT 模拟器适用的事件
--pct-anyevent PERCENT 不常用事件,比如按键
--pct-pinchzoom PERCENT 多点手势缩放
--pct-permission PERCENT 权限事件

4.4.2 指定事件百分比

  • 直接在启动事件上加以上的参数即可;
  • 参数后直接加上数值(表示百分数):
adb shell monkey --pct-motion 40 -p com.tencent.mobileqqi 2

4.5 事件延迟

  • 使用--throttle可表示两个事件之间的延迟,单位ms
adb shell monkey --throttle 1000 -p com.tencent.mobileqqi 2

4.6 指定随机事件种子值

  • 使用-s参数表示产生随机事件种子值:
test01: adb shell monkey -p com.tencent.mobileqqi -s 50 2 
test02: adb shell monkey -p com.tencent.mobileqqi -s 50 2

4.7 终止进程

4.7.1 终止错误进程

  • 使用--kill-process-after-error终止执行错误的进程。

4.7.2 监控崩溃事件

  • 使用--monitor-native-crashes监控代码的崩溃事件。

4.7.3 停止monkey

  • 使用--wait-dbg停止执行中的monkey,直到有调试器相连为止。

5 一个实例

5.1 实例需求

  • 启动qq;
  • 实现3个事件操作;
  • 时间间隔2s;
  • 指定2个事件,占比为20%,30%;
  • 忽略异常、崩溃、超时;
  • 保存日志。

5.2 实例实现

  • 参数如下:
adb shell monkey -p com.tencent.mobileqqi --throttle 2000 --pct-touch 20 --pct-motion 30 -v -v -v -s 50 --ignore-crashes --ignore-timeouts --ignore-security-exceptions 3 > ./test.log
:Monkey: seed=50 count=3
:AllowPackage: com.tencent.mobileqqi
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
//   - NOT USING main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
//   - NOT USING main activity com.android.dialer.DialtactsActivity (from package com.android.dialer)
//   - NOT USING main activity com.android.settings.Settings (from package com.android.settings)
//   - NOT USING main activity com.android.browser.BrowserActivity (from package com.android.browser)
//   - NOT USING main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
//   - NOT USING main activity com.android.deskclock.DeskClock (from package com.android.deskclock)
//   - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
//   - NOT USING main activity com.android.camera.GalleryPicker (from package com.android.gallery)
//   - NOT USING main activity com.android.camera.Camera (from package com.android.camera)
//   - NOT USING main activity com.android.music.MusicBrowserActivity (from package com.android.music)
//   - NOT USING main activity com.android.messaging.ui.conversationlist.ConversationListActivity (from package com.android.messaging)
//   - NOT USING main activity com.example.android.apis.ApiDemos (from package com.example.android.apis)
//   - NOT USING main activity com.android.gesture.builder.GestureBuilderActivity (from package com.android.gesture.builder)
//   - NOT USING main activity com.android.widgetpreview.WidgetPreviewActivity (from package com.android.widgetpreview)
//   - NOT USING main activity com.android.backuptester.MainActivity (from package com.android.backuptester)
//   - NOT USING main activity com.android.calculator2.Calculator (from package com.android.calculator2)
//   - NOT USING main activity com.android.customlocale2.CustomLocaleActivity (from package com.android.customlocale2)
//   - NOT USING main activity com.android.development.Development (from package com.android.development)
//   - NOT USING main activity android.app.AliasActivity (from package com.android.development_settings)
//   - NOT USING main activity com.android.providers.downloads.ui.DownloadList (from package com.android.providers.downloads.ui)
//   - NOT USING main activity com.android.quicksearchbox.SearchActivity (from package com.android.quicksearchbox)
//   + Using main activity com.tencent.mobileqq.activity.SplashActivity (from package com.tencent.mobileqqi)
// Selecting main activities from category android.intent.category.MONKEY
//   - NOT USING main activity com.android.launcher3.Launcher (from package com.android.launcher3)
//   - NOT USING main activity com.android.settings.Settings$RunningServicesActivity (from package com.android.settings)
//   - NOT USING main activity com.android.settings.Settings$StorageUseActivity (from package com.android.settings)
// Seeded: 50
// Event percentages:
//   0: 20.0%
//   1: 30.0%
//   2: 1.3333334%
//   3: 10.0%
//   4: -0.0%
//   5: -0.0%
//   6: 16.666668%
//   7: 10.0%
//   8: 1.3333334%
//   9: 1.3333334%
//   10: 0.6666667%
//   11: 8.666667%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity;end
    // Allowing start of Intent {
   
    act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.tencent.mobileqqi/com.tencent.mobileqq.activity.SplashActivity } in package com.tencent.mobileqqi
Sleeping for 2000 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-2.0,-3.0)
:Sending Trackball (ACTION_MOVE): 0:(-4.0,-4.0)
Events injected: 3
:Sending rotation degree=0, persist=false
:Dropped: keys=0 pointers=0 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=2732ms (0ms mobile, 0ms wifi, 2732ms not connected)
// Monkey finished
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
208 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
3月前
|
监控 测试技术 开发工具
移动端性能测试工具
移动端性能测试工具
155 2
|
3月前
|
数据采集 网络协议 算法
移动端弱网优化专题(十四):携程APP移动网络优化实践(弱网识别篇)
本文从方案设计、代码开发到技术落地,详尽的分享了携程在移动端弱网识别方面的实践经验,如果你也有类似需求,这篇文章会是一个不错的实操指南。
109 1
家政服务小程序APP开发,做好上门家政最快的方法是什么?
在家政服务领域,打造成功的平台并非易事。本文分享了三个关键步骤:避免初期盲目投入、采用低成本获客方式、建立有效的阿姨筛选机制。遵循这些方法,可助你避开常见陷阱,成为行业头部平台。
|
4月前
|
机器学习/深度学习 弹性计算 自然语言处理
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
241 1
|
5月前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
6月前
|
iOS开发
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
335 0
App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法
|
6月前
【Azure App Service】同一个App Service下创建多个测试站点的方式
【Azure App Service】同一个App Service下创建多个测试站点的方式
|
6月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
6月前
|
网络协议 安全 前端开发
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)

热门文章

最新文章

  • 1
    小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
  • 2
    3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
  • 3
    Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
  • 4
    基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
  • 7
    「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
  • 8
    用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
  • 9
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
  • 10
    AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
  • 1
    iOS|记一名 iOS 开发新手的前两次 App 审核经历
    10
  • 2
    2025同城线下陪玩APP开发/电竞游戏平台搭建游戏陪玩APP源码/语音APP开发
    17
  • 3
    flutter3-wetrip跨平台自研仿携程app预约酒店系统模板
    25
  • 4
    通过外部链接启动 Flutter App(详细介绍及示例)
    21
  • 5
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    55
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    46
  • 7
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    40
  • 8
    【Azure Function】Function App门户上的Test/Run返回错误:Failed to fetch
    36
  • 9
    小游戏源码开发之可跨app软件对接是如何设计和开发的
    42
  • 10
    原生鸿蒙版小艺APP接入DeepSeek-R1,为HarmonyOS应用开发注入新活力
    178