This is Xposed version 2.4 beta1.
The main new features and fixes in this version are:
- Support for Android 4.4 (KitKat)
- Significant performance improvements of the framework
- Viewer for the debug.log in the installer
- Check in the installer whether Xposed is actually active and working
First of all, I would like to thank the 45 people who donated to get me a Nexus 5
, from a little "thanks" to huge amounts of money. I was really impressed and hope you like this update.
Xposed should now fully support KitKat
. As mentioned, that wouldn't have been possible at this time without your support.
Modules should continue to work if they don't rely on AOSP internals that have changed in KitKat. One example: It seems that the battery icon is no longer an (animated) image, but a Java implementation. Obviously, any modules that try to replace the battery image will no longer work. The Xposed framework can't do anything here, the module needs to be rewritten. Therefore, if some of your modules don't work, please get in contact with the module author first. You will probably see an error in the new debug.log viewer in this case.
Xposed isn't compatible with ART
, I can't say yet whether it will be in the future (will require a major rewrite if possible at all). As you would get into a bootloop if you try to combine Xposed+ART, Xposed automatically resets the choice to "Dalvik". If you want to test ART, you must uninstall the framework.
The performance improvements
apply to the very core of Xposed, the method hooks, in all Android versions. In a test app developed by @exidler
, the overhead per call used to be ~71 μs (= 0.071 ms) per call to a hooked method (with one empty callback handler) on my Galaxy S2. Now it's ~13 μs (= 0.013 ms). That's a relative improvement of factor ~5.5x. Thanks to @exidler
for the research and several suggestions! I have sent a pre-beta to @kamso
, who had reported lags with older versions. Now everything works fine for him. Anyway, I wouldn't say that Xposed had bad performance before. Keep in mind that we are talking about significantly less than a millisecond here.
The debug.log viewer
should give a quick impression whether Xposed and modules could be loaded fine. It also includes options to save the log to SD card (so it's easier to transfer it to a PC etc.) and send it via mail.
The Xposed Installer now checks whether the latest version of the framework is active. If not (e.g. because it's not installed yet, you forgot to reboot or something in Xposed doesn't work), you will see a warning in the welcome screen and at the top of the module list.
Finally, there were some other minor improvements and fixes and new/updated translations.
As a reminder, please keep the debug.log clean
. It's only helpful if it's not as spammed as logcat. You should only use XposedBridge.log() for error messages and other unexpected situations. If everything runs fine, it shouldn't write anything to the log. If you really need to keep some logging in published builds, please use either logcat or make it an opt-in options (i.e. disabled by default and the user enables it if he runs into problems).
Apart from that, there was a little API change
I assume that very few modules use the "extra" field to transfer information between beforeHookedMethod() and afterHookedMethod(). If you do, simply replace it by getExtra().
Layout inflation hooks
now also work if the layout has been included in other layouts. That's actually a pretty tricky
use-case for the "extra" parameter mentioned about (and other tricky technologies).
If for some reason you need to determine the active XposedBridge version
in your module, you can use XposedBridge.XPOSED_BRIDGE_VERSION.
findMethodBestMatch() now also looks for protected and package-private methods in superclasses. That's mainly useful if you use the callMethod() or callStaticMethod() helper.
The new beta should fix the "read-only filesystem
" errors. If you used to experience them, please try this version. Otherwise, there is no need (and no advantage) to update.
The final version is out, please use it instead (see first post / in-app installer).