簡體   English   中英

Android已連接AndroidTest失敗,並出現com.android.ddmlib.InstallException:未知失敗(錯誤:寫入失敗;(沒有此類文件或目錄))

[英]Android connectedAndroidTest fails with com.android.ddmlib.InstallException: Unknown failure (Error: failed to write;(No such file or directory))

直到幾周前,我的Android連接測試仍能正常工作。 現在,無論連接到物理設備還是虛擬機,我都會收到相同的錯誤。

在這兩種情況下, adb devices顯示已連接ADB。

我正在運行以下命令行:

./gradlew --rerun-tasks 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)-Android 7.0
  • Virtual Box VM(2 CPU,2 Gigs Ram-8 Gigs Hard Drive)-Android 7.1(來自http://www.android-x86.org/

更新2

馬丁·齊特勒(Martin Zeitler)建議嘗試使用adb push,看看會發生什么。 奇怪的是,它成功了:

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)

我也可以使用adb shell訪問目錄:

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下的詹金斯與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)

我只是注意到,在pm install 之前am get-config似乎已失敗。 但是,如果我在命令行上運行該命令,它將成功:

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命令中正確地轉義$ 任何人都有這些$的來源或如何擺脫它們的想法嗎?

可能沒有足夠的空間來上載該軟件包: Error: failed to write; /data/local/tmp/... Error: failed to write; /data/local/tmp/...

根據錯誤消息,尚不清楚目錄或程序包是否不存在。

當它僅存在於本地文件系統中,而不存在於目標設備文件系統中時,它幾乎是無用的,該錯誤消息所指向的位置(您仍然可以嘗試使用adb push來查看它抱怨的內容)。

確保adb在路徑上均勻,因為從理論上講這可能是另一個可能的原因。

因此,事實證明,各種各樣的問題正在共同努力,使這一點很難弄清楚。

首先,安裝正在使用pm並失敗,因為正在生成的APK中包含$。 這僅是一個問題,因為Gradle / Android / Someone不夠聰明,無法在pm命令中正確地將它們轉出(不用擔心,上傳到設備的工作正常)。

那么,美元從何而來? 好吧,原來它們是defaultName的versionName的占位符。 這是來自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"
    }

versionString的值在頂級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()
versionString = { major + "." + minor + "." + patch + "-" + revnum };

versionString是使用惰性屬性評估( https://reflectoring.io/gradle-lazy-property-evaluation/ )生成的。

我們為什么要這樣做? 好吧,事實證明,這個項目通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM