AndroidCTS测试修改测试结果和调试⽅法
⼀、基础篇
1. CTS
CTS的⽬的就是让Android设备(如:⼿机)开发商能够开发出兼容性更好的Android设备。
2. GMS
GMS全称为 Mobile Service,即移动服务。GMS是Google开发并推动的动⼒,也是Android系统的灵魂所在。
GMS⽬前提供有Search、Search by Voice、Gmail、Contact Sync、Calendar Sync、Talk、Maps、Street View、YouTube、Android Market(ICS上更改为Play store)服务。当⽤户使⽤⾕歌服务的时候,⾕歌可以把⼴告嵌⼊各种⾕歌的服务中,⽐如:⽤户在使⽤⾕歌地图的时候,就能发现搜索地名关键字的⼴告。在使⽤⾕歌移动搜索的时候,不⽤说,当然也是有⼴告的。⾕歌其实是拿⽤户的注意⼒来换取⼴告主的⾦钱。⽽且Android智能⼿机操作系统其实也就是⾕歌把⾃⼰的服务主动放到了⼿机上,进⼀步巩固⾃⼰的市场地位。
依据GMS,⾕歌对android⼿机给予不同程度的授权,把搭载Android系统的⼿机⼚商分为三个级别,
1.免费使⽤Android操作系统,但不内嵌GMS;
2.内嵌部分GMS服务,但⼿机不能打上⾕歌的商标;
3.内嵌所有的GMS服务,也可以使⽤⾕歌商标。如果在android⼿机中内置有⾕歌GMS服务的话,是等同被⾕歌官⽅认证过的产品。
GMS的认证主要是Google为⼿机⼚商进⾏认证,所以得到认证的主要⼚商如下,⽽与芯⽚⼚商关系不⼤。⽬前在市⾯上,只有少数的⼿机⼚商通过了GMS认证,⽐如HTC(宏达国际电⼦)-
Samsung Electronics()- 韩国
Motorola Mobility(摩托罗拉移动技术)- 美国
Sony Ericsson()- 英国
LG Electronics(LG电⼦)- 韩国
Lumigon ()- 丹麦
ARCHOS()- 法国
TOSHIBA()- ⽇本
GMS认证并不是想象的那么容易,⾕歌要根据⼚商的实⼒和地区因素来考虑是否认证。对于⼚商来说,GMS除了获得更多的⾕歌服务权限之外,还是拉开品牌区隔度的有效⼿段,也就是⾝份证明。由此可见从⼀个⼚商是否通过GMS认证,来简单的判断这个⼚商的综合能⼒。
⼆、测试篇
⼀)基于Android 2.3 CTS测试修改测试结果和调试⽅法
1. CTS 测试 ⽤ USB 连接开发板和办公电脑,就可以开始进⾏ cts 测试了。
测试步骤如下:
1)进⼊ cts ⽬录,启动 cts。
localhost bin # pwd
/work/android_src/out/host/linux-x86/bin (cts 可执⾏程序放在 android 源代码/work/android_src 中的/out/host/linux-x86/bin 路径下。)
localhost bin # ./cts (启动 cts)
启动开发板会在屏幕上显⽰下⾯信息。
Android CTS version 2.2_r1
Device(0123456789ABCDEF) connected (开发板已经连接,说明 USB 已经连接好,可以进⾏ CTS 测试了)
cts_host > start --plan VM (启动 cts 的 VM 测试计划)
start test plan VM
==============================================================
Test package: vm-tests
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_(pass)
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_(pass)
dot.junit.opcodes.add_double_2addr.JUnit_Test_add_double_(pass)
........................(略)
如果以前跑过 VM 测试,或由于某种原因导致 VM 测试暂停,在下次 cts 测试,会显⽰如下信息:
localhost bin # ./cts
Android CTS version 2.2_r1
Device(0123456789ABCDEF) connected
cts_host > start --plan VM
cts_host > There are 1 existing session(s) for plan VM.
Create a new session or choose an existing one?
(表⽰对 VM 重新进⾏测试)
Create a new session [0]
(表⽰从上次中断的地⽅开始继续进⾏测试)
Choose a session [1]
(输⼊ 1,从上次中断处继续进⾏测试)
(VM 如果重新测试过两次及以上,会出现下⾯的信息,session 值越⼩,表⽰上次测试时间离⽬前时间越远)
Please choose a session from the existed session(s):
1 [0]
7 [1]
(从最早⼀次开始进⾏测试)
resume test plan VM (session id = 1)
==============================================================
Test package: vm-tests
dot.junit.opcodes.add_float_2addr.JUnit_Test_add_float_(pass)
........................(略)
测试中存在着很多意想不到的情况,会导致 cts 测试中断,可见 cts 功能做得很贴⼼。上⾯这点⼀定要知道,因为它⾮常重要。
2)测试时注意事项:
如果测试中出现板⼦跑死了,需要重新开始测试,只需要把板⼦重新启动,千万不要通过 Ctrl+C 的⽅式把正在运⾏的 cts 中断掉,因为在享受(Ctrl+C)带来快感的
同时,很有可能会导致测试结果毁于⼀旦。这⼀点⾮常重要,我在测试 VM 的时候,就多次遇到这种问题,导致测试进度缓慢,⼀天也没有把 VM 测试完。
(注:这⼀点也并不是每次必现的,在测试 Java 部分的时候,⼀次失败都没有遇到 ,但在测试 VM 的时候却多次出现,搞的我真的很郁闷,看来,以后只能多攒点 RP 了 。
通过(Ctrl+C)中断测试真的很爽,如果测试进度要求很紧的话,还是不⽤为妙,按板⼦的 reset 键,对于 cts 测试来说,更迅速点,可以⼀键搞定问题。)
4. 修改 CTS 测试结果(仅限特殊情况下使⽤)
CTS 测试完成,会⽣成测试报告,存放在下⾯路径下:
/work/android_src/out/host/linux-x86/cts/android-cts/repository/results
(/work/android_src 是本⼈电脑上 android 源代码的存放路径)
以⼀个 CTS 测试结果为例,⽣成的⽬录结构如下:
├── 2010.10.19_10.39.00
│ ├── cts_result.css
│ ├── cts_result.xsl
│ ├── logo.gif
│ ├── newrule-green.png
│ └── l
├── 2010.10.19_10.39.00.zip
CTS 测试结果会⽣成⼀个按照测试时间命名的 2010.10.19_10.39.00.zip .zip 压缩包,和⼀个同名的⽂件夹。可以进⼊测试结果⽂件夹中⽤浏览器打开 l ⽂件,就可以看到 CTS 的测试结果。(注意,测试结果中的 5 个⽂件⼀个都不能少,不然⽤浏览器打不开。)
CTS 默认情况测试时会把所有的测试选项全部测试⼀遍,但有时,有些功能由于板⼦不⽀持,不需要进⾏测试,就可以通过下⾯介绍的⽅法修改 cts 的测试结果。千
万不要为了有个好看的测试结果⽽使⽤ ! 以下⾯这个测试结果为例,介绍下如何把测试结果修改为“notExecuted”。修改之前,⼀定要记得把需要修改的测试结果备份⼀下,以防意外。
4.1 把测试结果中的“pass”修改为“notExecuted”
⽤ gedit 打开 l ⽂件,通过“Ctrl+F”键查到需要修改的测试选项testGetDefault,查结果如下图所⽰。
修改⽅法:
把 result="pass"修改为 result="notExecuted"即可。
4.2 把测试结果中的“fail”修改为“notExecuted”
通过查,fail 的结果如下图所⽰。从测试结果可以看到<StackTrace>之间的内容为测试失败的堆栈调⽤顺序,这对于定位故障有很好的参考作⽤。
修改⽅法:
1)把测试结果中的 result="pass"修改为 result="notExecuted"。
2)删除<FailedScene messag 开始到</FailedScene>的所有内容。
修改后的结果如下:
4.3 修改测试结果的 Summary
⽤浏览器打开的测试报告,最上⾯会有个 TestSummary ⼀栏,修改了测试报告结果之后,还需要把 Tests Passed、Tests Failed、Tests Timed out、Tests Not Executed 值修改正确,也就是简单的算术加减法,同样在 l ⽂件中修改。
下⾯是修改之前的 Test Summary。
要把它修改为下⾯的结果。
修改⽅法:
查“Summary”,到测试结果。把修改上⾯的内容即可,修改结果如下:
4.4 检验修改是否正确
⽤浏览器打开 l ⽂件,如果浏览器打开时有报错,说明有的地⽅修改不正确了,可以根据错误提⽰修改过来。
5. 测试单个测试包或⽤例
CTS 允许测试单个 package 或 test,这对于重新测试那些没有通过的项⽬省下了很多时间。以下⾯的测试结果为例,介绍下测试命令。
5.1 测试单个 packet
上图中 testSendMessages 测试项没有通过,可以把它所在的 s.SmsManagerTest 重新测试⼀下。测试命令如下。
cts_host > start --plan Java -s.SmsManagerTest
(注:--plan 表⽰这个 Packet 所在的测试计划,-p 表⽰所要测试的 packet)
5.2 测试单个 test
如果觉得测试 packet 测试项⽬太多,也可以对单个测试失败的 testSendMessages 进⾏测试。测试命令如下。
cts_host > start --plan Java -s.SmsManagerTest#testSendMessages
(注:--plan 表⽰ test 所在的测试计划,-t 表⽰具体的 s.SmsManagerTest#testSendMessages 是由两部分组成,测试的packet 和测试的 test,他们通过#分割开。)
不管是 packet 测试还是 test 测试,⼀定要建⽴⼀个新的 session,因为新 session中的测试项⽬都是“NotExecuted”,不然由于之前存在的 session 中的测试包或测试项⽬可能已经测试过,CTS 就不会再重新进⾏测试。
6. 总结
Android 希望建⽴⼀个开放性的平台,可以让开发者在这个平台上⾯开发出具有创新性的移动应⽤软件,
为了保证这些软件可以运⾏在各种终端设备上,Android 兼容性项⽬定义了 Android 平台的各种技术细节,并提供了测试⼯具 CTS。CTS 具有多达 2 万多个的测试⽤例,可以测试 Android 的各个⽅⾯。因此,如果⼀款应⽤软件可以通过 CTS 测试,说明它具有相当好的兼容性,按照 Android 官⽅的说法,这款软件就可以在 Android market 上发布了。希望⼤家都能够⽤好这款测试⼯具。
cts_host > start --plan Performance
start test plan Performance
==============================================================
Test package: android.performance2
s.(timeout)
==============================================================
CTS_INFO >>> Max ADB operations reached.
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance3
s.(pass)
CTS_INFO >>> Max ADB operations reached.
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance4
s.(pass)
CTS_INFO >>> Max ADB operations reached.
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
Test package: android.performance5
s.(fail)
Unable to find instrumentation target package: com.android.alarmclock
CTS_INFO >>> Max ADB operations reached.
CTS_INFO >>> Restarting device ...
CTS_INFO >>> Restart complete.
==============================================================
session下载Test package: android.performance
s.(fail)
at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1404)
at android.StartActivity(Instrumentation.java:1378)
at android.app.ContextImpl.startActivity(ContextImpl.java:622)
at s.MultiAppStartupTest.launchActivity(MultiAppStartupTest.java:52)
(部分略去)
Test summary: pass=2 fail=2 timeOut=1 notExecuted=0 Total=5
Time: 599.253s
2)CTS测试步骤
前⾔:CTS2.3测试⽅法⼏乎和CTS2.2相同,只有平台准备⼯作有差别。⽬前CTS2.3最新版本是r9,可以从android官⽹上下载。
第⼀:平台准备⼯作
第⼆:新建CTS测试任务
第三:继续以前未完成的CTS测试任务
第四:关于CTS测试报告
第五:逐个对Fail的测试项进⾏测试
第六:批量测试Fail和Timeout case
第七:注意事项
第⼀部分:平台准备⼯作
1.进⼊settings->Privacy->Factorydata reset,对平台进⾏reset⼀次(如果是⾃⼰的设备,就不要reset了,否则蛋疼……)
2.平台安装CtsDelegatingAccessibilityService.apk、CtsDeviceAdmin.apk 和 CtsPerformanceTestCases.apk。 (这3个apk都可以在cts测试包 repository/testcases ⽂件夹中到)
3.进⼊settings->Wireless& networks,连接AP (AP需要连外⽹,最好链接VPN),打开Bluetooth、GPS(如果有的话)
4.进⼊settings->display->screentimeout,设为never timeout,如果没有这个选项,则设为30 minutes
5.进⼊settings->display,勾选auto-rotatescreen
6.进⼊Settings -> Location & security -> Select device administrators,勾选所有选项(s.*)
7.进⼊settings->applications, 不要勾选Unknown sources选项
8.进⼊settings->applications->development,勾选USBdebugging, stay awake和allow mock locations三项
9.进⼊settings->accessibility,勾选accessibility和CtsDelegatingAccessibilityService两项
10.进⼊settings->language& keyboard->select lanuage,设为English(United States)
11.平台插⼊⼀张TF卡(最好是空卡)
12.平台接电源(⼿机⼀般通过USB充电,没有外接电源。Pad有外接电源)
第⼆部分:新建CTS测试任务(每次输⼊后加回车)
1.平台⽤USB线连接LinuxPC(连通后平台左上⽅会显⽰usb和debug icon)
2.打开终端
3.输⼊sudosu -
输⼊root密码
4.输⼊cd ../..
输⼊ cd/home/linux/cts/android-cts-2.3_r9-x86/android-cts/tools (这个路径只是例⼦,各位需要输⼊实际路径)
输⼊ ./startcts
终端显⽰ Android CTS version 2.3_r9
Device(HT9CVP823190) connected (如果没有这⾏,说明设备没有和PC联通)
cts_host >
5.输⼊start --plan CTS
终端显⽰ There are 2 existing session(s) for plan CTS.
Create a new session or choose anexisting one?
Create a new session [0] (建⽴⼀个新测试任务)
Choose a session [1] (选择以前没有完成的测试任务)
6.输⼊数字 "0",开始CTS测试
第三部分:继续以前未完成的CTS测试任务(每次输⼊后加回车)
1.平台⽤USB线连接LinuxPC(连通后平台左上⽅会显⽰usb和debug icon)
2.打开终端
3.输⼊sudosu -
输⼊root密码
4.输⼊cd ../..
输⼊ cd/home/linux/cts/android-cts-2.3_r9-x86/android-cts/tools
输⼊ ./startcts
终端显⽰ Android CTS version 2.3_r9 Device(HT9CVP823190) connected (如果没有这⾏,说明设备没有和PC联通)
cts_host >
5.输⼊ls -r
终端显⽰
List of all results:
Session Test result Pass Fail Timeout Omitted NotExecuted Start time End time Test plan name
1 851 10 0 0 12713 2011.05.17 16:24:06 2011.05.17 16:23:49 CTS
3 858
4 47 1 0 4942 2011.05.19 15:03:2
5 2011.05.19 15:03:08 CTS
(根据start time和Endtime时间,确定你要的任务的session编号)
6.输⼊start --plan CTS
终端显⽰ There are 2 existing session(s) for plan CTS.
Create a new session or choose anexisting one?
Create a new session [0] (建⽴⼀个新测试任务)
Choose a session [1] (选择以前没有完成的测试任务)
7.输⼊数字 "1"
终端显⽰ Please choose a session from the existedsession(s):
1 [0]
3 [1]
(左边的数字是session的编号,右边⽅括号内的数字是session对应的选择⽤的数字)
8.例如,我们选择session 3
输⼊数字 "1"
终端显⽰ resume test plan CTS(session id = 3)
==============================================================
…
…
(此时CTS程序开始测试session3未完成的测试)
第四部分:关于CTS测试报告
1.CTS测试报告是⾃动⽣成⼀个xml报表,并⾃动填写的,不需要测试⼈员⼲预
2.当⼀个CTS测试任务开始时,会在android-cts-2.3_r9-x86/android-cts/repository/results中,为这个任务建⽴⼀个存放测试报告的⽂件夹和压缩包,⽂件名以任务开始的⽇期和时间命名。
例如:2011.05.12_13.00.03,2011.05.12_13.00.03.zip
3.CTS测试任务完成后,打开这个⽂件夹中的l(⽤firefox或IE浏览器打开),查看报表是否完全。
4.确认报表后,将整个⽂件夹复制出来,然后压缩后发给相关⼈员
第五部分:逐个对Fail的测试项进⾏测试(根据经验,有些Fail case测试第⼆遍会Pass)
1.前提条件是要保留之前的CTS测试报告⽂件夹,如果没有则⽆法重新测试
2.平台⽤USB线连接LinuxPC (连通后平台左上⽅会显⽰usb和debugicon)
3.打开终端
4.输⼊sudosu -
输⼊root密码
5.输⼊cd ../..
输⼊ cd/home/linux/cts/android-cts-2.3_r9-x86/android-cts/tools
输⼊ ./startcts
终端显⽰ Android CTS version 2.3_r9
Device(HT9CVP823190) connected (如果没有这⾏,说明设备没有和PC联通)
cts_host >
6.输⼊ls -r
终端显⽰
List of all results:
Session Test result Pass Fail Timeout Omitted NotExecuted Start time End time Test plan name
1 851 10 0 0 12713 2011.05.17 16:24:06 2011.05.17 16:23:49 CTS
3 858
4 47 1 0 4942 2011.05.19 15:03:2
5 2011.05.19 15:03:08 CTS
(根据start time和Endtime时间,确定你要的任务的session编号)
7.输⼊ls-r fail -s # (#表⽰ session编号,列出这个session中fail的项⽬)
终端显⽰ Result of session 3
Result Case name
==============================================================
fail s.AccessibilityEndToEndTest#testTypeViewSelectedAccessibilityEvent
fail s.AccessibilityEndToEndTest#testTypeViewClickedAccessibilityEvent
fail s.AccessibilityEndToEndTest#testTypeViewLongClickedAccessibilityEvent
……
8.start --plan CTS -t XXXX#YYYY(XXXX#YYYY是指 Casename)
例如: start --plan CTS -s.AccessibilityEndToEndTest#testTypeViewSelectedAccessibilityEvent
终端显⽰ Please choose a session from the existedsession(s):
1 [0]
3 [1]
9.输⼊数字"1",开始测试这个项⽬
10.测试完成后,可以接着测试下⼀项,直到全部完成。CTS会⾃动在测试报表中,将新的测试结果替换以前的测试结果。
第六部分:批量测试Fail和Timeout case (警告:这操作是为了⽅便测试,决不能⽤此⽅法篡改测试结果去欺骗他⼈)
说明:有时测试后产⽣上百个甚⾄更多的Fail和Timeout case,⼀个个测试需要很多时间,⽽且Timeout case⽆法⽤第五部分的⽅法测试。但是,CTS会⾃动测试未测试的Case,就是"notExecuted case"。我们可以利⽤这⼀点,将测试结果中的Fail和Timeout case的状态改成"notExecuted",启动CTS选择"Choose a session",⾃动批量测试这些Case。
1.这个操作会修改测试报告的数据,所以之前⼀定要备份之前的CTS测试报告⽂件夹
2.打开终端(⽤⿏标在窗⼝操作更⽅便)
3.进⼊home/linux/cts/android-cts-2.3_r9-x86/android-cts/repositoy/results。在results⽂件夹内,按测试时间到你要的测试结果⽂件夹,负责到桌⾯
4.在桌⾯进⼊这个⽂件夹,右击l,选择open with-> text editor,以⽂本⽅式打开⽂件
5. 在打开后的l⽂本⽂件中,点击search->replace,寻所有的 "result="timeout" 和 "result="fail" 位置,并替换成 result="notExecuted"
例如:修改前
<TestCase name="ExpandableListActivityTest" priority="">
<Test endtime="Thu Jan 01 08:00:00 CST 1970" name="testSelect" "result="fail" starttime="Thu Jan 01 08:00:00 CST 1970"/>
<Test endtime="Thu Jan 01 08:00:00 CST 1970" name="testView" "result="timeout" starttime="Thu Jan 01 08:00:00 CST 1970"/>
修改后
<TestCase name="ExpandableListActivityTest" priority="">
<Test endtime="Thu Jan 01 08:00:00 CST 1970" name="testSelect" result="notExecuted" starttime="Thu Jan 01 08:00:00 CST 1970"/>
<Test endtime="Thu Jan 01 08:00:00 CST 1970" name="testView" result="notExecuted" starttime="Thu Jan 01 08:00:00 CST 1970"/>
修改后先保存结果。如果对修改结果有怀疑,可以不保存并退出,再次打开修改。
6.修改Case状态后,还要修改测试报告的统计数据
<Summary failed="0" notExecuted="2" pass="13702" timeout="0"/>
将failed和timeout归零,notExeuted数据等于修改过的fail和timeout总数
修改后先保存结果。
7.将修改后的"l"连同另外4个⽂件替换掉android-cts-2.3_r9-x86/android-cts/repositoy/results中的⽂件。另外,原/repositoy/results⽂件夹和⽂件都有权限设置,所以在替换⽂件前,打开终端登录root帐号,⽤chmod命令修改权限。(具体操作在此不再描述)
8.打开终端
9.输⼊sudo su -
输⼊root密码
10.输⼊cd ../..
输⼊ cd/home/linux/cts/android-cts-2.3_r9-x86/android-cts/tools
输⼊ ./startcts
终端显⽰ Android CTS version 2.3_r9 Device(HT9CVP823190) connected (如果没有这⾏,说明设备没有和PC联通)
cts_host >
11.输⼊ls -r
终端显⽰
List of all results:
Session Test result Pass Fail Timeout Omitted NotExecuted Start time End time Test plan name
1 851 10 0 0 12713 2011.05.17 16:24:06 2011.05.17 16:23:49 CTS
3 858
4 47 1 0 4942 2011.05.19 15:03:2
5 2011.05.19 15:03:08 CTS
(根据start time和Endtime时间,确定你要的任务的session编号)
12.输⼊start --plan CTS
终端显⽰ There are 2 existing session(s) for plan CTS.
Create a new session or choose anexisting one?
Create a new session [0] (建⽴⼀个新测试任务)
Choose a session [1] (选择以前没有完成的测试任务)
13.输⼊数字 "1"
终端显⽰ Please choose a session from the existedsession(s):
1 [0]
3 [1]
(左边的数字是session的编号,右边⽅括号内的数字是session对应的选择⽤的数字)
14.例如,我们选择session 3
输⼊数字 "1"
终端显⽰ resume test plan CTS(session id = 3)
==============================================================
……
(此时CTS程序开始测试session3 notExecuted的Case)
第七部分:注意事项:
1.CTS要求测试平台的硬件和Android内置APK功能完好
2.CTS每次执⾏start –plan CTS时,CTS会搜索android-cts-2.2_r4-x86/android-cts/repository/results中的历史报表⽂件夹。如果⽂件有很多,启动速度会⾮常慢。所以,请定期清理results⽂件夹中的历史报表(直接删除报表⽂件夹即可)
关于CTS中s.DebuggableTest# testNoDebuggable Fail
这个⼀般只是出错的应⽤的l中有个字段值不对。
Android:debuggable
Whether or not the application can be debugged, even when running on a device in user mode — "true" if it can be, and "false" if not. The default value is "false".
Fail的⼀些修改:
1、直接设置问题
estUnknownSourcesOffByDefault
fail
junit.framework.AssertionFailedError: Deviceshould not ship with 'Unknown Sources' enabled pected:<0> butwas:<1>
s.stUnknownSourcesOffByDefault(Settings_SecureTest.java:183)
这种fail最好解决,直接按照字⾯理解就OK,UnKnownSource没有点掉。
2、permission
-- testSensorFeatures
fail
junit.framework.AssertionFailedError:PackageManager#hasSystemFeature(android.hardware.sensor.accelerometer)returns true but
SensorManager#getSensorList(1) shows sensors []expected:<true> butwas:<false>
s.SystemFeaturesTest.assertFeatureForSensor(SystemFeaturesTest.java:300)
⼀般情况修改 - > frameworks/base/data/etc/*.xml ⽂件,例如
android.l等⽂件,这边的⽂件定义了设备具有的⼀些权限。
3、由测试⽽引起的⾮测试项出错
-- testRecordingHint
fail
java.lang.RuntimeException: start failed. dia.MediaRecorder.start(Native Method)
这种情况要根据Logcat去查看RuntimeException的具体错误。通常可以先不改,因为很难查错。
4、⽹络问题
-- test_isReachable
fail
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论