| Проблема с установкой APK через файловый менеджер Google Files |
|
| Добавил(а) microsin |
|
При отладке приложения на старых устройствах Android 11 и Android 13 столкнулся с неприятной проблемой. Клик на apk-файле в проводнике Files приводит к неудачной установке с сообщением "Приложение не установлено". Причем через отладчик adb приложение устанавливалось и запускалось нормально. Проблему наблюдал на следующих устройствах: Смартфон BQ-5765L Clever (Android 11). На моем смартфоне Redmi Note 14 Pro (Android 16) подобная проблема не наблюдалась. Проверил все основные возможные причины, но это ничего не дало: 1. Конфликт подписи или версии программы. Все эти причины не соответствовали моему случаю. После долгих проб и ошибок случайно обнаружил, что из других приложений файл apk нормально устанавливается - из браузера Chrome, из утилиты Universal Installer мой файл apk ставится без проблем. Запустил отображение лога: adb logcat -c Затем, не закрывая лог, кликнул по 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 Первая строка — самая важная. Она означает, что приложение Google Files (`com.google.android.apps.nbu.files`) при передаче APK установщику Android удалило из манифеста атрибут `android:installLocation`. Это нештатное поведение системы. Установщик Android, получив «испорченный» таким образом манифест, не может корректно завершить установку и выдаёт общую ошибку «Приложение не установлено». ADB устанавливает APK напрямую, не пропуская его через фильтр Google Files, поэтому там всё проходит успешно. Что делать? Самое простое решение — перестать использовать Google Files для установки. 1. Установите другой файловый менеджер. Например, «Files» от самого производителя планшета (если он есть), Total Commander или любой другой проводник из Play Маркета. Я использовал для установки apk-файлов утилиту Universal Installer [1], это решило все проблемы. [Ссылки] 1. Universal Installer APK/XAPK installer with silent installs via Shizuku, Root or Dhizuku. |