Проблема с установкой APK через файловый менеджер Google Files Печать
Добавил(а) microsin   

При отладке приложения на старых устройствах Android 11 и Android 13 столкнулся с неприятной проблемой. Клик на apk-файле в проводнике Files приводит к неудачной установке с сообщением "Приложение не установлено". Причем через отладчик adb приложение устанавливалось и запускалось нормально.

Проблему наблюдал на следующих устройствах:

Смартфон BQ-5765L Clever (Android 11).
Планшет KENSHI H10 LTE (Android 13).

На моем смартфоне Redmi Note 14 Pro (Android 16) подобная проблема не наблюдалась.

Проверил все основные возможные причины, но это ничего не дало:

1. Конфликт подписи или версии программы.
2. Блокировка Google Play Protect.
3. Разрешение «Неизвестные источники» не выдано файловому менеджеру.
4. Нехватка места.

Все эти причины не соответствовали моему случаю. После долгих проб и ошибок случайно обнаружил, что из других приложений файл apk нормально устанавливается - из браузера Chrome, из утилиты Universal Installer мой файл apk ставится без проблем.

Запустил отображение лога:

adb logcat -c
adb logcat | grep -i "PackageInstaller\|install"

Затем, не закрывая лог, кликнул по APK на планшете в Google Files. Отобразился лог установки:

11-04 14:41:00.139  1227  1293 E PackageInstallerSession: com.google.android.apps.nbu.files drops manifest attribute android:installLocation in base.apk for ru.dolina.config

11-04 14:41:00.141  1227  1293 D BroadcastQueue: Add broadcast <BroadcastRecord{5e61b55 u0 com.google.android.apps.nbu.files.appmanager.INTENT_ACTION_INSTALLATION_STATE_CHANGE}> into [parallel | background], pending size 0

11-04 14:41:00.143  1227  1259 D BroadcastQueue: Done with parallel broadcast [background] [BroadcastRecord{5e61b55 u0 com.google.android.apps.nbu.files.appmanager.INTENT_ACTION_INSTALLATION_STATE_CHANGE}]

11-04 14:41:00.146  1227  3005 I ActivityTaskManager: START u0 {act=android.content.pm.action.CONFIRM_INSTALL pkg=com.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.InstallStart (has extras)} from uid 10099, pid 14771

11-04 14:41:00.161  1227  3005 I ActivityTaskManager: ->startActivity for ActivityRecord{748e6f8 u0 com.google.android.packageinstaller/com.android.packageinstaller.InstallStart} t264 d0} result:START_SUCCESS

11-04 14:41:00.260  1227  3005 D WindowManager: setFocusedApp mFocusedApp = ActivityRecord{748e6f8 u0 com.google.android.packageinstaller/com.android.packageinstaller.InstallStart} t264 d0}displayId = 0Callers = com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked:4587 com.android.server.wm.TaskFragment.onActivityStateChanged:761 com.android.server.wm.ActivityRecord.setState:5510 com.android.server.wm.Task.minimalResumeActivityLocked:4800

11-04 14:41:00.286  1227  3005 I ActivityTaskManager: START u0 {act=android.content.pm.action.CONFIRM_INSTALL flg=0x2000001 pkg=com.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity (has extras)} from uid 10055, pid 18157

11-04 14:41:00.295  1227  3005 I ActivityTaskManager: ->startActivity for ActivityRecord{703a27 u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity} t264 d0} result:START_SUCCESS

11-04 14:41:00.320  1227  3030 D WindowManager: setFocusedApp mFocusedApp = ActivityRecord{703a27 u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity} t264 d0}displayId = 0Callers = com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked:4587 com.android.server.wm.TaskFragment.onActivityStateChanged:761 com.android.server.wm.ActivityRecord.setState:5510 com.android.server.wm.Task.minimalResumeActivityLocked:4800

11-04 14:41:00.354   629   629 D vendor.unisoc.hardware.power-service: Enter getSceneIdByName: sceneName:com.google.android.packageinstaller

11-04 14:41:00.376  1227  3030 V WindowState: toString mSurfaceNameCache= mLastTitle=null title=com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity

11-04 14:41:00.376  1227  3030 D CoreBackPreview: Window{7d4363b u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}: Setting back callback OnBackInvokedCallbackInfo{mCallback=android.window.IOnBackInvokedCallback$Stub$Proxy@9dbd2b1, mPriority=0}

11-04 14:41:00.389  1227  3017 I WindowManager: Input focus has changed to Window{7d4363b u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}-[Surface(name=*Title#3851)/@0x2b0d396] from 359f57 com.google.android.apps.nbu.files/com.google.android.apps.nbu.files.advancedbrowsing.browser.AdvancedBrowsingActivity mDisplayId 0 updateInputWindows true, callers=com.android.server.wm.DisplayContent.updateFocusedWindowLocked:3736 com.android.server.wm.RootWindowContainer.updateFocusedWindowLocked:493 com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6179 com.android.server.wm.WindowManagerService.relayoutWindow:2571 com.android.server.wm.Session.relayout:266

11-04 14:41:00.390 18157 18157 D VRI[PackageInstallerActivity]: performTraversals relayoutWindow: maybeSyncSeqId=-1 ,mSyncSeqId=0 ,relayoutResult=3

11-04 14:41:00.394   610  5831 I mali_gralloc: allocate: id=26200000c52, hal_format=RGBA8888, mali_format=RGBA8888, afbc=SPLIT, usage=GPU_RW|HWC|BACKBUF, size=845x345(1213440), stride=848, name=VRI[PackageInstallerActivity]#2(BLAST Consumer)2

11-04 14:41:00.396   610   820 I mali_gralloc: allocate: id=26200000c53, hal_format=RGBA8888, mali_format=RGBA8888, afbc=SPLIT, usage=GPU_RW|HWC|BACKBUF, size=845x345(1213440), stride=848, name=VRI[PackageInstallerActivity]#2(BLAST Consumer)2

11-04 14:41:00.398   610   820 I mali_gralloc: allocate: id=26200000c54, hal_format=RGBA8888, mali_format=RGBA8888, afbc=SPLIT, usage=GPU_RW|HWC|BACKBUF, size=845x345(1213440), stride=848, name=VRI[PackageInstallerActivity]#2(BLAST Consumer)2

11-04 14:41:00.408  1227  3030 D WindowManager: finishDrawing: syncSeqId=0, postDrawTransaction=android.view.SurfaceControl$Transaction@eece370, mSyncState=0, mDrawState=1, hasSyncHandlers=false, mClientWasDrawingForSync=false, win=Window{7d4363b u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}-[Surface(name=*Title#3851)/@0x2b0d396]

11-04 14:41:00.419  1227  1249 I ActivityTaskManager: Displayed com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity: +268ms

11-04 14:41:00.425   641   641 I Layer   : fillInputInfo layer:com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity#3851, visible=1 (hasInputInfo:1, isHidden:0, alpha:1.000000, mActiveBuffer:2), parent:7d4363b com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity#3850, parenthidden:0

11-04 14:41:01.980  1227  1253 D WindowManager: Focus not requested, because it has no surface or is not focusable, request window=Window{7d4363b u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}-[Surface(name=*Title#3851)/@0x2b0d396], mCurrentFocusWindow= 7d4363b com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity

11-04 14:41:01.994  1227  3038 I WindowManager: Input focus has changed to Window{359f57 u0 com.google.android.apps.nbu.files/com.google.android.apps.nbu.files.advancedbrowsing.browser.AdvancedBrowsingActivity}-[Surface(name=*Title#3840)/@0xa5fdddc] from 7d4363b com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity mDisplayId 0 updateInputWindows true, callers=com.android.server.wm.DisplayContent.updateFocusedWindowLocked:3736 com.android.server.wm.RootWindowContainer.updateFocusedWindowLocked:493 com.android.server.wm.WindowManagerService.updateFocusedWindowLocked:6179 com.android.server.wm.ActivityTaskManagerService.setResumedActivityUncheckLocked:4589 com.android.server.wm.TaskFragment.onActivityStateChanged:761

11-04 14:41:01.995  1227  1283 I PackageManager: startCopy UserHandle{0}: InstallParams{145d807 file=/data/app/vmdl374310090.tmp}

11-04 14:41:02.005  1227  1283 E PackageManager: ERROR: could not load root hash from incremental install

11-04 14:41:02.072  7186  7186 I Finsky  : [2] VerifyApps: Install-time verification requested for package ru.dolina.config, PackageManager id = 63, Verifier id = 56c96bcc-eb6c-4530-88a9-92252e0c3762

11-04 14:41:02.164  1227  3030 D CoreBackPreview: Window{7d4363b u0 com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity}-[Surface(name=*Title#3851)/@0x2b0d396]: Setting back callback null

11-04 14:41:02.176  1227  3017 W InputManager-JNI: Input channel object '7d4363b com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity (client)' was disposed without first being removed with the input manager!

11-04 14:41:02.245 15484 15509 I AppInstallMetadataManag: No metadata found for session 374310090

11-04 14:41:02.255  7186 11641 I Finsky  : [297] VerifyApps: [ADV] Received getInstallerInfo request. VerificationId: 63

11-04 14:41:02.256  7186 11641 I Finsky  : [297] VerifyApps: [ADV] Returning installer info for 63: com.google.android.apps.nbu.files

11-04 14:41:02.304   641   641 I Layer   : fillInputInfo layer:com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity#3851, visible=0 (hasInputInfo:1, isHidden:1, alpha:0.418945, mActiveBuffer:2), parent:7d4363b com.google.android.packageinstaller/com.android.packageinstaller.PackageInstallerActivity#3850, parenthidden:1

11-04 14:41:02.388  7186 18375 I Finsky  : [491] VerifyApps AdvancedProtection: Verify AP install started

11-04 14:41:02.389  7186 18375 I Finsky  : [491] VerifyApps AdvancedProtection: Allowing install because there are no Advanced Protection users

11-04 14:41:02.396  7186 18375 I Finsky  : [491] Skipping logging for attempted installation. The source is a system package.

11-04 14:41:02.406  1227  1293 D BroadcastQueue: Add broadcast <BroadcastRecord{d3d4973 u0 com.google.android.apps.nbu.files.appmanager.INTENT_ACTION_INSTALLATION_STATE_CHANGE}> into [parallel | background], pending size 0

11-04 14:41:02.407  1227  1259 D BroadcastQueue: Done with parallel broadcast [background] [BroadcastRecord{d3d4973 u0 com.google.android.apps.nbu.files.appmanager.INTENT_ACTION_INSTALLATION_STATE_CHANGE}]

11-04 14:41:02.408  7186  7186 I Finsky  : [2] VerifyApps: Install-time verification complete: id=63, package_name=ru.dolina.config

Проблема оказалась не в APK как таковом, а в том, как именно файловый менеджер (Google Files) передаёт его системе. Настоящая причина: ошибка в Google Files.

В логе есть две важные строки:

1. E PackageInstallerSession: com.google.android.apps.nbu.files drops manifest attribute android:installLocation in base.apk for ru.dolina.config
2. E PackageManager: ERROR: could not load root hash from incremental install

Первая строка — самая важная. Она означает, что приложение Google Files (`com.google.android.apps.nbu.files`) при передаче APK установщику Android удалило из манифеста атрибут `android:installLocation`. Это нештатное поведение системы. Установщик Android, получив «испорченный» таким образом манифест, не может корректно завершить установку и выдаёт общую ошибку «Приложение не установлено».

ADB устанавливает APK напрямую, не пропуская его через фильтр Google Files, поэтому там всё проходит успешно.

Что делать? Самое простое решение — перестать использовать Google Files для установки.

1. Установите другой файловый менеджер. Например, «Files» от самого производителя планшета (если он есть), Total Commander или любой другой проводник из Play Маркета.
2. Откройте APK через него. Скорее всего, установка пройдёт нормально, потому что другой файловый менеджер не будет вмешиваться в манифест.

Я использовал для установки apk-файлов утилиту Universal Installer [1], это решило все проблемы.

[Ссылки]

1. Universal Installer APK/XAPK installer with silent installs via Shizuku, Root or Dhizuku.