microg / microg/GmsCore

[com.android.vending] EMUI InstallDistActivity confirmation dialog appears for every PackageInstaller session; splitDeferred() not implemented causes repeated DFM install prompts

Open
#3,541 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Java
Stars
14.6k
Forks
3.2k
Avg merge
12d 11h
Merged PRs (30d)
4

Description

**Affected app**
Name: microG Companion (vending-app) — affects all apps installed through it, notably those with Dynamic Feature Modules (e.g. Facebook, TikTok)
Package id: com.android.vending

---

**Describe the bug**

Two related issues in `vending-app` cause Huawei EMUI devices to show a mandatory confirmation dialog (`InstallDistActivity`) for every Dynamic Feature Module (DFM) installation, resulting in repeated popups that cannot be dismissed automatically.

**Issue 1 — Missing `USER_ACTION_NOT_REQUIRED` flag**

`GmsPackageInstaller` (via `installPackagesInternal()` in `Install.kt`) creates every `PackageInstaller.SessionParams` without setting `USER_ACTION_NOT_REQUIRED`. On Huawei EMUI (EMUI 12+, Android 12+), the system intercepts each `PackageInstaller` session commit and routes it through `InstallDistActivity` (`com.huawei.appmarket/…riskcheck.ui.activity.InstallDistActivity`), which shows a full-screen user confirmation dialog — even for background DFM installs.

This is confirmed by `logcat` evidence (see below): `InstallDistActivity` appears as the `topActivity` before every session commit.

The correct fix, as already implemented by Aurora Store's `SessionInstaller.kt`, is:
```kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
params.setRequireUserAction(SessionParams.USER_ACTION_NOT_REQUIRED)
}
```
Issue 2 — splitDeferred() is a no-op stub

SplitInstallService.splitDeferred() currently only logs a warning and immediately ACKs with onDeferredInstall(Bundle()) without performing any actual installation. Apps such as Facebook (`com.facebook.katana`) call `splitDeferred()` once per DFM module to request background pre-installation (e.g. `pytorch`, `papaya`,`executorch`, and potentially more modules over time). Because the deferred install never happens, the app falls back to calling startInstall() for the same modules later — triggering a new PackageInstaller session per module and, on EMUI, a new InstallDistActivity dialog per module.

---
Combined effect on EMUI:

Base APK commit -> InstallDistActivity dialog appears (Issue 1)
`splitDeferred()` called repeatedly for DFM modules (once per module) → all no-op (Issue 2)
App falls back to startInstall() for the same modules
Additional InstallDistActivity dialog for each DFM module commit (Issue 1 + 2 combined)

---
To Reproduce

Install microG Services (com.google.android.gms) and microG Companion (com.android.vending) on a Huawei EMUI device (Android 12+).
Enable "App Installer" in microG settings.
Install Aurora Store 4.8.2-hw or 4.8.3-hw; select microG as the installer method.
Install or update Facebook (com.facebook.katana) via Aurora Store.
Observe: InstallDistActivity confirmation dialog appears for the base APK, then additional dialogs appear for DFM module installs (pytorch, papaya, etc.).
Logcat collection command (Windows PowerShell):

```PowerShell
adb logcat -c ; adb logcat 2>$null | Select-String -Pattern "SplitInstall|GmsPackage|InstallDist|com.facebook|df_" -CaseSensitive:$false | Tee-Object -FilePath "C:\facebook_log.txt"
```
---
Expected behavior

- `PackageInstaller` sessions created by microG Companion should not trigger the Huawei EMUI `InstallDistActivity` confirmation dialog.
- `splitDeferred()` should schedule and perform the actual deferred DFM installation in the background, so that apps do not need to fall back to `startInstall()` for the same modules.
- The overall behavior should match the real Play Store: DFM installs happen silently in the background without any user interaction required.
---
Evidence from logcat
```
# InstallDistActivity intercepting the base APK session commit:
06-08 00:11:40 topActivity=com.huawei.appmarket/…InstallDistActivity taskId=28089

# Base APK installed successfully after user confirmation:
06-08 00:11:55 D GmsPackageInstaller: onReceive status: 0 sessionId: 682541505
06-08 00:11:55 D GmsPackageInstaller: SessionResultReceiver received a successful transaction

# Facebook calls splitDeferred() for DFM modules — all no-op:
06-08 00:12:09 W SplitInstallService: splitDeferred(Bundle[mParcelledData.dataSize=64]) called for com.facebook.katana, but is not implemented
06-08 00:12:09 W SplitInstallService: splitDeferred(Bundle[mParcelledData.dataSize=60]) called for com.facebook.katana, but is not implemented
06-08 00:12:09 W SplitInstallService: splitDeferred(Bundle[mParcelledData.dataSize=68]) called for com.facebook.katana, but is not implemented

# Facebook gives up on deferred path and falls back to startInstall():
06-08 00:12:09 W SplitInstallService: splitDeferred(Bundle[mParcelledData.dataSize=56]) called for com.facebook.katana, but is not implemented
06-08 00:12:09 W SplitInstallService: getSessionStates() called for com.facebook.katana, but is not implemented
06-08 00:12:09 D SplitInstallService: startInstall(Bundle[mParcelledData.dataSize=56]) called for com.facebook.katana
06-08 00:12:09 V SplitInstallManager: splitInstallFlow will query for these packages: [pytorch]

# New GmsPackageInstaller session for pytorch DFM — triggers InstallDistActivity again:
06-08 00:12:10 V GmsPackageInstaller: installPackages start com.facebook.katana
```
---
System
- Android Version: 12 (EMUI 12 / HarmonyOS 2.x)
- Device: Huawei (EMUI)
- Custom ROM: Stock EMUI / HarmonyOS (no root)
microG
- microG Core version: 0.3.15.250932-hw (versionCode: 250932030)
- microG Companion version: 0.3.15.40226-hw (versionCode: 84022630)
- microG Self-Check: All items ticked; App Installer enabled
- Installer resolved: com.android.vending/org.microg.vending.installer.AppInstallActivity ✅
---
Additional context

This issue affects any app that uses Dynamic Feature Modules (DFM), including Facebook and TikTok.

This issue began appearing after the introduction of microG PR [#3074](https://github.com/microg/GmsCore/issues/3074) (App Installer Proxy / AppInstallActivity), adopted in Aurora Store starting from version 4.8.0-hw. A fix for both issues is being prepared as a separate PR.

Related: microG PR [#3074](https://github.com/microg/GmsCore/pull/3074) (App Installer Proxy).
Full Log that capture around the DFM call 3-4 times [facebook_log_redacted.txt](https://github.com/user-attachments/files/28701770/facebook_log_redacted.txt)

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with installPackagesInternal() in Install.kt and inspect how GmsPackageInstaller creates SessionParams, comparing the required user-action setting with Aurora Store’s SessionInstaller.kt. Then read SplitInstallService.splitDeferred() and its related startInstall() flow. Done means deferred DFM requests perform background installation and EMUI no longer shows repeated confirmation dialogs; validate with Facebook or TikTok on EMUI 12+ and filtered logcat.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
mobile-dev
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.