Skip to content

feat: Migrate to Ackpine for package installation/uninstallation#444

Merged
MarcaDian merged 8 commits into
devfrom
install-via-ackpine
Apr 18, 2026
Merged

feat: Migrate to Ackpine for package installation/uninstallation#444
MarcaDian merged 8 commits into
devfrom
install-via-ackpine

Conversation

@MarcaDian

@MarcaDian MarcaDian commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

Replaces the custom BroadcastReceiver + InstallService pipeline with Ackpine - a coroutine-based wrapper around Android's PackageInstaller API. Install and uninstall sessions now suspend until the user confirms or cancels the system dialog, so dismissing the dialog immediately returns to Ready state instead of waiting for a timeout.
Signature conflict detection via deprecated reflection is removed - InstallFailure.Conflict from Ackpine covers this. ShizukuInstaller is replaced by AckpineInstaller which handles internal, Shizuku, and uninstall operations in one place. InstallReceiver, UninstallReceiver, InstallService, UninstallService are deleted.


Extends the split APK merge pipeline with device-aware config split filtering.
Previously only ABI splits could be excluded via stripNativeLibs. Two new filtering passes are now applied when skipUnneededSplits is enabled:

  • Locale splits - modules whose language/region qualifier does not appear in the system's active locale list are skipped
  • Density splits - modules whose DPI qualifier does not match the device's screen density bucket are skipped

This reduces the size of the intermediate merged APK before patching begins.

@MarcaDian MarcaDian changed the title feat: Use Ackpine as installer provider feat: Migrate to Ackpine for package installation/uninstallation Apr 18, 2026
# Conflicts:
#	app/src/main/java/app/morphe/manager/patcher/runtime/CoroutineRuntime.kt
#	app/src/main/java/app/morphe/manager/patcher/runtime/ProcessRuntime.kt
#	app/src/main/java/app/morphe/manager/ui/viewmodel/SettingsViewModel.kt
#	gradle/libs.versions.toml
@MarcaDian MarcaDian merged commit aa7207d into dev Apr 18, 2026
1 check passed
@MarcaDian MarcaDian deleted the install-via-ackpine branch April 18, 2026 06:11
@MarcaDian MarcaDian linked an issue Apr 18, 2026 that may be closed by this pull request
3 tasks
github-actions Bot pushed a commit that referenced this pull request Apr 18, 2026
# [1.16.0-dev.3](v1.16.0-dev.2...v1.16.0-dev.3) (2026-04-18)

### Bug Fixes

* Handle `InstallFailure` result when installing manager update ([a4d1eb8](a4d1eb8))

### Features

* Migrate to `Ackpine` for package installation/uninstallation ([#444](#444)) ([aa7207d](aa7207d))
github-actions Bot pushed a commit that referenced this pull request May 4, 2026
# [1.16.0](v1.15.0...v1.16.0) (2026-05-04)

### Bug Fixes

* "SessionBasedInstallConfirmationActivity was finished by user" install error on some devices ([3e74857](3e74857))
* `Session is dead` error on Pixels devices when installing apps ([#458](#458)) ([ce1ce6e](ce1ce6e))
* Adapt accent color contrast for extreme black/white values in app info dialog ([c4f883f](c4f883f))
* Add logging and fix stale installer cache ([78b5aee](78b5aee))
* Always respect manager prerelease preference for update channel ([090ee0c](090ee0c))
* Apply locale via context wrap on Android < 13 ([ce193ee](ce193ee))
* Check primary ABI only in `isArmV7` to avoid false positives on `ArmV8` devices ([14729c2](14729c2))
* Eliminate background flash on `InstalledAppInfo` → patch flow transition ([b246a4b](b246a4b))
* Fall back to `Downloads` export on devices without `DocumentsUI` (Android TV) ([1e21c39](1e21c39))
* File picker and export for Android TV ([#491](#491)) ([7c1cfba](7c1cfba))
* Handle `InstallFailure` result when installing manager update ([a4d1eb8](a4d1eb8))
* Hoist install state reads to prevent recomposition on install ([9b82048](9b82048))
* Merge 'Filter split APKs' and `Remove unused native libraries` into 'Optimize for device architecture' setting ([2edb15f](2edb15f))
* Patch bundles do not load on Android 8.0 devices ([3116619](3116619))
* Prevent `InstalledAppInfoViewModel` collision on dialog reopen ([15ae79a](15ae79a))
* Replace `Ackpine` with native `SessionInstaller` ([#508](#508)) ([cf0f4db](cf0f4db))
* Replace `isLoaded` flag with `BundleState` sealed class and simplify `homeAppState` ([72976d3](72976d3))
* Resolve app icon from saved APK when app is not installed ([fe3ef6c](fe3ef6c))
* Resolve display name from bundle metadata over patched APK label ([6c6e065](6c6e065))
* Scope `InstalledAppInfoViewModel` to dialog instance via dialog token ([0cf2f6a](0cf2f6a))
* Shizuku installer couldn't update an already installed app ([#454](#454)) ([d4e74e3](d4e74e3))
* Show reinstall button and installer dialog for deleted apps ([472d046](472d046))
* Show SDK-incompatible versions as disabled, block patching when no versions are compatible with device SDK ([f90d5ba](f90d5ba))
* Show swipe gesture hint on every custom bundle addition ([0c66503](0c66503))
* System installer couldn't update an already installed app ([#455](#455)) ([adc93e4](adc93e4))
* Update home screen cards immediately after install/uninstall ([8f671bd](8f671bd))
* Use `SharedPreferences` as locale side-channel on Android < 13 ([a5f91bd](a5f91bd))
* When greeting message is disabled, show a small top spacer so the app cards don't sit flush against the top of the screen ([6900cc2](6900cc2))

### Features

* Adaptive two-column layout for `InstalledAppInfoDialog` on tablets ([40a29a9](40a29a9))
* Add `BundleAppMetadata` as a data source for `AppDataResolver` ([3bdc1f5](3bdc1f5))
* Add fast bytecode mode setting to expert mode ([#403](#403)) ([e73c63c](e73c63c))
* Add manual `JKS` parser for keystore import without BC provider dependency ([#494](#494)) ([ccc99a2](ccc99a2))
* Add random background mode with rotation interval ([2d12fbb](2d12fbb))
* Add swipe gestures and multi-select to app buttons on main screen ([#446](#446)) ([0330699](0330699))
* Add swipe gestures to hidden apps dialog and search results ([8cf1f13](8cf1f13))
* Add toggle to disable home screen patching phrases ([#443](#443)) ([f53ad64](f53ad64))
* Import keystore from `PKCS12`, `BKS` and `JKS` formats ([3f38387](3f38387))
* Improve patch visibility in bundle and app patch dialogs ([#457](#457)) ([1881991](1881991))
* Live patching progress in foreground notification ([c25af8f](c25af8f))
* Migrate to `Ackpine` for package installation/uninstallation ([#444](#444)) ([aa7207d](aa7207d))
* Open `.mpp` patch sources directly from file manager ([#483](#483)) ([f46a11f](f46a11f))
* Open patches dialog on hidden app tap in search ([1898e74](1898e74))
* Prompt bundle selection before APK selection in simple mode ([#511](#511)) ([8161d9b](8161d9b))
* Sort universal patches to bottom of each bundle in patches dialog ([eac672e](eac672e))
* Store merged APK from split archives as original for repatching ([#438](#438)) ([be0b868](be0b868))
LisoUseInAIKyrios pushed a commit that referenced this pull request May 17, 2026
# [1.16.0-dev.3](v1.16.0-dev.2...v1.16.0-dev.3) (2026-04-18)

### Bug Fixes

* Handle `InstallFailure` result when installing manager update ([7df2907](7df2907))

### Features

* Migrate to `Ackpine` for package installation/uninstallation ([#444](#444)) ([574e404](574e404))
LisoUseInAIKyrios pushed a commit that referenced this pull request May 17, 2026
# [1.16.0](v1.15.0...v1.16.0) (2026-05-04)

### Bug Fixes

* "SessionBasedInstallConfirmationActivity was finished by user" install error on some devices ([4fdef34](4fdef34))
* `Session is dead` error on Pixels devices when installing apps ([#458](#458)) ([3b556cf](3b556cf))
* Adapt accent color contrast for extreme black/white values in app info dialog ([b34fd77](b34fd77))
* Add logging and fix stale installer cache ([fd1f97e](fd1f97e))
* Always respect manager prerelease preference for update channel ([6c90248](6c90248))
* Apply locale via context wrap on Android < 13 ([dc6536f](dc6536f))
* Check primary ABI only in `isArmV7` to avoid false positives on `ArmV8` devices ([71c6c6d](71c6c6d))
* Eliminate background flash on `InstalledAppInfo` → patch flow transition ([bf2865a](bf2865a))
* Fall back to `Downloads` export on devices without `DocumentsUI` (Android TV) ([afeff7e](afeff7e))
* File picker and export for Android TV ([#491](#491)) ([7cd5e1d](7cd5e1d))
* Handle `InstallFailure` result when installing manager update ([7df2907](7df2907))
* Hoist install state reads to prevent recomposition on install ([f184d4a](f184d4a))
* Merge 'Filter split APKs' and `Remove unused native libraries` into 'Optimize for device architecture' setting ([96d0c4c](96d0c4c))
* Patch bundles do not load on Android 8.0 devices ([48bb842](48bb842))
* Prevent `InstalledAppInfoViewModel` collision on dialog reopen ([0648062](0648062))
* Replace `Ackpine` with native `SessionInstaller` ([#508](#508)) ([2162f92](2162f92))
* Replace `isLoaded` flag with `BundleState` sealed class and simplify `homeAppState` ([d51d9df](d51d9df))
* Resolve app icon from saved APK when app is not installed ([ff15269](ff15269))
* Resolve display name from bundle metadata over patched APK label ([65500b6](65500b6))
* Scope `InstalledAppInfoViewModel` to dialog instance via dialog token ([88d7352](88d7352))
* Shizuku installer couldn't update an already installed app ([#454](#454)) ([8313342](8313342))
* Show reinstall button and installer dialog for deleted apps ([faa53ba](faa53ba))
* Show SDK-incompatible versions as disabled, block patching when no versions are compatible with device SDK ([f2176a1](f2176a1))
* Show swipe gesture hint on every custom bundle addition ([9c68eee](9c68eee))
* System installer couldn't update an already installed app ([#455](#455)) ([2d7f9d5](2d7f9d5))
* Update home screen cards immediately after install/uninstall ([6e58e51](6e58e51))
* Use `SharedPreferences` as locale side-channel on Android < 13 ([88dc77f](88dc77f))
* When greeting message is disabled, show a small top spacer so the app cards don't sit flush against the top of the screen ([14a5144](14a5144))

### Features

* Adaptive two-column layout for `InstalledAppInfoDialog` on tablets ([dd068c4](dd068c4))
* Add `BundleAppMetadata` as a data source for `AppDataResolver` ([d174ed4](d174ed4))
* Add fast bytecode mode setting to expert mode ([#403](#403)) ([70daa22](70daa22))
* Add manual `JKS` parser for keystore import without BC provider dependency ([#494](#494)) ([4493265](4493265))
* Add random background mode with rotation interval ([c0e3310](c0e3310))
* Add swipe gestures and multi-select to app buttons on main screen ([#446](#446)) ([1093c43](1093c43))
* Add swipe gestures to hidden apps dialog and search results ([a424a62](a424a62))
* Add toggle to disable home screen patching phrases ([#443](#443)) ([91a66e3](91a66e3))
* Import keystore from `PKCS12`, `BKS` and `JKS` formats ([eb5c9ab](eb5c9ab))
* Improve patch visibility in bundle and app patch dialogs ([#457](#457)) ([df53801](df53801))
* Live patching progress in foreground notification ([202dd76](202dd76))
* Migrate to `Ackpine` for package installation/uninstallation ([#444](#444)) ([574e404](574e404))
* Open `.mpp` patch sources directly from file manager ([#483](#483)) ([288868d](288868d))
* Open patches dialog on hidden app tap in search ([396e5cd](396e5cd))
* Prompt bundle selection before APK selection in simple mode ([#511](#511)) ([bbc9206](bbc9206))
* Sort universal patches to bottom of each bundle in patches dialog ([14e284e](14e284e))
* Store merged APK from split archives as original for repatching ([#438](#438)) ([71cc022](71cc022))
SA-SUJON pushed a commit to SA-SUJON/MorpheManager that referenced this pull request May 24, 2026
SA-SUJON pushed a commit to SA-SUJON/MorpheManager that referenced this pull request May 24, 2026
# [1.16.0-dev.3](MorpheApp/morphe-manager@v1.16.0-dev.2...v1.16.0-dev.3) (2026-04-18)

### Bug Fixes

* Handle `InstallFailure` result when installing manager update ([8ac0c38](MorpheApp@8ac0c38))

### Features

* Migrate to `Ackpine` for package installation/uninstallation ([MorpheApp#444](MorpheApp#444)) ([316fecf](MorpheApp@316fecf))
SA-SUJON pushed a commit to SA-SUJON/MorpheManager that referenced this pull request May 24, 2026
# [1.16.0](MorpheApp/morphe-manager@v1.15.0...v1.16.0) (2026-05-04)

### Bug Fixes

* "SessionBasedInstallConfirmationActivity was finished by user" install error on some devices ([036efb0](MorpheApp@036efb0))
* `Session is dead` error on Pixels devices when installing apps ([MorpheApp#458](MorpheApp#458)) ([d1476a6](MorpheApp@d1476a6))
* Adapt accent color contrast for extreme black/white values in app info dialog ([c81b5f5](MorpheApp@c81b5f5))
* Add logging and fix stale installer cache ([fabe26d](MorpheApp@fabe26d))
* Always respect manager prerelease preference for update channel ([6fe4cb5](MorpheApp@6fe4cb5))
* Apply locale via context wrap on Android < 13 ([ece000c](MorpheApp@ece000c))
* Check primary ABI only in `isArmV7` to avoid false positives on `ArmV8` devices ([3fa61c1](MorpheApp@3fa61c1))
* Eliminate background flash on `InstalledAppInfo` → patch flow transition ([e59c7d5](MorpheApp@e59c7d5))
* Fall back to `Downloads` export on devices without `DocumentsUI` (Android TV) ([27b9b9c](MorpheApp@27b9b9c))
* File picker and export for Android TV ([MorpheApp#491](MorpheApp#491)) ([a25d84f](MorpheApp@a25d84f))
* Handle `InstallFailure` result when installing manager update ([8ac0c38](MorpheApp@8ac0c38))
* Hoist install state reads to prevent recomposition on install ([0c23b23](MorpheApp@0c23b23))
* Merge 'Filter split APKs' and `Remove unused native libraries` into 'Optimize for device architecture' setting ([006e1cc](MorpheApp@006e1cc))
* Patch bundles do not load on Android 8.0 devices ([793f591](MorpheApp@793f591))
* Prevent `InstalledAppInfoViewModel` collision on dialog reopen ([3ee12bc](MorpheApp@3ee12bc))
* Replace `Ackpine` with native `SessionInstaller` ([MorpheApp#508](MorpheApp#508)) ([633e4b3](MorpheApp@633e4b3))
* Replace `isLoaded` flag with `BundleState` sealed class and simplify `homeAppState` ([cf42e4f](MorpheApp@cf42e4f))
* Resolve app icon from saved APK when app is not installed ([d9c836a](MorpheApp@d9c836a))
* Resolve display name from bundle metadata over patched APK label ([1132abe](MorpheApp@1132abe))
* Scope `InstalledAppInfoViewModel` to dialog instance via dialog token ([3961404](MorpheApp@3961404))
* Shizuku installer couldn't update an already installed app ([MorpheApp#454](MorpheApp#454)) ([aaf237e](MorpheApp@aaf237e))
* Show reinstall button and installer dialog for deleted apps ([ec8599d](MorpheApp@ec8599d))
* Show SDK-incompatible versions as disabled, block patching when no versions are compatible with device SDK ([39f3bc7](MorpheApp@39f3bc7))
* Show swipe gesture hint on every custom bundle addition ([e66d598](MorpheApp@e66d598))
* System installer couldn't update an already installed app ([MorpheApp#455](MorpheApp#455)) ([e83af35](MorpheApp@e83af35))
* Update home screen cards immediately after install/uninstall ([4f3ab2b](MorpheApp@4f3ab2b))
* Use `SharedPreferences` as locale side-channel on Android < 13 ([4c32ac5](MorpheApp@4c32ac5))
* When greeting message is disabled, show a small top spacer so the app cards don't sit flush against the top of the screen ([ed22214](MorpheApp@ed22214))

### Features

* Adaptive two-column layout for `InstalledAppInfoDialog` on tablets ([bc4c3ae](MorpheApp@bc4c3ae))
* Add `BundleAppMetadata` as a data source for `AppDataResolver` ([f2097c6](MorpheApp@f2097c6))
* Add fast bytecode mode setting to expert mode ([MorpheApp#403](MorpheApp#403)) ([4bcd828](MorpheApp@4bcd828))
* Add manual `JKS` parser for keystore import without BC provider dependency ([MorpheApp#494](MorpheApp#494)) ([fd8902b](MorpheApp@fd8902b))
* Add random background mode with rotation interval ([6bacce3](MorpheApp@6bacce3))
* Add swipe gestures and multi-select to app buttons on main screen ([MorpheApp#446](MorpheApp#446)) ([822c23f](MorpheApp@822c23f))
* Add swipe gestures to hidden apps dialog and search results ([882a7d5](MorpheApp@882a7d5))
* Add toggle to disable home screen patching phrases ([MorpheApp#443](MorpheApp#443)) ([108e60b](MorpheApp@108e60b))
* Import keystore from `PKCS12`, `BKS` and `JKS` formats ([da3ec82](MorpheApp@da3ec82))
* Improve patch visibility in bundle and app patch dialogs ([MorpheApp#457](MorpheApp#457)) ([739cb32](MorpheApp@739cb32))
* Live patching progress in foreground notification ([fb9b6e7](MorpheApp@fb9b6e7))
* Migrate to `Ackpine` for package installation/uninstallation ([MorpheApp#444](MorpheApp#444)) ([316fecf](MorpheApp@316fecf))
* Open `.mpp` patch sources directly from file manager ([MorpheApp#483](MorpheApp#483)) ([8df6ed9](MorpheApp@8df6ed9))
* Open patches dialog on hidden app tap in search ([e538457](MorpheApp@e538457))
* Prompt bundle selection before APK selection in simple mode ([MorpheApp#511](MorpheApp#511)) ([650befe](MorpheApp@650befe))
* Sort universal patches to bottom of each bundle in patches dialog ([53f43d9](MorpheApp@53f43d9))
* Store merged APK from split archives as original for repatching ([MorpheApp#438](MorpheApp#438)) ([2bacd4c](MorpheApp@2bacd4c))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: Add 'Skip unneeded split APKs'

1 participant