Android connectedAndroidTest fails with com.android.ddmlib.InstallException: Unknown failure (Error: failed to write;(No such file or directory))
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 内部的连接测试之一,它 运行s。但是,我需要命令行进行自动化测试,作为我们夜间构建和发布过程的一部分。
这是失败的输出:
> 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
Gradle版本:
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 硬盘)- 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
值得注意的是,不仅我的笔记本电脑遇到了这个问题,我们的构建系统也遇到了问题(Jenkins 在 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)
我刚刚注意到 am get-config
似乎在 之前 pm install
失败了。但是,如果我 运行 在命令行上,它会成功:
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
命令中正确转义 $
。有人知道这些 $ 的来源或如何摆脱它们吗?
可能没有足够的 space 来上传包:Error: failed to write; /data/local/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"
}
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 客户端。当然,在我们同时构建 Server/Client/Android 个应用程序时共享代码和版本信息很有用。因此,版本信息来自旧的(传统的)Server/Client 项目(与 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 连接测试工作正常。现在无论连接到物理设备还是虚拟机,我都会收到相同的错误。
在这两种情况下,adb devices
表明 ADB 已连接。
我运行正在使用以下命令行:
./gradlew --rerun-tasks connectedAndroidTest
如果我 运行 来自 Android Studio 内部的连接测试之一,它 运行s。但是,我需要命令行进行自动化测试,作为我们夜间构建和发布过程的一部分。
这是失败的输出:
> 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
Gradle版本:
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 硬盘)- 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
值得注意的是,不仅我的笔记本电脑遇到了这个问题,我们的构建系统也遇到了问题(Jenkins 在 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)
我刚刚注意到 am get-config
似乎在 之前 pm install
失败了。但是,如果我 运行 在命令行上,它会成功:
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
命令中正确转义 $
。有人知道这些 $ 的来源或如何摆脱它们吗?
可能没有足够的 space 来上传包:Error: failed to write; /data/local/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"
}
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 客户端。当然,在我们同时构建 Server/Client/Android 个应用程序时共享代码和版本信息很有用。因此,版本信息来自旧的(传统的)Server/Client 项目(与 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