Skip to content

feat: Add fast bytecode mode setting to expert mode#403

Merged
wchill merged 14 commits into
devfrom
add-bytecodeMode
Apr 18, 2026
Merged

feat: Add fast bytecode mode setting to expert mode#403
wchill merged 14 commits into
devfrom
add-bytecodeMode

Conversation

@MarcaDian

Copy link
Copy Markdown
Contributor

No description provided.

wchill and others added 2 commits April 6, 2026 14:25
PatcherProcess: fix process hang when session throws

events.finished(null) was placed after the try/finally block. If Session.run() threw an exception it was caught by CoroutineExceptionHandler but events.finished() was never called, leaving patching.await() in ProcessRuntime hanging indefinitely until the process was killed.

Moved events.finished(null) inside the try block on success, and added a catch block that calls events.finished(stackTrace) on failure, ensuring the main process always receives a completion signal regardless of outcome.

---

CoroutineRuntime: fix MemoryMonitor polling thread leak on early failure

startMemoryPolling() was called before the try block. Any exception thrown before SplitApkPreparer.prepareIfNeeded() — such as from bundles(), PatchBundle.Loader.patches(), or an invalid bundle ID — would skip stopMemoryPolling(), leaving the polling thread running indefinitely.

Wrapped the entire execute() body in an outer try/finally to guarantee stopMemoryPolling() is always called. The inner try/finally for preparation.cleanup() is preserved.

---

PatcherWorker: fix wakelock not released if claimInput throws

wakeLock.acquire() was called before workerRepository.claimInput(). If claimInput() threw an exception the finally block was never reached, holding a partial wakelock for up to 10 minutes.

Moved claimInput() inside the try/finally block using lateinit var args so the wakelock is always released and args remains accessible after the block for the temporary file cleanup check.

PatcherWorker: remove duplicate MemoryMonitor calls

startMemoryPolling() was called in both PatcherWorker and inside CoroutineRuntime.execute(), causing two threads writing concurrently to the same @volatile fields (memoryUsedAverage, memoryUsedMax, memoryPollSamples), producing incorrect memory statistics.

stopMemoryPolling() was also redundantly called in PatcherWorker after already being called inside CoroutineRuntime.execute() and PatcherProcess.

Removed both redundant calls along with the now-unused MemoryMonitor import and usedCoroutineFallback variable. Memory monitor lifecycle is now managed entirely within each runtime implementation.

PatcherWorker: replace restricted API usage with public equivalent

Result.Success type check required @SuppressLint("RestrictedApi") as Result.Success is an internal androidx.work class. Replaced with a patchingSucceeded boolean flag checked against the public Result.success() value, removing the suppression annotation and its import.

PatcherWorker: log warning when temp APK cleanup fails

patchedApk.delete() silently ignored failures. Now logs a warning if the temporary patched APK cannot be deleted and still exists.

---

Session: remove unused nextPatchIndex variable
@wchill

wchill commented Apr 7, 2026

Copy link
Copy Markdown
Contributor

Don't merge until MorpheApp/morphe-patcher#106 is merged

# Conflicts:
#	app/src/main/java/app/morphe/manager/patcher/worker/PatcherWorker.kt
@MarcaDian

Copy link
Copy Markdown
Contributor Author

Can merge?

@LisoUseInAIKyrios

This comment was marked as resolved.

MarcaDian and others added 7 commits April 17, 2026 11:52
# Conflicts:
#	app/src/main/java/app/morphe/manager/domain/manager/PreferencesManager.kt
#	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/patcher/runtime/process/Parameters.kt
@MarcaDian

Copy link
Copy Markdown
Contributor Author

x86 can be removed

@wchill

wchill commented Apr 17, 2026

Copy link
Copy Markdown
Contributor

@MarcaDian I removed all aapt2 binaries (not only x86) since we don't use aapt2 for packaging anymore.

@MarcaDian

Copy link
Copy Markdown
Contributor Author

Oh, of course, the github app doesn't show it for some reason

Screenshots

Screenshot_2026-04-18-02-51-55-645_com.github.android-edit.jpg

@wchill wchill changed the title feat: Add bytecode mode setting to expert mode feat: Add fast bytecode mode setting to expert mode Apr 18, 2026
@wchill wchill merged commit e73c63c into dev Apr 18, 2026
1 check passed
github-actions Bot pushed a commit that referenced this pull request Apr 18, 2026
# [1.16.0-dev.2](v1.16.0-dev.1...v1.16.0-dev.2) (2026-04-18)

### Features

* Add fast bytecode mode setting to expert mode ([#403](#403)) ([e73c63c](e73c63c))
@wchill wchill deleted the add-bytecodeMode branch April 18, 2026 02:15
@LisoUseInAIKyrios LisoUseInAIKyrios linked an issue Apr 18, 2026 that may be closed by this pull request
4 tasks
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
* feat: Add bytecode mode setting to expert mode

* chore: Update bytecode mode strings

* fix: Fix process hang, memory monitor leak, and wakelock leak

PatcherProcess: fix process hang when session throws

events.finished(null) was placed after the try/finally block. If Session.run() threw an exception it was caught by CoroutineExceptionHandler but events.finished() was never called, leaving patching.await() in ProcessRuntime hanging indefinitely until the process was killed.

Moved events.finished(null) inside the try block on success, and added a catch block that calls events.finished(stackTrace) on failure, ensuring the main process always receives a completion signal regardless of outcome.

---

CoroutineRuntime: fix MemoryMonitor polling thread leak on early failure

startMemoryPolling() was called before the try block. Any exception thrown before SplitApkPreparer.prepareIfNeeded() — such as from bundles(), PatchBundle.Loader.patches(), or an invalid bundle ID — would skip stopMemoryPolling(), leaving the polling thread running indefinitely.

Wrapped the entire execute() body in an outer try/finally to guarantee stopMemoryPolling() is always called. The inner try/finally for preparation.cleanup() is preserved.

---

PatcherWorker: fix wakelock not released if claimInput throws

wakeLock.acquire() was called before workerRepository.claimInput(). If claimInput() threw an exception the finally block was never reached, holding a partial wakelock for up to 10 minutes.

Moved claimInput() inside the try/finally block using lateinit var args so the wakelock is always released and args remains accessible after the block for the temporary file cleanup check.

PatcherWorker: remove duplicate MemoryMonitor calls

startMemoryPolling() was called in both PatcherWorker and inside CoroutineRuntime.execute(), causing two threads writing concurrently to the same @volatile fields (memoryUsedAverage, memoryUsedMax, memoryPollSamples), producing incorrect memory statistics.

stopMemoryPolling() was also redundantly called in PatcherWorker after already being called inside CoroutineRuntime.execute() and PatcherProcess.

Removed both redundant calls along with the now-unused MemoryMonitor import and usedCoroutineFallback variable. Memory monitor lifecycle is now managed entirely within each runtime implementation.

PatcherWorker: replace restricted API usage with public equivalent

Result.Success type check required @SuppressLint("RestrictedApi") as Result.Success is an internal androidx.work class. Replaced with a patchingSucceeded boolean flag checked against the public Result.success() value, removing the suppression annotation and its import.

PatcherWorker: log warning when temp APK cleanup fails

patchedApk.delete() silently ignored failures. Now logs a warning if the temporary patched APK cannot be deleted and still exists.

---

Session: remove unused nextPatchIndex variable

* chore: Update patcher

* chore: Update dependencies

* chore: Fix `Close` button style

* Add debug build

* Remove safe option

* Add back legacy packaging

* Remove aapt2 from manager

* bump patcher

---------

Co-authored-by: Eric Ahn <w@chill.dev>
LisoUseInAIKyrios pushed a commit that referenced this pull request May 17, 2026
# [1.16.0-dev.2](v1.16.0-dev.1...v1.16.0-dev.2) (2026-04-18)

### Features

* Add fast bytecode mode setting to expert mode ([#403](#403)) ([70daa22](70daa22))
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
* feat: Add bytecode mode setting to expert mode

* chore: Update bytecode mode strings

* fix: Fix process hang, memory monitor leak, and wakelock leak

PatcherProcess: fix process hang when session throws

events.finished(null) was placed after the try/finally block. If Session.run() threw an exception it was caught by CoroutineExceptionHandler but events.finished() was never called, leaving patching.await() in ProcessRuntime hanging indefinitely until the process was killed.

Moved events.finished(null) inside the try block on success, and added a catch block that calls events.finished(stackTrace) on failure, ensuring the main process always receives a completion signal regardless of outcome.

---

CoroutineRuntime: fix MemoryMonitor polling thread leak on early failure

startMemoryPolling() was called before the try block. Any exception thrown before SplitApkPreparer.prepareIfNeeded() — such as from bundles(), PatchBundle.Loader.patches(), or an invalid bundle ID — would skip stopMemoryPolling(), leaving the polling thread running indefinitely.

Wrapped the entire execute() body in an outer try/finally to guarantee stopMemoryPolling() is always called. The inner try/finally for preparation.cleanup() is preserved.

---

PatcherWorker: fix wakelock not released if claimInput throws

wakeLock.acquire() was called before workerRepository.claimInput(). If claimInput() threw an exception the finally block was never reached, holding a partial wakelock for up to 10 minutes.

Moved claimInput() inside the try/finally block using lateinit var args so the wakelock is always released and args remains accessible after the block for the temporary file cleanup check.

PatcherWorker: remove duplicate MemoryMonitor calls

startMemoryPolling() was called in both PatcherWorker and inside CoroutineRuntime.execute(), causing two threads writing concurrently to the same @volatile fields (memoryUsedAverage, memoryUsedMax, memoryPollSamples), producing incorrect memory statistics.

stopMemoryPolling() was also redundantly called in PatcherWorker after already being called inside CoroutineRuntime.execute() and PatcherProcess.

Removed both redundant calls along with the now-unused MemoryMonitor import and usedCoroutineFallback variable. Memory monitor lifecycle is now managed entirely within each runtime implementation.

PatcherWorker: replace restricted API usage with public equivalent

Result.Success type check required @SuppressLint("RestrictedApi") as Result.Success is an internal androidx.work class. Replaced with a patchingSucceeded boolean flag checked against the public Result.success() value, removing the suppression annotation and its import.

PatcherWorker: log warning when temp APK cleanup fails

patchedApk.delete() silently ignored failures. Now logs a warning if the temporary patched APK cannot be deleted and still exists.

---

Session: remove unused nextPatchIndex variable

* chore: Update patcher

* chore: Update dependencies

* chore: Fix `Close` button style

* Add debug build

* Remove safe option

* Add back legacy packaging

* Remove aapt2 from manager

* bump patcher

---------

Co-authored-by: Eric Ahn <w@chill.dev>
SA-SUJON pushed a commit to SA-SUJON/MorpheManager that referenced this pull request May 24, 2026
# [1.16.0-dev.2](MorpheApp/morphe-manager@v1.16.0-dev.1...v1.16.0-dev.2) (2026-04-18)

### Features

* Add fast bytecode mode setting to expert mode ([MorpheApp#403](MorpheApp#403)) ([4bcd828](MorpheApp@4bcd828))
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.

bug: Patching fails on low end Android 10 and lower devices

3 participants