5,595,918 Members 30,808 Now Online
XDA Developers Android and Mobile Development Forum

Making "Stock" Custom ROMs Defunct (XposedFramework) - Tweaks for any ROM Version

Tip us?
 
pulser_g2
Old
(Last edited by pulser_g2; 9th January 2013 at 10:33 PM.)
#1  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Default Making "Stock" Custom ROMs Defunct (XposedFramework) - Tweaks for any ROM Version

Introduction


Recently it has dismayed me how, across the Android Community, people seem to feel that it's necessary to run a "Custom ROM" in order to get improvements and changes to your ROM. Of course, some of you know it's possible to modify the APK files directly to change things, but these changes need to be done every time your base ROM is updated. Once Samsung starts leaking out updates to 4.2 like a sieve, you guys will be all over them, needing to update your patches and tweaks every time.

Anyway, seeing this displeases me, as it encourages people to see "Custom ROMs" as a commodity, and something you consume. In essence, users were getting their "fix" of tweaks from their "chef", but not learning how to do it themselves, nor realising their beloved chef isn't doing anything magical. In fact, their chef is likely decompiling the applications, and using baksmali/apktool to take apart the app, hard-code in their changes, then rebuild it. This method has worked well for 3 years, but it's been in need of an update for some time.

The Enlightenment

Then I saw this thread by rovo89. That man deserves a beer for every Android user there is, for his work on the Xposed Framework! His and Tungstwenty's work on this has made it possible to modify the core Android system, without doing any actual modifying of applications.

OK... Why are you telling me this?

This invention seems to have pretty much gone unnoticed by the world. The reasons this is vastly superior to any other way of making modifications to apps and the system are:
  • Your modifications are not tied into a single version of the APK or app or framework. If the ROM is updated, the patch should still work perfectly on the new version of the app (this doesn't necessarily apply across major updates like 4.1 to 4.2, but should be fine across 4.1.0 to 4.1.2 style changes).
  • You are not actually modifying any files on the phone! If something goes wrong, you can just disable the support for the framework, and the tweaks will do nothing. As such, it's easier to get a working phone if something dies - in fact there is a ZIP placed on your SD for this very purpose. Just flash it in CWM and it will disable the framework.
  • As no actual files are being modified, it doesn't matter if your ROM is odexed, deodexed, or a bit of both (ie. certain apps deodexed, but frameworks odexed). With this, there is no reason to run a deodexed ROM, since you can change pretty much everything you want to without touching the raw files. So leave them as odex files and you'll not have any problems. Bear in mind we deodex to allow easier customisation, odexed is actually slightly faster, and removes the majority of the dexopt process on first boot.
  • No application signatures are modified, as the apps are not touched, so if you were to use this to modify an app like Maps or Gmail, you won't get issues when trying to update to a new version of the app via the market.

The only way this can succeed is for you to try it. I usually run a "custom ROM" on my phone. For the first time ever, I've been using a stock ROM for a significant period of time. On the Note2 in particular, Samsung is really getting good at this. But they're not perfect. And as such, I started to look at using this to perfect their work.

When you run a custom ROM, look at what you're getting, and ask yourself why it doesn't use this method. I've only made one little modification so far, but it's one that annoys me hugely! The blooming SMS -> MMS conversion when you try to write any form of prose in a text message. I cannot stand the limitation of SMS to 160 characters, so the ability to chain together messages is a godsend to me. Unfortunately though, Google and Samsung seem to like to restrict you to 3 SMS messages worth of text before converting to an MMS message. Which is wonderful, except when you have totally unlimited SMS, but pay for MMS. As such, I was finding my ability to communicate in my usual verbose way somewhat hindered by the messaging app.

Alas that is no longer an issue. If you want to get started, here's how.

OK... How do I use this?
  1. Download and install the APK file from this post - http://forum.xda-developers.com/show....php?t=1574401. I have tested it on the N7100, it works fine. Run it, install the framework, grant it root (yes, this requires root!), and reboot. I have mirrored the APK below just in case of issues.
  2. Download and install the APK modification you want from http://www.villainrom.co.uk/forum/microdownloads/
  3. When you get a notification about enabling the modification (after the APK is installed), tap that notification, and enable the plugin by ticking the box.
  4. Reboot your phone
  5. Go test your modification

If you have any issues with this, please paste the contents of /data/xposed/debug.log on a pastebin site or in [code] tags.

How can I make my own modifications like this?

Will post this a bit later, along with the source of this plugin.

References
http://forum.xda-developers.com/show....php?t=1574401
Tungstwenty
Robo89

Sources
You can find the sources for Xposed Framework at https://github.com/rovo89
You can find the sources for all Xposed modifications I have made so far on Github:

Disable SMS -> MMS Conversion
Disable 100% Battery Notification
Enable Call Recording
Enable scrolling wallpaper in stock launcher
Make text in email app message list clearer to read (lighter) on the black background


Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following 271 Users Say Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
pulser_g2
Old
(Last edited by pulser_g2; 2nd January 2013 at 02:31 PM.)
#2  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Install the Xposed Framework from this thread: http://forum.xda-developers.com/show....php?t=1574401


Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following 67 Users Say Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
pulser_g2
Old
(Last edited by pulser_g2; 29th December 2012 at 10:19 AM.)
#3  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Default Modifications

OK so a few people suggested an addon repository... I have got one sorted
Downloads

http://www.villainrom.co.uk/forum/microdownloads/

I've added some of mine so far, but I won't add other people's - they can add them themselves, and maintain them

This system is vastly superior to a stickied forum thread, as you can update your own modification (as a developer), and as a user, receive notifications if a modification is updated.

Developers
Use a general title that describes what your modification does. Put in a version string too. I tend to use the format 1.0, 1.1, 1.2 etc, but this is up to you. You can add Alpha or Beta or other designations if you wish.

For author, pop in your name or username. And enter a brief description of what the modification does (which will appear in the index)
Click Categories/Agreements, and select which category the modification falls under. If you think there's a category which should be added, let me know.

Under Full Description, you can enter a detailed description of your modification. Finally, under File Options, use File to Upload to select your APK file. You can optionally add an Image to Upload. The Use File URL should be set to no, and the File URL box left blank.

Users
  • There is no need to register an account to download files from the repository. If you wish to receive notifications of updates, you can register an account - just hit the red "Log in or Sign up" button - you can use a Twitter or Google account if you want, or just make a plain account. It makes no difference.
  • Head across to http://www.villainrom.co.uk/forum/microdownloads/ and have a look at the modifications you want.
  • Click watch file (at the bottom right) if you want notifications about updates to a modification
  • Click Report to report a modification for being malicious or problematic.
  • Click "add comment" to discuss or comment on the modification, or leave a "review" or feedback
  • Click on the stars under (0 votes) to leave a star rating on the modification, which will help generate most popular lists on the main page.

Click to see licence details of mine:
 


Feel free to use these as you wish, for non-commercial purposes. You may share these for personal use. Note that distribution in any kind of "package" or "custom ROM" is not personal use. Sending a friend a copy is personal use, feel free to do that and share the love.

Feel free to make changes to the source code of the modifications if you think you can improve them, provided you make your changes available in a similar manner. If you fix a bug or error, please send a pull request.

If you wish to use these commercially, please contact me. This includes in any "distribution package", be it a ROM, app, store, marketplace or other package. That's not in the spirit of this project, so get in touch with me and we'll discuss it.

Tl;dr:

End users, have fun, use these, enjoy them, share them, tweak them, just be sure to share your source changes and/or send a pull request if you improve something!

"Custom ROM" Developers, and anyone wanting to try to use these for commercial purposes: Don't. These are to encourage people to learn about these changes, so contact me if you want to do something else with them. Commercial use, including distribution in "Custom ROMs" is not permitted.


Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following 77 Users Say Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
pulser_g2
Old
(Last edited by pulser_g2; 25th November 2012 at 01:38 PM.)
#4  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Default How to make your own such modification

This information is NOT complete. This example only uses 1 of about 10 different types of modification. I have spoken to rovo89 and he has said it would probably be possible to document this further. This example covers ONE usage case - I am going to override an entire method.

1. Create a new empty Android project in Eclipse.
2. Within the "application" section of your AndroidManifest.xml, add the following metadata:

Code:
        <meta-data android:name="xposedmodule" android:value="true"/>
        <meta-data android:name="xposedminversion" android:value="2.0rc1.*" />
3. Within the assets folder of the project, add a plain text file, "xposed_init". Within this, I have put

Code:
uk.co.villainrom.pulser.allowlongsms.AllowLongSMS
uk.co.villainrom.pulser.allowlongsms is the PACKAGE name of my Java package. AllowLongSMS is my class name. The purpose of this is to tell the Xposed Framework what to run.

4. Within AllowLongSMS.java (ie. the class name, with .java on the end), I put the following code:

PHP Code:
package uk.co.villainrom.pulser.allowlongsms//this sets the package for our project, this is the first part of the value in xposed_init file in assets.

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

//above includes all the required parts of the xposed framework that we need here

public class AllowLongSMS implements IXposedHookLoadPackage {        //here we declare the class AllowLongSMS. We say it implements IXposedHookLoadPackage, as we want to make use of the hook-in on package load. Other options are available here for working with native libs etc, and resources, but I'm not using these right now.
    
public static final String MY_PACKAGE_NAME AllowLongSMS.class.getPackage()
            .
getName();     //this doesn't do anything, I just left it here for if I needed to write logs and wanted to have the package name easily accessible.
    
public static final String TAG "PulserMmsTweak";   //same here, this doesn't do anything.

    
@Override //we are going to override the method handleLoadPackage, if it exists further up the hierarchy
    
public void handleLoadPackage(LoadPackageParam lpparamthrows Throwable 
        
//this method is called every time a package is loaded. We have a parameter that we're going to call lpparam, that is passed in, that relates to what package was loaded
        
if (lpparam.packageName.equals("com.android.mms")) { //if the package that has just been loaded is called "com.android.mms" then
            
ClassLoader classLoader lpparam.classLoader//create a classloader object that we can now use
            
XC_MethodReplacement methodreplacer = new XC_MethodReplacement() {  //create a method replacer object, as we are going to REPLACE an entire method within the mms app.
                
protected Object replaceHookedMethod//we make an object here, that passes in the parameters of what to actually change
                        
XC_MethodHook.MethodHookParam paramAnonymousMethodHookParam)
                        
throws Throwable {
                    return 
Integer.valueOf(255);  
                    
/* THIS IS THE IMPORTANT LINE
                     * This line returns the value 255. Why this happens won't make sense yet, but THIS is where you put your "new method" code.
                     * 
                    */
                    
                
}
            };
            
XposedHelpers.findAndHookMethod("com.android.mms.MmsConfig",  //here we say that we want to find and hook into the method "getSMSToMmsTextThreshold" which is part of the class com.android.mms.MmsConfig. We then say that we're passing this to methodreplacer, which we defined earlier
                    
classLoader"getSmsToMmsTextThreshold"methodreplacer);
        }
                
//if the package wasn't com.android.mms, do nothing.

    
}




Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following 34 Users Say Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
jerdog
Old
#5  
jerdog's Avatar
Developer Committee / OEM Relations / XDA News Writer - Harbinger of Doom
Thanks Meter 3896
Posts: 5,598
Join Date: May 2007
Location: Gallifrey; Likes: Family,XDA,Coffee,Android,Intelligence Dislikes: Self-entitled twits and id10ts
Awesome work mate. Wish I had a Note 2 to check this on.

EDIT: Wait.. I can use this on any device! Rock on. Thanks!


 

Quote:
Notify your physician if after exposure to XDA n00bs you experience any of the following symptoms: rapid or irregular heartbeat, chest pain, shortness of breath, leg cramps, headache, nervousness, irritability, sleeplessness, tremors, change in appetite, weight gain or loss, vomiting, diarrhea, excessive sweating, heat intolerance, fever, changes in menstrual periods, hives or skin rash, or any other unusual medical event.

BTC: 131x7i37dEsDmQpy1T1tz34Mc8wtRUHuoa
The Following User Says Thank You to jerdog For This Useful Post: [ Click to Expand ]
 
chaitanya87
Old
#6  
Senior Member
Thanks Meter 140
Posts: 600
Join Date: Jul 2011
Location: Hyderabad
Wow this is great post. While reading this it makes me learn something like what is going on in background.

Sent from my GT-N7100 using Tapatalk 2
 
simone201
Old
#7  
simone201's Avatar
Recognized Developer
Thanks Meter 4902
Posts: 4,752
Join Date: Sep 2010
Location: Lecco

 
DONATE TO ME
Thanks for continuing that amazing project pulser!!

I think i'm going to create some small apks for some stuff very soon (and release them of course).

Cool stuff as always pulser, keep it up

Support my Work, Please
The Following User Says Thank You to simone201 For This Useful Post: [ Click to Expand ]
 
pulser_g2
Old
#8  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Quote:
Originally Posted by simone201 View Post
Thanks for continuing that amazing project pulser!!

I think i'm going to create some small apks for some stuff very soon (and release them of course).

Cool stuff as always pulser, keep it up
The original guys are not gone, was talking to them recently

There's scarce documentation so far on this, but I will see what else I can do with it... I might make post 2 a repository of these APKs for now...


Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following User Says Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
pulser_g2
Old
#9  
pulser_g2's Avatar
Developer Admin / Senior Recognized Developer - OP
Thanks Meter 10594
Posts: 19,214
Join Date: Nov 2009
Quote:
Originally Posted by chaitanya87 View Post
Wow this is great post. While reading this it makes me learn something like what is going on in background.

Sent from my GT-N7100 using Tapatalk 2
That's the intention Glad it worked! This is about learning, and not just "using".

Sure, you can download the APK and use it, but that's no better than just downloading some zipkang ROM that claims it does everything including making your morning coffee... This is about taking a look at HOW it works too That way people can make their own tweaks and share them!


Having trouble getting an answer? | What is XDA about? | How to ask for help?

if [ $PM.incoming.type = $type.question.ROM.how_to_use ] || [ $PM.incoming.type = $type.question.ROM.silly_question ]; then mv $PM.incoming /.trash; PM.response($responsetype.ignore); $PM.sender.ignore_in_future=true; init.sequence($boy_who_cried_wolf); fi;

BTC: 1K2fpDsRHkirWmk3PKiqtzhVHKUJCWPWnN
PGP: 0x260F4FDEF258E3C4
The Following 9 Users Say Thank You to pulser_g2 For This Useful Post: [ Click to Expand ]
 
simone201
Old
#10  
simone201's Avatar
Recognized Developer
Thanks Meter 4902
Posts: 4,752
Join Date: Sep 2010
Location: Lecco

 
DONATE TO ME
Quote:
Originally Posted by pulser_g2 View Post
The original guys are not gone, was talking to them recently

There's scarce documentation so far on this, but I will see what else I can do with it... I might make post 2 a repository of these APKs for now...
A small repo for APKs would be really cool and useful for users....

tell me if i can contribute in some ways (i'm an app dev mainly also)

Support my Work, Please

The Following 2 Users Say Thank You to simone201 For This Useful Post: [ Click to Expand ]
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes