Skip to content

feat: Faster dex rebuilding + reduced memory requirements #108

Open
wchill wants to merge 4 commits intodevfrom
feat/optimized-dex-patching
Open

feat: Faster dex rebuilding + reduced memory requirements #108
wchill wants to merge 4 commits intodevfrom
feat/optimized-dex-patching

Conversation

@wchill
Copy link
Copy Markdown
Contributor

@wchill wchill commented Apr 6, 2026

Depends on MorpheApp/morphe-patcher#105

Reduces memory requirements for bytecode patches and speeds up dex rebuilding.

Adds flag --bytecode-mode which can be set to

  • FULL - the legacy behavior, rebuilds all dex files, requires the most time and memory
  • STRIP_FAST - the default for CLI, fastest with least memory requirements but produces bigger APK files
  • STRIP_SAFE - intended default for Manager, faster than FULL with somewhat reduced memory requirements, not as performant as STRIP_FAST, similar APK file size to FULL

@chihafuyu
Copy link
Copy Markdown

Hello there ~~
I am creating simple powershell script to patch morphe and crimera (piko). I am using this cli.jar https://github.com/MorpheApp/morphe-cli/actions/runs/24078851888/artifacts/6304612173

When I use arg --bytecode-mode and select STRIP_FAST (default for cli), patched X (twitter) crashing whenever I open it
Log below

Initializing ADB Logcat stream...
Mode: App Crash Detection (AndroidRuntime)
------------------------------------------------
--------- beginning of crash
04-07 17:00:54.944 10348 10348 E AndroidRuntime: FATAL EXCEPTION: main
04-07 17:00:54.944 10348 10348 E AndroidRuntime: Process: com.twitter.android, PID: 10348
04-07 17:00:54.944 10348 10348 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate application com.twitter.app.TwitterApplication package com.twitter.android: java.lang.ClassNotFoundException: Didn't find class "com.twitter.app.TwitterApplication" on path: DexPathList[[zip file "/data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/base.apk"],nativeLibraryDirectories=[/data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/lib/arm64, /data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1522)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1443)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8155)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2658)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:107)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:249)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:337)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:9469)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:636)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.twitter.app.TwitterApplication" on path: DexPathList[[zip file "/data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/base.apk"],nativeLibraryDirectories=[/data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/lib/arm64, /data/app/~~JiUOvhIPm4D3Hvb992GFNw==/com.twitter.android-nGP60pEVRP4Z9wfHjST0hA==/base.apk!/lib/arm64-v8a, /system/lib64, /system_ext/lib64]]
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:642)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:578)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.AppComponentFactory.instantiateApplication(AppComponentFactory.java:76)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.Instrumentation.newApplication(Instrumentation.java:1355)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1515)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	... 11 more
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	Suppressed: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/b$c;
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 		at java.lang.VMClassLoader.findLoadedClass(Native Method)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 		at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:1281)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 		at java.lang.ClassLoader.loadClass(ClassLoader.java:626)
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 		... 15 more
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 	Caused by: java.lang.ClassNotFoundException: androidx.work.b$c
04-07 17:00:54.944 10348 10348 E AndroidRuntime: 		... 18 more

But, when I select FULL (legacy behavior), patched X (twitter) is not crashed, opening normally.
This crash, is not happened on another apps like (morphe yt, yt music and reddit), also crimera (piko) instagram. Only on X (twitter) it crashed.

@wchill
Copy link
Copy Markdown
Contributor Author

wchill commented Apr 7, 2026

Do you see this with STRIP_SAFE?

@chihafuyu
Copy link
Copy Markdown

Do you see this with STRIP_SAFE?

Still crashing
Here for the crash log:

Initializing ADB Logcat stream...
Mode: App Crash Detection (AndroidRuntime)
------------------------------------------------
--------- beginning of crash
04-08 07:11:08.974 12736 12736 E AndroidRuntime: FATAL EXCEPTION: main
04-08 07:11:08.974 12736 12736 E AndroidRuntime: Process: com.twitter.android, PID: 12736
04-08 07:11:08.974 12736 12736 E AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/functions/Function0;
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at com.twitter.app.di.ComponentFactory.b(Unknown Source:0)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at androidx.core.app.b.instantiateApplication(Unknown Source:0)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.Instrumentation.newApplication(Instrumentation.java:1355)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1515)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.LoadedApk.makeApplicationInner(LoadedApk.java:1443)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:8155)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2658)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:107)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.os.Looper.loopOnce(Looper.java:249)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:337)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:9469)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:636)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1005)
04-08 07:11:08.974 12736 12736 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: kotlin.jvm.functions.Function0
04-08 07:11:08.974 12736 12736 E AndroidRuntime: 	... 15 more

------------------------------------------------
Logcat capture stopped.

Full patching log:

============================================================
>>> LOG FOR: X_Twitter (v11.79.0-release.0) <<<
============================================================

INFO: Loading patches 
INFO: Reading options from x-twitter-options-dev.json 
INFO: Merging split APK bundle 
INFO: Extracting to: C:\Apks\Piko\Input\tmp_dd221af1 
INFO: Searching apk files ... 
INFO: Found apk files: 36 
INFO: Found modules: 36 
INFO: Merging: base 
INFO: Added [base] classes.dex -> classes.dex 
INFO: Added [base] classes2.dex -> classes2.dex 
INFO: Added [base] classes3.dex -> classes3.dex 
INFO: Added [base] classes4.dex -> classes4.dex 
INFO: Added [base] classes5.dex -> classes5.dex 
INFO: Added [base] classes6.dex -> classes6.dex 
INFO: Added [base] classes7.dex -> classes7.dex 
INFO: Added [base] classes8.dex -> classes8.dex 
INFO: Added [base] classes9.dex -> classes9.dex 
INFO: Added [base] classes10.dex -> classes10.dex 
INFO: Added [base] classes11.dex -> classes11.dex 
INFO: Added [base] classes12.dex -> classes12.dex 
INFO: Added [base] classes13.dex -> classes13.dex 
INFO: Added [base] classes14.dex -> classes14.dex 
INFO: Merging: split_config.sv 
INFO: Merging: split_config.ko 
INFO: Merging: split_config.arm64_v8a 
INFO: Merging: split_config.in 
INFO: Merging: split_config.ms 
INFO: Merging: split_config.vi 
INFO: Merging: split_config.th 
INFO: Merging: split_config.ar 
INFO: Merging: split_config.ja 
INFO: Merging: split_config.xxhdpi 
INFO: Merging: split_config.it 
INFO: Merging: split_config.xxxhdpi 
INFO: Merging: split_config.en 
INFO: Merging: split_config.mdpi 
INFO: Merging: split_config.es 
INFO: Merging: split_config.iw 
INFO: Merging: split_config.zh 
INFO: Merging: split_config.fi 
INFO: Merging: split_config.ru 
INFO: Merging: split_config.x86 
INFO: Merging: split_config.pt 
INFO: Merging: split_config.de 
INFO: Merging: split_config.hi 
INFO: Merging: split_config.x86_64 
INFO: Merging: split_config.pl 
INFO: Merging: split_config.nl 
INFO: Merging: split_config.tr 
INFO: Merging: split_config.ldpi 
INFO: Merging: split_config.tvdpi 
INFO: Merging: split_config.xhdpi 
INFO: Merging: split_config.uk 
INFO: Merging: split_config.fr 
INFO: Merging: split_config.hdpi 
INFO: Merging: split_config.armeabi_v7a 
INFO: Merging: split_config.hu 
INFO: Validating resources dir ... 
INFO: Clearing META-INF ... 
INFO: Sanitizing manifest ... 
INFO: Setting extractNativeLibs=false 
INFO: Writing apk ... 
INFO: Buffering compress changed files ... 
INFO: Writing files: 7521 
INFO: Saved to: C:\Apks\Piko\.\Output\com.twitter.android-11.79.0-release.0-311790000-universal-merged.apk 
INFO: Setting patch options 
INFO: "Bring back twitter" disabled via options file 
INFO: "Disunify xchat system" disabled via options file 
INFO: "Dynamic color" disabled via options file 
INFO: "Browse tweet object" disabled via options file 
INFO: "Export all activities" disabled via options file 
INFO: Decoding all resources 
INFO: Sanitizing unpatched strings 
INFO: Escaping strings 
INFO: Executing patches 
INFO: "Add ability to copy media link" succeeded 
INFO: "Change app icon" succeeded 
INFO: "Change version code" succeeded 
INFO: "Clear tracking params" succeeded 
INFO: "Control video auto scroll" succeeded 
INFO: "Custom download folder" succeeded 
INFO: "Custom emoji font" succeeded 
INFO: "Custom font" succeeded 
INFO: "Custom sharing domain" succeeded 
INFO: "Customise post font size" succeeded 
INFO: "Customize Inline action Bar items" succeeded 
INFO: "Customize Navigation Bar items" succeeded 
INFO: "Customize default reply sorting" succeeded 
INFO: "Customize explore tabs" succeeded 
INFO: "Customize notification tabs" succeeded 
INFO: "Customize profile tabs" succeeded 
INFO: "Customize search suggestions" succeeded 
INFO: "Customize search tab items" succeeded 
INFO: "Customize side bar items" succeeded 
INFO: "Customize timeline top bar" succeeded 
INFO: "Delete from database" succeeded 
INFO: "Disable auto timeline scroll on launch" succeeded 
INFO: "Disable chirp font" succeeded 
INFO: "Download patch" succeeded 
INFO: "Enable PiP mode automatically" succeeded 
INFO: "Enable Undo Posts" succeeded 
INFO: "Enable debug menu for posts" succeeded 
INFO: "Enable force HD videos" succeeded 
INFO: "Force enable translate" succeeded 
INFO: "Handle custom twitter links" succeeded 
INFO: "Hide Banner" succeeded 
INFO: "Hide Community Notes" succeeded 
INFO: "Hide FAB" succeeded 
INFO: "Hide FAB Menu Buttons" succeeded 
INFO: "Hide Live Threads" succeeded 
INFO: "Hide Recommended Users" succeeded 
INFO: "Hide badges from navigation bar icons" succeeded 
INFO: "Hide bookmark icon in timeline" succeeded 
INFO: "Hide community badges" succeeded 
INFO: "Hide followed by context" succeeded 
INFO: "Hide hidden replies" succeeded 
INFO: "Hide immersive player" succeeded 
INFO: "Hide nudge button" succeeded 
INFO: "Hide post metrics" succeeded 
INFO: "Hide promote button" succeeded 
INFO: "Hide recommendation items" succeeded 
INFO: "Hook feature flag" succeeded 
INFO: "Import/Export login token" succeeded 
INFO: "Legacy share links" succeeded 
INFO: "Log server response" succeeded 
INFO: "Native downloader" succeeded 
INFO: "Native reader mode" succeeded 
INFO: "Native translator" succeeded 
INFO: "No shortened URL" succeeded 
INFO: "Pause search suggestions" succeeded 
INFO: "Remove Ads" succeeded 
INFO: "Remove premium upsell" succeeded 
INFO: "Remove search suggestions" succeeded 
INFO: "Remove view count" succeeded 
INFO: "Round off numbers" succeeded 
INFO: "Selectable Text" succeeded 
INFO: "Share Tweet as Image" succeeded 
INFO: "Show changelogs" succeeded 
INFO: "Show poll results" succeeded 
INFO: "Show post source label" succeeded 
INFO: "Show sensitive media" succeeded 
INFO: Compiling patched dex files (mode: STRIP_SAFE) 
INFO: Writing 378 modified/new classes to new DEX files 
INFO: Rebuilding DEX: classes.dex (stripping 2 modified classes, keeping 16618) 
INFO: Rebuilding DEX: classes7.dex (stripping 1 modified classes, keeping 16956) 
INFO: Rebuilding DEX: classes8.dex (stripping 1 modified classes, keeping 7026) 
INFO: Rebuilding DEX: classes9.dex (stripping 9 modified classes, keeping 19060) 
INFO: Rebuilding DEX: classes10.dex (stripping 11 modified classes, keeping 19667) 
INFO: Rebuilding DEX: classes11.dex (stripping 19 modified classes, keeping 14189) 
INFO: Rebuilding DEX: classes12.dex (stripping 30 modified classes, keeping 19074) 
INFO: Compiling modified resources 
INFO: Stripping libs (keeping architectures arm64-v8a) 
INFO: Stripped 88 lib files 
INFO: Unescaping strings 
INFO: Processing aapt macros 
INFO: Generating new resource IDs 
INFO: Writing resource APK 
INFO: Aligning APK 
INFO: Signing APK 
INFO: Saved to C:\Apks\Piko\.\Output\X_Twitter_Piko_11.79.0-release.0-arm64-v8a.apk 
INFO: Purging temporary files 
INFO: Purged resource cache directory 

I am using this apkm bundle for (piko) twitter: https://www.apkmirror.com/apk/x-corp/twitter/x-11-79-0-release-0-release/x-11-79-0-release-0-android-apk-download/

@wchill
Copy link
Copy Markdown
Contributor Author

wchill commented Apr 8, 2026

Okay, so probably an issue somewhere with writing the modified classes to new dex files. Will take a look soon

@chihafuyu
Copy link
Copy Markdown

Okay, so probably an issue somewhere with writing the modified classes to new dex files. Will take a look soon

Okay.

@chihafuyu
Copy link
Copy Markdown

chihafuyu commented Apr 8, 2026

I get another bug with this PR
I am patching yt, ytm, and reddit. For yt and ytm, cli can not purge temp. files even without include --bytecode-mode parameter, but for reddit does. I am thinking of if you patching universal .apk, cli can not purge but if you patching bundles, cli does.

Then I testing this cli https://github.com/MorpheApp/morphe-cli/releases/tag/v1.6.4-dev.2
All works, can purge all apps which I am patching.

@wchill
Copy link
Copy Markdown
Contributor Author

wchill commented Apr 8, 2026

You are running on Windows, correct? The dex files are locked while the CLI is running, so the temporary files directory cannot be cleaned up until the dex files are closed or the CLI exits.

Please open a separate issue for this. I am doing development on Linux where file I/O semantics are different.

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.

3 participants