moneky 保存日志命令是不是一定要在出问题的机型下测试

monkey---常用的一些这些那些 - Paris-liu的测试职业角 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
monkey---常用的一些这些那些
& 10:24:44
/ 个人分类:
& & 的用法命令,我就不写了,网上到处都是,这一节只说我平时的使用和实践的一点东西,& & 首先monkey是用来干嘛的?我觉得 :&& & & & 一是用来偷懒的,有时候别的公司提供过来的apk,他们的已经做了足够的功能验证等等,拿过来我验证,怎么验证呢?开跑monkey,发现有crash,anr打回改了再来,不耽误啊什么都~& & & & 二,最初始版本的验证,本公司的开发和其他杂牌的开发一样,从来不知自我验证为何物,初始版本上来都乱七八糟,跑个monkey看看,crash的种类和数量多不多,多了直接打回& & & & 三,的利器,几轮功能下来了,没感觉了,上monkey,看看还有没有遗漏的bug,尤其是整机测试,24h以上的monkey测试简直必不可少,一方面是发现过程中会否发生的重启,关机,黑屏,还有crash,anr等,这样的bug只需提取log给开发即可,但是我认为更多的是,长时间的monkey跑下来,是为了模拟用户的真实操作,看看在密集的操作之后,手机的各方面性能表现如何?cpu表现?mem表现,手机有没有明显的卡顿,这些数据本身的衡量,即你用什么样的指标去证明手机的性能就是不行,而不是我感觉很卡。。。具体量化为数值的体现,甚至提取多次数字用图标绘制,让观者有一个明显的认知,比如24hmonkey之后,手机卡顿要死,打开新的apk慢的不行不行,那么,测试之前的cpu,mem,帧率是个什么样子,测试之后这些数值时什么样子&& & 用法:adb
monkey --pct-touch 60 --pct-motion 35 --pct-appswitch 5 --pct-syskeys 5 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 500 -v -v 40000 & E:m.log& & 为了方便只抓错误信息,还可以开一个adb命令,adb logcat -v time *:E &F:\log99.txt 只打印出错log的命令,然后放在F盘中,当然管你是无线连adb也好,还是直接跟我一样偷懒开mtk最后只看dropbox,反正怎么方便提bug怎么来& &说一下如何结束,monkey一开,结果你发现你忘了什么重要操作,一般就是长按后关机啊,结果有时候太快了半天不行,所以最好的方式是直接杀掉monkey的进程:&adb shell & & & & & & & & & & & &#进shellps|grep monkey & & & & & & & & & #然后ps|grep monkey找到monkey的idkill id再说下黑白无常,monkey很贴心,有时候你要跑的只是几个包,而非全部,白名单滚出来:将10个的包名写进白名单----whitelist:adb push E:\01_AutomationTest\01_Monkey\05_NbBank\whitelist.txt data/local/tmp/adb shellmonkey --pkg-whitelist-file /data/local/tmp/whitelist.txt --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 15000&做整机,我们一般不跑设置里面的东东,因为很容易把wifi,BT, 恢复出厂,开关机这样的操作给动了,就白跑了,所以,一般把settings扔进黑名单----blacklist:adb push E:\01_AutomationTest\01_Monkey\05_NbBank\blacklist.txt data/local/tmp/monkey --pkg-blacklist-file /data/local/tmp/blacklist.txt --throttle 500 -s 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 15000&其实想要说的还有点点,开发对monkey不是待见,怎么说呢,只要log,而他们的代码可能是反编译过的,所以有时候bug中的log不能够真正表明原因,所以他们不知道也没法找到真正原因,而且,比如我发现的一个问题,monkey5000次之后,一个app的activity栈中居然保存了之前几乎一大半的activity,没有释放,我不知道他们具体的编码,但是我认为这个是一个问题,虽然我手动暂时没有复现,但是我认为这个bug有意义,证明他们编码实现还是有够优化的其次:注意这个:-c &main-category&&如果用此参数指定了一个或几个类别,Monkey将只允许系统启动被这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity: Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别,需要使用多个-c选项,每个-c选 项只能用于一个类别。一般来说,90%的人用monkey是没有指定这个的,也是因为不知道怎么用,不了解安卓的intent机制,以及类别,其实我也不知道,所以觉得,做安卓测试,对安卓framework有一些了解还是有必要的,有时间了还是要多一些开发知识,这篇先到这,后续会把monkey源码再看看,以及固定moneky到一个界面或者几个界面的脚本编写,这才是重点内容。对包测试命令:上面命令敲错了,对于包的测试:adb shell monkey -p com.abovegem.distributorapp --pct-touch 80 --pct-motion 20 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --throttle 500 -v -v 10000&增值税发票
无理由退货
我浏览过的
您现在的位置:&
电子电路测试步骤和方法
电子电路测试步骤和方法
1.不通电检查  ①检查连线   电路安装完毕后,不要急于通电,先认真检查接线是否正确,包括错线、少线、多线。多线一般是因接线时看错引脚,或者改接线时忘记去掉原来的旧线造成的,在实验中经常发生,而查线时又不易发现,调试时往往会给人造成错觉,以为问题是由元器件引起的。例如TTL两个门电路的输出端无意中接在一起,引起电平不高不低,人们很容易认为是元器件坏了。为了避免做出错误判断,通常采用两种查线方法:一种方法是按照设计的电路图检查安装的线路,把电路图上的连线按一定顺序在安装好的线路中逐一对应检查,这种方法比较容易找出错线和少线;另一种方法是按实际线路来对照电路原理图,按照两个元件引脚连线的去向查清,查找每个去处在电路图上是否存在,这种方法不但能查出错线和少线,还能检查出是否多线。不论用什么方法查线,一定要在电路图上对查过的线做出标记,并且还要检查每个元件的引脚的使用端数是否与图纸相符。查找时最好用指针式万用表的'R&1',或用数字万用表的'X挡'。  ②直观检查   直观检查电源、地线、信号线、元件引脚之间有无短路;连线处有无接触不良;二极管、三极管、电解电容等引脚有无错接;集成电路是否插对等。  
2. 通电观察  把经过准确测量的电源电压加入电路,但信号源暂不接入,电源接通之后不要急于测量数据和观察结果,首先要观察有无异常现象,包括有无冒烟,是否闻到异常气味,手摸元件是否发烫,电源是否有短路现象等。如果出现异常现象,应立即关断电源,待排除故障后方可重新通电。然后再测量各元件引脚的电源电压,而不是只测量各路总电源电压,以保证元器件正常工作。  
3. 分块调试  调试包括测试和调整两个方面。测试是在安装后对电路的参数及工作状态进行测量,调整是指在测试的基础上对电路的参数进行修正,使之满足设计要求。为了使测试顺利进行,设计的电路图上应标出各点的电位值、相应的波形以及其它数据。测试方法有两种:第一种是采用边安装边调试的方法,也就是把复杂的电路按原理图上的功能分成块进行安装调试,在分块调试的基础上逐步扩大安装调试的范围,最后完成整机调试,这种方法称为分块调试。采用这种方法能及时发现问题,因此是常用的方法,对于新设计的电路更是如此。另一种方法是整个电路安装完毕,实行一次性调试。这种方法适用于简单电路或定型产品。本文仅介绍分块调试。
更多猛料!欢迎扫描下方二维码关注土猫网官方微信( tumaowang )
&#165&127元
节省25.4元
&#165&239元
节省47.8元
&#165&19元
&#165&449元
节省89.8元
&#165&299元
节省59.8元
&#165&45元
&#165&159元
节省31.8元
&#165&35.3元
节省15.7元
&#165&6.9元
&#165&19.9元
&#165&10.9元
&#165&219元android_测试分析(monkey,monekyrunner,uiautomator,Robotium,单元测试,启动性能)cts测试
& 测试分析(monkey,monekyrunner,uiautomator,Robotium,单元测试,启动性能):
& $adb shell monkey -p com.nobody.appfilter -v 500; #monkey测试;
& monkey命令源码位置:development/cmds/monkey/src/com/android/commands/
& monkeyrunner.jar包在sdk的sdk/tools/monkeyrunner.jar/chimpchat.jar/draw9patch.jar等prebuilt的工具;
& $monkeyrunner runner.#运行monkeyrunner的py脚本;
& $adb shell input text textInput//模拟输入textInput字符串;模拟事件全部是通过input命令来实现的;
& $adb shell input keyevent 3;#模拟home按键;
& $adb shell input tap 250 250;#tap模拟的是touch屏幕的事件,只需给出x/y坐标即可;
& $adb shell input swipe 250 250 300 300;#关于swipe同tap是一样的,只是他是模拟滑动的事件,给出起点和终点的坐标即可;
& uiautmotor需继承UiAutomatorTestCUiAutomatorTestCase继承了JUnit的TestC
& $adb shell uiautomator runtest LaunchSettings.jar -c com.uia.example.my.LaunchS #uiautomator语法;
& UI automation test should extend UiAutomatorTestC
& public class UiAutomatorTestCase extends TestCase{ * };com.android.uiautomator.testrunner包;/frameworks/testing/uiautomator/library/testrunner-src/com/android/uiautomator/testrunner目录;
& public abstract class TestCase extends Assert implements Test{ * };junit.framework包;/external/junit/src/junit/framework目录;
& public final class UiAutomation{ * };android.app包;内部利用IAccessibilityServiceConnection进行与AccessibilityManagerService的binder通讯;
& Robotium需继承ActivityInstrumentationTestCase2;第三方jar对操作进行了一系列的封装;
& public abstract class ActivityInstrumentationTestCase2&T extends Activity& extends ActivityTestCase{ * };android.test包;/frameworks/base/test-runner/src/android/
& 单元测试需继承ActivityUnitTestC
& public abstract class ActivityUnitTestCase&T extends Activity& extends ActivityTestCase{ * };android.test包;/frameworks/base/test-runner/src/android/
& $adb shell am instrument –w XXXXXX; #-w是指定Instrumentation类的参数标志;
& 启动性能,LaunchPerformanceBase是是启动性能测试容器;
& public class LaunchPerformanceBase extends Instrumentation{ * };android.test包;@android.test包;/frameworks/base/test-runner/src/android/
& mConext.startInstrumentation(*);//启动执行Instrumentation类; //apiDemo中的示例;
& mInstrumentation.startActivitySync(*);//启动& mInstrumentation.runOnMainSync(*)//调用activity的主线程; mInstrumentation.waitForIdleSync(*);//等待application返回;
& $adb shell getevent /dev/input/event0; “a& ”,type事件类型码,code扫描码或键值,value值;
& 在Activity中,直接启动单线程调用 mInstrumentation.sendStringSync(&aa&); //动作注入,必须是同一uid的程序;
& adbShell动作注入调用的是 InputManager.getInstance().injectInputEvent(*);
&&& //InputManager类位于/frameworks/base/core/java/android/hardware/input下;getInstance()的Api为
& $make cts #android源码编译好后,在编译cts.生成目录在out/host/linux-x86/cts/下.官网,/compatibility/cts-intro.html
& 源码下,$ #生成目录在/out/host/linux-x86/cts/*下; &
& $sudo chmod 777 cts- #在/out/host/linux-x86/cts/android-cts/tools目录;
& $./cts- #启动;
& $& #列举已安装的cts测试;
& $run cts --p zzz.android.& #进行cts测试;
& UiAutomator:
& $& #&android-sdk&/tools/目录下;能够显示View结构;
& $android create uitest-project -n uiTest -t 1 -p UiAutomator/;& #生成build文件;
& $& #build测试jar文件;
& $adb push uiTest.jar /data/local/tmp/; #push文件;
& $adb shell uiautomator runtest uiTest.jar -c com.uia.example.my.LaunchS #运行;
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
MFQ&PPDCS大型嵌入式软件系统的测试分析和测试设计 原创作者:邰晓梅 翻译:wzhj132 原创来源:2009年ICSEA大会上的论文&MFQ & PPDCS - Test Analysis and TestDesign for Large Embedded Software Systems& 内容简介: MFQ & ...
RPS和RFS RPS 全称是 Receive Packet Steering, 这是Google工程师 Tom Herbert ()提交的内核补丁, 在2.6.35进入Linux内核. 这个patch采用软件模拟的方式,实现了多队列网卡所提供的功能,分散了在多CPU系统上数据接收时的负载, 把软中断分到各个CPU处理 ...
需求测试分析文档 –本文主要是来描述一个测试分析所要具备的几点: 产品概述 项目整体分析 功能性测试需求分析 非功能性测试需求分析 测试相关描述 测试方案 测试缺陷管理 测试流程管理 风险预警 其他 一 .产品概述 1.产品背景 目标是为了让测试人员了解下业务背景,并站着用户的角度去思考,去测试. 2.产品目标 测试分析的时候需要对此项进行关注,依据此处内容 ...
Fail的一些修改
1.直接设置问题 estUnknownSourcesOffByDefault fail junit.framework.AssertionFailedError: Deviceshould not ship with 'Unknown Sources' enabled by default.expected:&0& but ...
用 USB 连接开发板和办公电脑,就可以开始进行 cts 测试了. 测试步骤如下: 1)进入 cts 目录,启动 cts. localhost bin # pwd /work/android_src/out/host/linux-x86/bin (cts 可执行程序放在 android 源代码/work/android_ ...
Android CTS 测试研究前言?从各种渠道了解到 Android CTS 测试, 是一种类似于 Windows Mobile LTK 的测试.大体 Google 一下, 发现关于 CTS 的信息非常至少, 只说它有两万多个测试用例.然后它只对 OHA 成员开发.本着不抛弃,不放弃的原则,继续 Google...终于发现了参考1:Cezary Statk ...
Android CTS 测试研究前言?从各种渠道了解到 Android CTS 测试, 是一种类似于 Windows Mobile LTK 的测试.大体 Google 一下, 发现关于 CTS 的信息非常至少, 只说它有两万多个测试用例.然后它只对 OHA 成员开发.本着不抛弃,不放弃的原则,继续 Google...终于发现了参考1:Cezary Statk ...
一.基础篇 1. CTS
CTS(全称&Compatibility Test Suite&,即&兼容性测试包&)的认证,这是一组用以测试的.apk程序之类的集合,它能够在官网(/compatibility/downloads.html)上面免费下载,并且测 ...Android自动化压力测试图解教程——Monkey工具 - 吃饭了吗 - 博客园
android(3)&
&&&&&& 有时候我们需要对一个软件进行压力测试,检查该软件的性能。如果是人工进行测试的话,效率会低很多,而且会比较枯燥。这时,中的一个命令行工具Monkey就可以为我们减轻很多重复而又繁琐的工作。
&&&&&&& 一、Monkey简介
&&&&& 至于Monkey的名字是有何而来的呢?这个没有去怎么考究,Monkey这个工具就是一个调皮的猴子,在App中乱按、乱摸、乱滚、乱跳。Monkey测试是Android平台下自动化测试的一种快速有效的手段,通过Monkey工具可以模拟用户触摸屏幕、滑动轨迹球、按键等操作来对模拟器或者手机设备上的软件进行压力测试,检测该软件的稳定性、健壮性。它的原理是向系统发送伪随机的用户事件流(如按键输入、触摸输入、手势输入等),实现对正在开发的应用程序进行压力测试。
&&&& &二、Monkey的特性
&&& (1)测试的对象仅为应用程序包(apk包),有一定的局限性;
&& &(2)Monkey测试使用的事件流数据流是随机的,不能进行自定义;
&& &(3)可对MonkeyTest的对象、事件数量、类型、频率等进行设置。
&&&&& 虽然Monkey工具并不完善,但是足于应付应用程序的基本测试需要了。如果需要功能更强大的测试工具的话,可以使用Monkey的进化版MonkeyRunner。如果把Monkey看作是幼儿园的小孩,那么它的进化版MonkeyRunner就可以看作是一个初中生了。它支持自定义插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放。在这里,就不详细介绍MonkeyRunner了,具体可以参考其官方文档或者其他相关资料。
&&&& 注:MonkeyRunner官方文档的网址
&&& 三、Monkey的基本用法
&&& 基本语法如下:
&&& $&adb&shell&monkey&[options]
&&& 如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送1000个伪随机事件:
&&& $&adb&shell&monkey&-p&your.package.name&-v&number
&&& $&monkey&-p(package的意思)&&指定文件名&-v(测试的次数和频率)&number(次数)
&&& 四、Monkey测试示例图解
&&& 通过简单的测试示例,初步了解并掌握Monkey测试的步骤。注意,这里主要是使用adb命令进行安装和相关操作。测试的具体参考步骤如下:
&& (1)首先,先准备了一个测试用的应用程序(apk文件)。为了测试,这里选择了一个格瓦拉手机购票App进行测试。下载地址为:。
&& 下载好后,得到下图所示的apk文件。
&&&(2)将apk文件复制到android&sdk对应platform-tools的目录下。例如,笔者的sdk路径为&D:\android\android-sdk-windows\platform-tools。如图所示
&&&&(3)进行apk文件的安装(安装的前提是,已经启动并可以检测模拟器):有安装91助手或者豌豆的用户可以直接双击apk文件进行安装;也可以使用android下的adb命令进行安装(如下图所示,Success表示安装成功)。adb命令下安装apk文件的命令为:adb&install&文件名.apk。
&(4)安装好后,会在模拟器上看到应用程序的启动图标
&&&(5)安装好apk文件后,需要知道应用程序主Activity(第一个启动的Activity)所在的包名。这时,我们可以使用adb&shell命令查找到程序主Activity所在的包名,如下图所示。(知道了apk的包名,我们也可以利用adb命令进行应用程序的卸载;卸载apk文件的命令为:adb&uninstall&包名)
&&& (6)这里是最关键的一步,使用moneky命令进行自动化压力测试。
&&& 命令为:#monkey&-p&com.gewara&-v&1000(参数说明:-p后跟着软件所在包名,-v后跟测试的次数)。这里对该软件进行1000次的自动化测试,几分钟内即可以完成测试。如图所示
& (7)测试完毕,发现程序出错了。程序出错,表明该软件的稳定性和健壮性还有待提高。
& 这时,可以打开Lotcat查看出错信息。如图所示
&&&&&&五、Monkey测试的停止条件
&& (1)如果先顶了Monkey运行在一个或几个特定的包上,那么它会检测试图转到它包的操作,并对其进行阻止;
&& (2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错;
&& (3)如果应用程序产生了应用程序不响应(application&not&responding)的错误,Monkey将会停止并报错。
&&&&通过多次并且不同设定下的Monkey测试才算它是一个稳定性和健壮性足够的程序。
&&& 六、Monkey命令参数说明
&&& 随着测试的深入,我们需要忽略App的崩溃(App的崩溃会导致Monkey测试的停止),而不是停住,monkey同样能做到。--ignore&crashes
& &甚至,它还能生成profiling报告。&--hprof
&& 注:Monkey具体参数的设定可参考:
&& 通过参数的设置,可以完成更多的调试功能,Monkey命令行参数中文相关说明见下表。
随笔 - 220Android自动化压力测试图解教程——Monkey工具 - vs_dev的个人空间 - 51Testing软件测试网 51Testing软件测试网-中国软件测试人的精神家园
Android自动化压力测试图解教程——Monkey工具
& 17:30:13
/ 个人分类:
自动化图解教程——Monkey工具&&&&&& 有时候我们需要对一个软件进行压力测试,检查该软件的性能。如果是人工进行测试的话,效率会低很多,而且会比较枯燥。这时,中的一个命令行工具就可以为我们减轻很多重复而又繁琐的。&&&&&&&& 一、简介&&&&& 至于的名字是有何而来的呢?这个没有去怎么考究,这个工具就是一个调皮的猴子,在中乱按、乱摸、乱滚、乱跳。测试是平台下的一种快速有效的手段,通过工具可以模拟用户触摸屏幕、滑动轨迹球、按键等操作来对模拟器或者设备上的软件进行压力测试,检测该软件的稳定性、健壮性。它的原理是向系统发送伪随机的用户事件流(如按键输入、触摸输入、手势输入等),实现对正在开发的应用程序进行压力测试。&&&&& &二、的特性&&& ()测试的对象仅为应用程序包(包),有一定的局限性;&& &()测试使用的事件流数据流是随机的,不能进行自定义;&& &()可对的对象、事件数量、类型、频率等进行设置。&&&&& 虽然Monkey工具并不完善,但是足于应付应用程序的基本测试需要了。如果需要功能更强大的测试工具的话,可以使用的进化版。如果把看作是幼儿园的小孩,那么它的进化版就可以看作是一个初中生了。它支持自定义插件控制事件随时截图简而言之任何你在模拟器设备中能干的事情都能干而且还可以和回放。在这里,就不详细介绍MonkeyRunner了,具体可以参考其官方文档或者其他相关资料。&&&& 注:官方文档的网址&&&&&&& 三、的基本用法&&& 基本语法如下:&&& $&adb&shell&monkey&[options]&&& 如果不指定,将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送000个伪随机事件:&&& $&adb&shell&monkey&-p&your.package.name&-v&number&&& $&monkey&-p(的意思)&&指定文件名&(测试的次数和频率)&(次数)&&&& 四、Monkey测试示例图解&&& 通过简单的测试示例,初步了解并掌握测试的步骤。注意,这里主要是使用命令进行安装和相关操作。测试的具体参考步骤如下:&& (1)首先,先准备了一个测试用的应用程序(文件)。为了测试,这里选择了一个格瓦拉手机购票进行测试。下载地址为:。&& 下载好后,得到下图所示的文件。&&&(2)将文件复制到对应的目录下。例如,笔者的路径为&。如图所示&&&&&(3)进行文件的安装(安装的前提是,已经启动并可以检测模拟器):有安装助手或者豌豆的用户可以直接双击文件进行安装;也可以使用下的命令进行安装(如下图所示,表示安装成功)。命令下安装文件的命令为:文件名。&&&(4)安装好后,会在模拟器上看到应用程序的启动图标&& &&&(5)安装好文件后,需要知道应用程序主(第一个启动的)所在的包名。这时,我们可以使用命令查找到程序主所在的包名,如下图所示。(知道了的包名,我们也可以利用命令进行应用程序的卸载;卸载文件的命令为:包名)&&&& (6)这里是最关键的一步,使用命令进行自动化压力测试。&&& 命令为:#monkey&-p&com.gewara&-v&1000(参数说明:-p后跟着软件所在包名,后跟测试的次数)。这里对该软件进行次的自动化测试,几分钟内即可以完成测试。如图所示&&&&&&&&& (7)测试完毕,发现程序出错了。程序出错,表明该软件的稳定性和健壮性还有待提高。& 这时,可以打开Lotcat查看出错信息。如图所示&&&&&&&&&&&&&五、Monkey测试的停止条件&& (1)如果先顶了运行在一个或几个特定的包上,那么它会检测试图转到它包的操作,并对其进行阻止;&& (2)如果应用程序崩溃或接收到任何失控异常,将停止并报错;&& (3)如果应用程序产生了应用程序不响应()的错误,将会停止并报错。&&&&通过多次并且不同设定下的测试才算它是一个稳定性和健壮性足够的程序。&&&& 六、命令参数说明&&& 随着测试的深入,我们需要忽略的崩溃(的崩溃会导致测试的停止),而不是停住,同样能做到。& &甚至,它还能生成报告。&&& 注:具体参数的设定可参考:&&&& 通过参数的设置,可以完成更多的调试功能,命令行参数中文相关说明见下表。&&&版权声明:本文为博主原创,未经博主允许不得转载。

我要回帖

更多关于 moneky 保存日志 的文章

 

随机推荐