创建图像文件时出现错误(只读文件系统)

4

首先,这不是重复问题,我已经尝试过其他类似线程的解决方案,但看起来这种情况有所不同。

在我的情况下,我可以成功地安装和运行来自同一模拟器的其他 Android 项目(也尝试了 x86 和 arm),但是此特定应用程序项目在安装时会抛出以下错误,从 shell 中内部手动执行"adb install"也不起作用。

下面是日志中的一个错误(第232行) https://android.googlesource.com/platform/system/vold/+/froyo/Loop.cpp

然而,我不知道 "没有内容提供者..." 的错误是否与相同的错误堆栈相关。

如果它有写入权限错误(如 sdcard 或文件系统权限),那么其他应用程序也不应该安装!

这个有问题的应用程序是一个具有自定义内容提供者的 NDK 项目,我尝试省略内容提供者,但无济于事。似乎内容提供者错误与操作系统中的 APK 安装真正有关,而不是应用程序内部的内容提供者。

我已经厌倦了使用真实设备进行测试,我担心这会降低我的手机寿命,因为我不得不经常这样做。

--------- beginning of /dev/log/main
D/AndroidRuntime( 1977): 
D/AndroidRuntime( 1977): >>>>>> AndroidRuntime START com.android.internal.os.RuntimeInit <<<<<<
W/linker  ( 1977): libdvm.so has text relocations. This is wasting memory and is a security risk. Please fix.
D/AndroidRuntime( 1977): CheckJNI is ON
D/dalvikvm( 1977): Trying to load lib libjavacore.so 0x0
D/dalvikvm( 1977): Added shared lib libjavacore.so 0x0
D/dalvikvm( 1977): Trying to load lib libnativehelper.so 0x0
D/dalvikvm( 1977): Added shared lib libnativehelper.so 0x0
D/dalvikvm( 1977): No JNI_OnLoad found in libnativehelper.so 0x0, skipping init
D/dalvikvm( 1977): Note: class Landroid/app/ActivityManagerNative; has 179 unimplemented (abstract) methods
E/memtrack( 1977): Couldn't load memtrack module (No such file or directory)
E/android.os.Debug( 1977): failed to load memtrack module: -2
D/AndroidRuntime( 1977): Calling main entry com.android.commands.pm.Pm
E/PackageHelper( 1680): Failed to create secure container smdl2tmp1
--------- beginning of /dev/log/system
W/ActivityManager( 1149): No content provider found for permission revoke: file:///data/local/tmp/myapp.apk
E/Vold    (  932): Error creating imagefile (Read-only file system)
E/Vold    (  932): ASEC image file creation failed (Read-only file system)
W/Vold    (  932): Returning OperationFailed - no handler for errno 30
E/DefContainer( 1680): Failed to create container smdl2tmp1
W/ActivityManager( 1149): No content provider found for permission revoke: file:///data/local/tmp/myapp.apk
D/dalvikvm( 1149): GC_EXPLICIT freed 161K, 22% free 5442K/6948K, paused 1ms+1ms, total 8ms
D/AndroidRuntime( 1977): Shutting down VM
3个回答

6
问题可能来自以下两种情况之一:
  • Android AOSP存在漏洞或您使用的ROM存在故障(配置不正确)
  • 某些原因导致安装在SD卡上的应用程序存储分区(或模拟的内部卡)变成只读
“为了平台安全目的,SD卡上的应用程序存储在加密容器中,这样其他应用程序就不能修改或破坏它们。当挂载SD卡时,这些容器被挂载,以便可以像存储在内部存储器中的应用程序一样访问它们。”
在您的堆栈跟踪中,问题是这样的:
"E/Vold ( 932): Error creating imagefile (Read-only file system) E/Vold ( 932): ASEC image file creation failed (Read-only file system)"
我曾经遇到过一个类似的问题,该应用程序在其AndroidManifest.xml文件中定义了“android:installLocation = preferExternal”,并且以下内容适用于我(彼此独立完成):
I/qtaguid ( 6299): Failed write_ctrl(u 40) res=-1 errno=22
I/qtaguid ( 6299): Untagging socket 40 failed errno=-22
W/NetworkManagementSocketTagger( 6299): untagSocket(40) failed with errno -22
D/Finsky  ( 6299): [1] 2.onResponse: Verification id=29 response=0
D/Finsky  ( 6299): [1] PackageVerificationReceiver.onReceive: Verification requested, id = 29
E/Vold    (  127): Error creating imagefile (Read-only file system)
E/Vold    (  127): ASEC image file creation failed (Read-only file system)
W/Vold    (  127): Returning OperationFailed - no handler for errno 30
E/PackageHelper( 6280): Failed to create secure container smdl733025106.tmp
W/DefContainer( 6280): Failed to copy package at /storage/emulated/0/myapp.apk
W/DefContainer( 6280): java.io.IOException: Failed to create container smdl733025106.tmp
W/DefContainer( 6280):  at com.android.defcontainer.DefaultContainerService.copyPackageToContainerInner(DefaultContainerService.java:327)
W/DefContainer( 6280):  at com.android.defcontainer.DefaultContainerService.access$000(DefaultContainerService.java:67)
W/DefContainer( 6280):  at com.android.defcontainer.DefaultContainerService$1.copyPackageToContainer(DefaultContainerService.java:108)
W/DefContainer( 6280):  at com.android.internal.app.IMediaContainerService$Stub.onTransact(IMediaContainerService.java:60)
W/DefContainer( 6280):  at android.os.Binder.execTransact(Binder.java:446)

2
在我的情况中,我正在使用Android 6版本的设备进行Unity开发。
当我直接从Unity编辑器安装应用程序时,我也遇到了相同的错误,但如果我将应用程序作为Beta版本上传到Android Game Play Developer控制台,并从那里下载和安装它,则不会出现此问题。在这种情况下,Android会进行必要的加密并成功安装应用程序。
我解决这个问题的方法是在以下位置设置:android build -> Player Settings -> Install location -> 设置为Force Internal。

1

除了@Mnemoinc的回答之外:

  • 如果您想强制安装到“内部存储器”

    adb root
    adb shell
    pm install -f /sdcard/myapp.apk

在使用Cyanogenmod并且有安全存储时,这可能非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接