Android connectedAndroidTest与com.Android.ddmlib.InstallException一起失败:未知失败(错误:写入失败;(没有此类文件或目录))

Android connectedAndroidTest与com.Android.ddmlib.InstallException一起失败:未知失败(错误:写入失败;(没有此类文件或目录)),android,android-testing,Android,Android Testing,直到几周前,我的Android连接测试仍然正常工作。现在,无论连接到物理设备还是虚拟机,我都会收到相同的错误 在这两种情况下,adb设备显示adb已连接 我正在运行以下命令行: /gradlew--重新运行任务connectedAndroidTest 如果我在Android Studio内部运行一个连接测试,它就会运行。然而,我需要用于自动化测试的命令行,作为我们夜间构建和发布过程的一部分 以下是失败的输出: > Task :app:connectedDebugAndroidTest 0

直到几周前,我的Android连接测试仍然正常工作。现在,无论连接到物理设备还是虚拟机,我都会收到相同的错误

在这两种情况下,
adb设备
显示adb已连接

我正在运行以下命令行:

/gradlew--重新运行任务connectedAndroidTest

如果我在Android Studio内部运行一个连接测试,它就会运行。然而,我需要用于自动化测试的命令行,作为我们夜间构建和发布过程的一部分

以下是失败的输出:

> Task :app:connectedDebugAndroidTest 
03:55:08 V/ddms: execute: running am get-config
03:55:09 V/ddms: execute 'am get-config' on '52007ba3c0fcb457' : EOF hit. Read: -1
03:55:09 V/ddms: execute: returning

03:55:10 V/ddms: execute: running pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@658c9f0e-debug.apk"
03:55:11 V/ddms: execute 'pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@658c9f0e-debug.apk"' on '52007ba3c0fcb457' : EOF hit. Read: -1
03:55:11 V/ddms: execute: returning
Unable to install /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@658c9f0e-debug.apk
com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@658c9f0e-debug.apk (No such file or directory))
        at com.android.ddmlib.Device.installRemotePackage(Device.java:1031)
        at com.android.ddmlib.Device.installPackage(Device.java:902)
        at com.android.ddmlib.Device.installPackage(Device.java:880)
        at com.android.ddmlib.Device.installPackage(Device.java:869)
        at com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:126)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:147)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:59)
        at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)

com.android.builder.testing.ConnectedDevice > runTests[SM-T580 - 7.0] FAILED 
        com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@658c9f0e-debug.apk (No such file or directory))
                at com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:132)
03:55:11 I/XmlResultReporter: XML test result file generated at /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/androidTest-results/connected/TEST-SM-T580 - 7.0-app-.xml. Total tests 1, failure 1, 

> Task :app:connectedDebugAndroidTest FAILED
[no message defined]
java.lang.RuntimeException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@658c9f0e-debug.apk (No such file or directory))
        at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1431)
        at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
        at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
        at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
        at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Caused by: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@658c9f0e-debug.apk (No such file or directory))
        at com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:132)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:147)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:59)
        at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
        ... 4 more
Caused by: com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@658c9f0e-debug.apk (No such file or directory))
        at com.android.ddmlib.Device.installRemotePackage(Device.java:1031)
        at com.android.ddmlib.Device.installPackage(Device.java:902)
        at com.android.ddmlib.Device.installPackage(Device.java:880)
        at com.android.ddmlib.Device.installPackage(Device.java:869)
        at com.android.builder.testing.ConnectedDevice.installPackage(ConnectedDevice.java:126)
        ... 7 more
它试图安装的文件实际上不存在:

ls -l /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9\$_run_closure1\$_closure5@658c9f0e-debug.apk 
-rw-rw-r-- 1 smm smm 15684152 Sep 11 15:55 '/home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@658c9f0e-debug.apk'
在这一点上,我对Gradle失败的原因感到困惑。有什么想法吗

更新1

渐变版本:

smm@smm-HP-ZBook-15-G2:~/hcs/orc.trunk.java11/tablet/android/ORConnect$ ./gradlew --version

------------------------------------------------------------
Gradle 4.6
------------------------------------------------------------

Build time:   2018-02-28 13:36:36 UTC
Revision:     8fa6ce7945b640e6168488e4417f9bb96e4ab46c

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_181 (Oracle Corporation 25.181-b13)
OS:           Linux 4.15.0-54-generic amd64
我正在尝试在这些设备上运行测试:

  • 三星Galaxy Tab A 10.1-(SM-T580)-安卓7.0
  • 虚拟机箱虚拟机(2个CPU,2千兆Ram-8千兆硬盘驱动器)-安卓7.1(来自)
更新2

Martin Zeitler建议尝试一下,看看会发生什么。奇怪的是,它成功了:

smm@smm-HP-ZBook-15-G2:~/bin$ adb push /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9\$_run_closure1\$_closure5@2542336c-debug.apk /data/local/tmp/test.apk
/home/smm/hcs/orc.trunk.java11/tablet/android/ORConne...: 1 file pushed. 17.3 MB/s (15684098 bytes in 0.864s)
smm@smm-HP-ZBook-15-G2:~/hcs/orc.trunk.java11/tablet/android/ORConnect$ adb shell am get-config
config: en-rUS-ldltr-sw800dp-w1280dp-h776dp-xlarge-notlong-notround-land-notnight-hdpi-finger-keysexposed-nokeys-navhidden-nonav-v24
abi: armeabi-v7a,armeabi
我也可以使用adb外壳访问目录:

smm@smm-HP-ZBook-15-G2:~/bin$ adb shell
gtaxlwifi:/ $ cd /data/local/tmp
gtaxlwifi:/data/local/tmp $ ls
ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@50729ffc-debug.apk 
ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@658c9f0e-debug.apk
更新3

值得注意的是,不仅是我的笔记本电脑遇到了问题,我还构建了我们的系统(Windows下的Jenkins和Windows下的我的笔记本电脑)

更新4

其他日志记录已打开:

> Task :app:installDebug 
Task ':app:installDebug' is not up-to-date because:
  Executed with '--rerun-tasks'.
02:40:41 V/ddms: execute: running am get-config
02:40:42 V/ddms: execute 'am get-config' on '52007ba3c0fcb457' : EOF hit. Read: -1
02:40:42 V/ddms: execute: returning
Installing APK 'ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk' on 'SM-T580 - 7.0' for app:debug
02:40:42 D/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk: Uploading ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk onto device '52007ba3c0fcb457'
02:40:42 D/Device: Uploading file onto device '52007ba3c0fcb457'
02:40:42 D/ddms: Reading file permision of /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk as: rw-rw-r--
02:40:43 V/ddms: execute: running pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk"
02:40:44 V/ddms: execute 'pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk"' on '52007ba3c0fcb457' : EOF hit. Read: -1
02:40:44 V/ddms: execute: returning
Unable to install /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk
com.android.ddmlib.InstallException: Unknown failure (Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@58873f75-debug.apk (No such file or directory))
        at com.android.ddmlib.Device.installRemotePackage(Device.java:1031)
        at com.android.ddmlib.Device.installPackage(Device.java:902)
        at com.android.ddmlib.Device.installPackage(Device.java:880)
        at com.android.ddmlib.Device.installPackage(Device.java:869)
在我的shell提示符下运行它会得到相同的结果:

smm@smm-HP-ZBook-15-G2:~/hcs/orc.trunk.java11/tablet/android/ORConnect$ adb shell pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@58873f75-debug.apk"
Error: failed to write; /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@58873f75-debug.apk (No such file or directory)
我刚刚注意到,
am get config
似乎在
pm安装之前失败了。但是,如果在命令行上运行,则会成功:

smm@smm-HP-ZBook-15-G2:~/bin$ adb push /home/smm/hcs/orc.trunk.java11/tablet/android/ORConnect/app/build/outputs/apk/debug/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9\$_run_closure1\$_closure5@2542336c-debug.apk /data/local/tmp/test.apk
/home/smm/hcs/orc.trunk.java11/tablet/android/ORConne...: 1 file pushed. 17.3 MB/s (15684098 bytes in 0.864s)
smm@smm-HP-ZBook-15-G2:~/hcs/orc.trunk.java11/tablet/android/ORConnect$ adb shell am get-config
config: en-rUS-ldltr-sw800dp-w1280dp-h776dp-xlarge-notlong-notround-land-notnight-hdpi-finger-keysexposed-nokeys-navhidden-nonav-v24
abi: armeabi-v7a,armeabi
更新5 我想我越来越近了。我可以从上次失败的构建中看出,它失败的原因是:

03:04:25 V/ddms: execute: running pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@c92421a-debug.apk"
03:04:26 V/ddms: execute 'pm install -r -t "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@c92421a-debug.apk"' on '52007ba3c0fcb457' : EOF hit. Read: -1
如果我使用adb shell ls/data/local/tmp/
,我可以看到文件确实存在。但是,如果我运行:

$ adb shell ls "/data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9$_run_closure1$_closure5@c92421a-debug.apk"
ls: /data/local/tmp/ORConnect-3.1.0-build_st1vdmehqb3wug0ysb60kna9@c92421a-debug.apk: No such file or directory

请注意,传递给
ls
的文件名不是
ls
声明找不到的文件名。我目前的理论是,Android并不是在
pm install
命令中正确转义
$
。有没有人知道这些$s是从哪里来的,或者如何去掉它们的?

可能没有足够的空间上载包:
错误:无法写入/数据/本地/tmp/…

从错误消息中可以看出,如果目录或包不存在,就不清楚了

它只存在于本地文件系统中,而不存在于错误消息所指的目标设备文件系统中(您仍然可以尝试
adb push
,查看它抱怨什么),这是非常无用的


确保adb在路径上,因为理论上这可能是另一个可能的原因。

因此,有各种各样的问题共同作用,使其难以解决

首先,安装正在使用pm并且失败,因为正在生成的APK中有$。这只是因为Gradle/Android/Someone不够聪明,无法在pm命令中正确地将其转义(更不用说上传到设备的操作是否正常)

那么,美元是从哪里来的呢?事实证明,它们是versionName的占位符将其命名为defaultConfig。以下是app.gradle文件中的一个片段:

android {
    compileSdkVersion 26

    defaultConfig {
        minSdkVersion 24
        //noinspection OldTargetApi
        targetSdkVersion 26
        // The versionCode and versionName are defined in the top level (android) build.gradle file.
        versionCode versionValue
        versionName versionString()
        buildConfigField "String", "BUILD_TIMESTAMP", "\""+buildTimeStamp+"\""

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
def major = rootProject.file('../../../nb/major.dat').text.trim()
def minor = rootProject.file('../../../nb/minor.dat').text.trim()
def patch = rootProject.file('../../../nb/patch.dat').text.trim()
versionString = { major + "." + minor + "." + patch + "-" + revnum };
versionString
的值在顶级渐变文件中生成:

android {
    compileSdkVersion 26

    defaultConfig {
        minSdkVersion 24
        //noinspection OldTargetApi
        targetSdkVersion 26
        // The versionCode and versionName are defined in the top level (android) build.gradle file.
        versionCode versionValue
        versionName versionString()
        buildConfigField "String", "BUILD_TIMESTAMP", "\""+buildTimeStamp+"\""

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
def major = rootProject.file('../../../nb/major.dat').text.trim()
def minor = rootProject.file('../../../nb/minor.dat').text.trim()
def patch = rootProject.file('../../../nb/patch.dat').text.trim()
versionString = { major + "." + minor + "." + patch + "-" + revnum };
versionString是使用惰性属性求值()生成的

我们为什么要这样做?事实证明,这个项目与一个更大的项目相连,有一个Java服务器和传统的Java客户机。当然,当我们同时构建服务器/客户端/Android应用程序时,共享代码和版本信息是很有用的。因此,版本信息来自较旧的(传统的)服务器/客户端项目(与Android或Gradle无关)。我们从文件中读取主要、次要、补丁和构建(SVN修订号)。不幸的是,最后一个文件是由构建传统项目的ant脚本生成的,在调用Gradle构建Android项目时可能不存在

因此,我们转而使用惰性属性评估,它解决了文件不存在时的构建问题,并创建了这个新问题。离开它解决了这个特殊的问题

现在,我的顶级Gradle构建文件如下所示:

def major = rootProject.file('../../../nb/major.dat').text.trim()
def minor = rootProject.file('../../../nb/minor.dat').text.trim()
def patch = rootProject.file('../../../nb/patch.dat').text.trim()
revnumFile = rootProject.file('../../../nb/build.dat')
// Before adding the Revision Number to our Version String, we need to make sure the file exists
def revnum = '';
if (revnumFile.exists()) {
    revnum = revnumFile.text.trim()
}
versionString = major + "." + minor + "." + patch + "-" + revnum

你能用你的设备的信息更新你的问题吗?它正在运行的android版本和你正在使用的gradle版本?@ReazMurshed information updated抱歉所有的评论。我决定把它作为更新2添加到问题中,在这里我可以格式化内容并使其清晰易读。谢谢你的主意,但似乎除了gradle命令外,其他一切都能正常工作。@StephenM,所以至少这已经被排除了。当Gradle出现问题时,请尝试运行
/gradlew--info app:installDebug
,以获得更明确的日志垃圾邮件。@StephenM因此至少可以排除这种情况。当Gradle出现问题时,请尝试运行
/gradlew--info-app:installDebug
以获取更明确的日志垃圾邮件。
connectedAndroidTest
仅在项目没有模块时才会运行;除此之外,它也是一样的,例如:
mobile:connectedAndroidTest
(始终以模块名称为前缀)。。。在Android Studio中,“Build Output”选项卡还显示了实际的任务名称。发现了我的问题。感谢您提供额外的调试选项。。。这让我走上了正确的方向。“答案”(和新问题)将很快发布。