Ошибка при создании файла образа (файловая система только для чтения)

Прежде всего, это не дублирующий вопрос, и я пробовал решения из других подобных потоков, но похоже, что этот случай отличается.

В моем случае я могу успешно установить и запустить другой проект Android из одного и того же эмулятора (x86 тоже попробовал), но этот конкретный проект приложения вызывает следующую ошибку при установке также вручную "adb install" изнутри оболочки тоже не работает.

Найдена одна из ошибок из журнала ниже (номер строки 232) https://android.googlesource.com/platform/system/vold/+/froyo/Loop.cpp

Однако я не знаю, связана ли ошибка "Нет провайдера контента..." с тем же стеком ошибок.

Если у него была ошибка разрешения записи (например, sdcard или файловая система), другие приложения также не должны устанавливать!

Это проблемное приложение - это проект NDK с пользовательским контентом, который я пробовал, но ничего не имею. похоже, что ошибка поставщика контента связана с установкой apk с os и не является поставщиком контента из приложения.

Я устал от тестирования с помощью реального устройства, я беспокоюсь, что это ухудшит мою жизнь телефона, потому что мне приходилось делать это очень часто.

--------- 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

Ответ 1

Проблема может заключаться в следующем:

  • ошибка Android AOSP или ошибка в используемом вами ROM (Расконфигурация)
  • что-то вызвало раздел, в котором хранятся приложения, установленные на SD-карте (или эмулированной внутренней карте), только для чтения

"Приложения на SD-карте хранятся в зашифрованном контейнере для целей безопасности платформы, поэтому другие приложения не могут изменять или повреждать их. При установке SD-карты эти контейнеры монтируются так, что к ним можно обращаться в одном и том же как приложения, хранящиеся во внутреннем хранилище".

В вашей stacktrace проблема такова:

E/Vold (932): Ошибка создания файла образа (файловая система только для чтения)
E/Vold (932): не удалось создать файл образа ASEC (файл только для чтения система)

У меня была аналогичная проблема с приложением, которое было определено в 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)
  • По https://developer.android.com/guide/topics/data/install-location.html изменить на android: installLocation = "auto"

  • По http://forum.xda-developers.com/showpost.php?p=58409922&postcount=4845 Если вы хотите установить его на " внутреннее хранилище устройств", независимо от того, что говорит манифест или что решает система.

    Перейдите в "Настройки" > "Приложения" > "Открыть меню" > "Предпочтительное место установки" > установите его в "Внутреннее хранилище устройств". У меня был этот набор: "Пусть система решить". Это вызвало отказ некоторых APK от установки, поскольку они были отмечены, чтобы предпочесть SD-карту в качестве места их установки и поэтому они попытались установить на SD, и это просто не получилось. Теперь что все устанавливается на устройство, оно работает нормально.

  • Если вы хотите установить его в " внешнее хранилище"

    adb root
    adb shell
    mount -o rw, remount rootfs/
    chmod 777/mnt/sdcard
    pm install/mnt/sdcard/myapp.apk
    mount -o ro, remount rootfs/

  • Согласно https://code.google.com/p/android/issues/detail?id=9593 & & http://www.androidpolice.com/2011/04/19/fixing-the-couldnt-install-on-usb-storage-or-sd-card-problem-on-android/
    Только если вы можете найти smdl2tmp1.asec по следующим путям или вы получите ошибку

    smdl2tmp1 03-24 18: 48: 38.784: ERROR/Vold (86): Файл ASEC '/mnt/secure/asec/smdl2tmp1.asec' в настоящее время существует - сначала уничтожьте его! (Адрес уже используется)

    adb root
        adb shell rm/sdcard/.android_secure/smdl2tmp1.asec
        adb shell rm/mnt/secure/asec/smdl2tmp1.asec

Ответ 2

В моем случае я использую устройство с Android версии 6, разрабатывающее для Unity.

Я получаю ту же ошибку при установке приложения непосредственно из редактора Unity, этого не произойдет, если я загружу приложение в консоль разработчика Android для Android в качестве бета-версии, а затем загрузите и установите его там, в этот случай android сделает необходимое шифрование и успешно установит приложение.

Моим решением для прямой установки было установить: android build → Настройки проигрывателя > Установить местоположение → Вставить внутреннюю

Ответ 3

В дополнение к ответу @Mnemoinc:

  • Если вы хотите принудительно установить установку на "внутреннее хранилище"

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

Это может быть полезно при использовании Cyanogenmod и иметь безопасное хранилище.