您的位置:首页 > 移动开发 > Android开发

ubuntu下配置android自动化测试环境+Jenkins持续构建

2014-10-30 17:09 260 查看
菜鸟一枚,详细记录各种步骤。

一、安装Jenkinshttp://jenkins-ci.org/。(由于服务器已装好,略过)

二、安装android sdk、platforms、simulator images

1.下载android sdk到Ubuntu服务器。本机是mac操作系统,需远程连接到服务器,所以基本靠靠终端命令来进行。

a.连接到服务器,可用命令如:ssh root@10.0.90.61 或者是 ssh -l root 10.0.90.61 表明是用root身份登陆。回车输入pwd

b.进入相关目录下,准备下载文件, 如 cd /opt/android_test/

c.利用命令下载:wget http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz
d.解压文件夹:tar zxvf android-sdk_r23.0.2-linux.tgz,解压后的文件夹名:android-sdk-linux

e.将解压后的文件夹放到 /usr/local/下:sudo mv android-sdk-linux /usr/local/

2.安装各种东西

a.进入相关目录下: cd /usr/local/android-sdk-linux/tools

b.运行android sdk: ./android (前提是tools 文件夹里面有android这个可执行文件),我执行完这个文件后有报错,报错信息如下

<span style="font-size:12px;">Exception in thread "main" org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Display.createDisplay(Unknown Source)
at org.eclipse.swt.widgets.Display.create(Unknown Source)
at org.eclipse.swt.graphics.Device.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.<init>(Unknown Source)
at org.eclipse.swt.widgets.Display.getDefault(Unknown Source)
at org.eclipse.swt.widgets.Shell.<init>(Unknown Source)
at org.eclipse.swt.widgets.Shell.<init>(Unknown Source)
at com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2.createShell(SdkUpdaterWindowImpl2.java:168)
at com.android.sdkuilib.internal.repository.ui.SdkUpdaterWindowImpl2.open(SdkUpdaterWindowImpl2.java:137)
at com.android.sdkuilib.repository.SdkUpdaterWindow.open(SdkUpdaterWindow.java:111)
at com.android.sdkmanager.Main.showSdkManagerWindow(Main.java:412)
at com.android.sdkmanager.Main.doAction(Main.java:390)
at com.android.sdkmanager.Main.run(Main.java:150)
at com.android.sdkmanager.Main.main(Main.java:116)</span>


问题原因:该命令试图弹出一个图形界面,但是由于是ssh连接没有办法弹出,所以报错。

解决方式:相当于没解决,直接跑到机房,在服务器上重复步骤2(a), 2(b)

c.安装platforms 和 相应packages,下面的这些东西都要安装上



如果遇到报错如“Stopping ADB server failed (code -1).”,先不用管它。

如果在下载的时候一个劲地连不上,报错如下

Failed to fetch URL https://dl-ssl.google.com/android/repository/sys-img/android-tv/sys-img.xml, reason:
SSLPeerUnverified peer not authenticated

或者:Download
interrupted: Connection to http://dl-ssl.google.com refused Download
interrupted: Read timed out

各种解决方式,比如说

(1)挂代理

(2)强制转换https 到 http(tools->opinion中可以看到),

(3)添加地址到hosts. vi /etc/hosts->添加

# for android
74.125.237.1 dl-ssl.google.com
然后保存。
貌似前两个效果都不是很好,但是别别扭扭用了我好两三天的时间终于下下来了

d.添加环境变量

(1) vi
environment

(2) 在PATH= “”里面添加:/usr/local/android-sdk-linux

三、安装Jenkins插件:android simulator plugin

1.访问页面 服务器地址:8080 如10.0.90.61:8080 打开Jenkins

2.系统管理->管理插件->搜索android simulator plugin,勾选,然后点击直接安装,进入安装界面,等待安装完成



红色的报错,我没有理它,安装完成就好了。

四、Jenkins设置,新建job

1.Jenkins系统设置

a.系统管理->系统设置->Android 设置sdk root,但是这里我遇到一个问题,如图



问题原因:据广大网友说 是因为Jenkins用户没有访问root的权限,所以有这个报错

解决方式:更改文件属主为Jenkins用户:

<span style="font-size:12px;">chown -R jenkins:jenkins /usr/local/android-sdk-linux</span>


2.新建job(前提,安装git,ant,jdk)

a.新建一个自由风格的job

b.源码管理->git->贴入代码下载地址。保存,并立即构建。这一步的作用是讲android project抓下来,代码地址:~/jobs/android_build/workspace

c.执行ant clean debug,报错如下:

(1)
Buildfile: /var/lib/jenkins/jobs/android_build/workspace/build.xml

BUILD FAILED
/var/lib/jenkins/jobs/android_build/workspace/build.xml:90: Cannot find /usr/local/android-sdk/tools/ant/build.xml imported from /var/lib/jenkins/jobs/android_build/workspace/build.xml


问题原因:没有生成build.xml在/usr/local/android-sdk/tools/ant/build.xml

解决方法:cd到/usr/local/android-sdk/tools下面,build一个文件

(2)执行 ./android
update project -p ~/jobs/android_build/workspace,报错如下:

Error: The project either has no target set or the target is invalid.
Please provide a --target to the 'android update' command.
It seems that there are sub-projects. If you want to update them
please use the --subprojects parameter.


问题原因:没有指定target

解决方法:执行 ./android update project -p ~/jobs/android_build/workspace -t 1 -s(-p后面是project的路径,-t后面的1指的是target id,查看机器的target
id,利用命令 android list targets;-s的意思是下面的子文件也要更新。如果还不明白,直接执行 android update project 然后看看提示,就知道那句是什么意思了)

(3)重新执行ant clean debug, 继续报错

BUILD FAILED
/usr/local/android-sdk-linux/tools/ant/build.xml:601: The following error occurred while executing this line:
/usr/local/android-sdk-linux/tools/ant/build.xml:653: The following error occurred while executing this line:
/usr/local/android-sdk-linux/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program "/usr/local/android-sdk-linux/build-tools/20.0.0/aapt" (in directory "/var/lib/jenkins/jobs/android_build/workspace/google-play-services_lib"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
at java.lang.Runtime.exec(Runtime.java:617)
at org.apache.tools.ant.taskdefs.launcher.Java13CommandLauncher.exec(Java13CommandLauncher.java:41)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:428)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:442)
at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:628)
at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:669)
at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:495)
at com.android.ant.AaptExecTask.execute(AaptExecTask.java:699)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at com.android.ant.IfElseTask.execute(IfElseTask.java:120)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:396)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.Target.performTasks(Target.java:456)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38)
at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:440)
at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:306)
at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
at com.android.ant.IfElseTask.execute(IfElseTask.java:120)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
at org.apache.tools.ant.Task.perform(Task.java:348)
at org.apache.tools.ant.Target.execute(Target.java:435)
at org.apache.tools.ant.Target.performTasks(Target.java:456)
at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1393)
at org.apache.tools.ant.Project.executeTarget(Project.java:1364)
at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
at org.apache.tools.ant.Project.executeTargets(Project.java:1248)
at org.apache.tools.ant.Main.runBuild(Main.java:851)
at org.apache.tools.ant.Main.startAnt(Main.java:235)
at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
at java.lang.ProcessImpl.start(ProcessImpl.java:130)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
... 68 more

Total time: 1 second


问题原因:据网友说是因为由于是64bit的系统,而Android sdk只有32bit的程序,需要安装ia32-libs。

(4)安装ia32-libs

root@hf61:~# sudo apt-get install ia32-libs

sudo: unable to resolve host hf61.sumilux.com

Reading package lists... Done
Building dependency tree
Reading state information... Done
<strong>Package ia32-libs is not available, but is referred to by another package.</strong>
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
lib32z1 lib32ncurses5 lib32bz2-1.0

E: Package 'ia32-libs' has no installation candidate
root@hf61:~# <strong>sudo apt-get install lib32z1</strong>
<strong>
</strong>
(5)执行ant clean debug,还是报错

<p class="p1">usr/local/android-sdk-linux/build-tools/20.0.0/aapt: <span style="color:#ff6666;">error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory</span></p>
BUILD FAILED
/usr/local/android-sdk-linux/tools/ant/build.xml:601: The following error occurred while executing this line:
/usr/local/android-sdk-linux/tools/ant/build.xml:653: The following error occurred while executing this line:
<span style="color:#ff6666;">/usr/local/android-sdk-linux/tools/ant/build.xml:698: null returned: 127</span>


标红的表示报错略有不同

(6) 安装libstdc++,执行

sudo apt-get install lib32stdc++6
截止到目前,大概build环境是准备好了,开始着手测试
3.新建一个测试job,
(1)配置好git 地址
(2)构建->execute shell,输入 “cd ${WORKSPACE}/JabzeTestTest && ant clean emma debug install test”
(3)保存,并运行,控制台报错如下:

install:
[echo] Installing /var/lib/jenkins/jobs/android_test/workspace/JabzeTestTest/bin/JabzeTest-debug.apk onto default emulator or device...
[exec] 4623 KB/s (103777 bytes in 0.021s)
[exec] 	pkg: /data/local/tmp/JabzeTest-debug.apk
[exec] Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]


[getlibpath] Ordered libraries:
[echo] Running tests...
[echo] Running tests ...
[exec] INSTRUMENTATION_STATUS: id=ActivityManagerService
[exec] INSTRUMENTATION_STATUS: Error=Permission Denial: starting instrumentation ComponentInfo{com.jabze.android.tests/com.zutubi.android.junitreport.JUnitReportTestRunner} from pid=10776, uid=10776 not allowed because package com.jabze.android.tests does not have a signature matching the target com.jabze.android
[exec] INSTRUMENTATION_STATUS_CODE: -1
[exec] java.lang.SecurityException: Permission Denial: starting instrumentation ComponentInfo{com.jabze.android.tests/com.zutubi.android.junitreport.JUnitReportTestRunner} from pid=10776, uid=10776 not allowed because package com.jabze.android.tests does not have a signature matching the target com.jabze.android


解决方式:

执行命令行

cd /usr/local/android-sdk-linux/platform-tools
adb uninstall com.jabze.android.tests
adb reinstall com.jabze.android.tests


(4)继续运行,继续报错,报错解决后,运行test成功

com.jabze.android.test.DummyTest:...
[exec] com.jabze.android.test.LoginTest:INSTRUMENTATION_RESULT: shortMsg=Process <strong>crashed</strong>.
[exec] INSTRUMENTATION_CODE: 0
[echo] Setting permission to download the coverage file...
[exec] Unable to chmod /data/data/com.jabze.android/coverage.ec: No such file or directory
[echo] Downloading coverage file into project directory...
[exec] remote object '/data/data/com.jabze.android/coverage.ec' does not exist


问题原因:一开始一直以为是权限的问题,弄了一天多,各种网上查,都没有解决。后来偶然注意到那个crash

解决方式:把导致crash的代码注释掉,ok

(5)生成报告,Jenkins配置->构建后操作->Publish JUnit test result report

Jenkins 控制台报错

Recording test results
None of the test reports contained any result
Build step 'Publish JUnit test result report' changed build result to FAILURE
原因:build.xml 里面的test target 不正确

解决方式:修改build.xml,附上test片段,以供参考

<pre name="code" class="java"><target name="test" depends="-test-project-check"
1226	                description="Runs tests from the package defined in test.package property">
1227	      <property name="test.runner" value="com.zutubi.android.junitreport.JUnitReportTestRunner" />
1228
1229	        <if condition="${project.is.test}">
1230	        <then>
1231	            <property name="tested.project.absolute.dir" location="${tested.project.dir}" />
1232
1233	            <!-- Application package of the tested project extracted from its manifest file -->
1234	            <xpath input="${tested.project.absolute.dir}/AndroidManifest.xml"
1235	                    expression="/manifest/@package" output="tested.project.app.package" />
1236
1237	            <if condition="${emma.enabled}">
1238	                <then>
1239	                    <getprojectpaths projectPath="${tested.project.absolute.dir}"
1240	                            binOut="tested.project.out.absolute.dir"
1241	                            srcOut="tested.project.source.absolute.dir" />
1242
1243	                    <getlibpath projectPath="${tested.project.absolute.dir}"
1244	                            libraryFolderPathOut="tested.project.lib.source.path"
1245	                            leaf="@{source.dir}" />
1246
1247	                </then>
1248	            </if>
1249
1250	        </then>
1251	        <else>
1252	            <!-- this is a test app, the tested package is the app's own package -->
1253	            <property name="tested.project.app.package" value="${project.app.package}" />
1254
1255	            <if condition="${emma.enabled}">
1256	                <then>
1257	                    <property name="tested.project.out.absolute.dir" value="${out.absolute.dir}" />
1258	                    <property name="tested.project.source.absolute.dir" value="${source.absolute.dir}" />
1259
1260	                    <getlibpath
1261	                            libraryFolderPathOut="tested.project.lib.source.path"
1262	                            leaf="@{source.dir}" />
1263
1264	                </then>
1265	            </if>
1266
1267	        </else>
1268	        </if>
1269
1270	        <property name="emma.dump.file"
1271	                value="/data/data/${tested.project.app.package}/coverage.ec" />
1272
1273	        <if condition="${emma.enabled}">
1274	            <then>
1275	                <echo>Running tests...</echo>
1276	                <run-tests-helper emma.enabled="true">
1277	                    <extra-instrument-args>
1278	                        <arg value="-e" />
1279	                           <arg value="coverageFile" />
1280	                           <arg value="${emma.dump.file}" />
1281	                    </extra-instrument-args>
1282	                </run-tests-helper>
1283
1284	                <echo level="info">Setting permission to download the coverage file...</echo>
1285	                <exec executable="${adb}" failonerror="true">
1286	                    <arg line="${adb.device.arg}" />
1287	                    <arg value="shell" />
1288	                    <arg value="run-as" />
1289	                    <arg value="${tested.project.app.package}" />
1290	                    <arg value="chmod" />
1291	                    <arg value="644" />
1292	                    <arg value="${emma.dump.file}" />
1293	                </exec>
1294	                <echo level="info">Downloading coverage file into project directory...</echo>
1295	                <exec executable="${adb}" failonerror="true">
1296	                    <arg line="${adb.device.arg}" />
1297	                    <arg value="pull" />
1298	                    <arg value="${emma.dump.file}" />
1299	                    <arg path="${out.absolute.dir}/coverage.ec" />
1300	                </exec>
1301
1302	                <pathconvert property="tested.project.lib.source.path.value" refid="tested.project.lib.source.path">
1303	                    <firstmatchmapper>
1304	                        <regexpmapper from='^([^ ]*)( .*)$$' to='"\1\2"'/>
1305	                        <identitymapper/>
1306	                    </firstmatchmapper>
1307	                </pathconvert>
1308
1309	                <echo level="info">Extracting coverage report...</echo>
1310	                <emma>
1311	                    <property name="report.html.out.encoding" value="UTF-8" />
1312	                    <report sourcepath="${tested.project.source.absolute.dir}:${tested.project.lib.source.path.value}"
1313	                            verbosity="${verbosity}">
1314	                        <!-- TODO: report.dir or something like should be introduced if necessary -->
1315	                        <infileset file="${out.absolute.dir}/coverage.ec" />
1316	                        <infileset file="${tested.project.out.absolute.dir}/coverage.em" />
1317	                        <!-- TODO: reports in other, indicated by user formats -->
1318	                        <html outfile="${out.absolute.dir}/coverage.html" />
1319	                        <txt outfile="${out.absolute.dir}/coverage.txt" />
1320	                        <xml outfile="${out.absolute.dir}/coverage.xml" />
1321	                   </report>
1322	                </emma>
1323	                <echo level="info">Cleaning up temporary files...</echo>
1324	                <delete file="${out.absolute.dir}/coverage.ec" />
1325	                <delete file="${tested.project.out.absolute.dir}/coverage.em" />
1326	                <exec executable="${adb}" failonerror="true">
1327	                    <arg line="${adb.device.arg}" />
1328	                    <arg value="shell" />
1329	                    <arg value="run-as" />
1330	                    <arg value="${tested.project.app.package}" />
1331	                    <arg value="rm" />
1332	                    <arg value="${emma.dump.file}" />
1333	                </exec>
1334	                <echo level="info">Saving the coverage reports in ${out.absolute.dir}</echo>
1335	            </then>
1336	            <else>
1337	                <run-tests-helper />
1338	            </else>
1339	        </if>
1340
1341	       <echo>Downloading XML test report…</echo>
1342		<mkdir dir="junitreports" />
1343		<exec executable="${adb}" failonerror="true">
1344			<arg line="${adb.device.arg}"/>
1345			<arg value="pull" />
1346	                <arg value="${emma.dump.file}/files/junit-report.xml" />
1347			<arg value="junitreports/junit-report.xml" />
1348		</exec>
1349	    </target>
</pre><pre code_snippet_id="502201" snippet_file_name="blog_20141030_16_7839643" name="code" class="java"><img src="http://img.blog.csdn.net/20141030171330074?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvYmEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="http://img.blog.csdn.net/20141030171351087?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVvYmEx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />



报错及解决方式集锦:

(一)签名问题

[echo] Running tests...
[echo] Running tests ...
[exec] INSTRUMENTATION_STATUS: id=ActivityManagerService
[exec] INSTRUMENTATION_STATUS: Error=Permission Denial: starting instrumentation ComponentInfo{com.jabze.android.tests/com.zutubi.android.junitreport.JUnitReportTestRunner} from pid=14774, uid=14774 not allowed because package com.jabze.android.tests does not have a signature matching the target com.jabze.android
[exec] INSTRUMENTATION_STATUS_CODE: -1
[exec] java.lang.SecurityException: Permission Denial: starting instrumentation ComponentInfo{com.jabze.android.tests/com.zutubi.android.junitreport.JUnitReportTestRunner} from pid=14774, uid=14774 not allowed because package com.jabze.android.tests does not have a signature matching the target com.jabze.android
[exec] 	at android.os.Parcel.readException(Parcel.java:1425)
[exec] 	at android.os.Parcel.readException(Parcel.java:1379)
[exec] 	at android.app.ActivityManagerProxy.startInstrumentation(ActivityManagerNative.java:2896)
[exec] 	at com.android.commands.am.Am.runInstrument(Am.java:675)
[exec] 	at com.android.commands.am.Am.run(Am.java:119)
[exec] 	at com.android.commands.am.Am.main(Am.java:82)
[exec] 	at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
[exec] 	at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:309)
[exec] 	at dalvik.system.NativeStart.main(Native Method)
[echo] Setting permission to download the coverage file...
[exec] Unable to chmod /data/data/com.jabze.android/coverage.ec: No such file or directory
[echo] Downloading coverage file into project directory...
[exec] remote object '/data/data/com.jabze.android/coverage.ec' does not exist


原因:曾经在别的机器上装过

解放方法:adb uninstall com.jabze.android.tests
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: