Robust
Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without publishing apk.
Environment
- Mac Linux and Windows
- Gradle 2.10+
- Java 1.7 +
Usage
-
Add below codes in the module's build.gradle.
apply plugin: 'com.android.application' //please uncomment fellow line before you build a patch //apply plugin: 'auto-patch-plugin' apply plugin: 'robust' compile 'com.meituan.robust:robust:0.3.8'
-
Add below codes in the outest project's build.gradle file.
buildscript { repositories { jcenter() } dependencies { classpath 'com.meituan.robust:gradle-plugin:0.3.8' classpath 'com.meituan.robust:auto-patch-plugin:0.3.8' } }
-
There are some configure items in app/robust.xml,such as classes which Robust will insert code,this may diff from projects to projects.Please copy this file to your project.
Advantages
- Support 2.3 to 7.X Android OS
- Perfect compatibility
- Patch takes effect without reboot
- Support fixing at method level,including static methods
- Support add classes and methods
- Suport ProGuard,including inline methods or changing methods' signure
When you build APK,you may need to save mapping.txt and files in build/outputs/robust/methodsMap.robust.
AutoPatch
AutoPatch will generate patch for Robust automatically. You just need to fellow below steps to genrate patches. For more details please visit website http://tech.meituan.com/android_autopatch.html
Steps
-
Put 'auto-patch-plugin' just behind 'com.android.application',but in the front of others plugins。like this:
apply plugin: 'com.android.application' apply plugin: 'auto-patch-plugin'
-
Put mapping.txt and methodsMap.robust which are generated when you build the apks in diretory app/robust/,if not exists ,create it!
-
After modifying the code ,please put annotation
@Modify
on the modified methods or invokeRobustModify.modify()
(designed for Lambda Expression )in the modified methods:@Modify protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // protected void onCreate(Bundle savedInstanceState) { RobustModify.modify() super.onCreate(savedInstanceState); }
Use annotation
@Add
when you neeed to add methods or classes.//add method @Add public String getString() { return "Robust"; } //add class @Add public class NewAddCLass { public static String get() { return "robust"; } }
-
After those steps,you need to run the same gradle command as you build the apk,then you will get patches in directory app/build/outputs/robust/patch.jar.
-
Generating patches always end like this,which means patches is done
Demo Usage
-
Excute fellow command to build apk:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
After install apk on your phone,you need to save mapping.txt and app/build/outputs/robust/methodsMap.robust
-
Put mapping.txt and methodsMap.robust which are generated when you build the apks into diretory app/robust/,if directory not exists ,create it!
-
After modifying the code ,please put annotation
@Modify
on the modified methods or invokeRobustModify.modify()
(designed for Lambda Expression )in the modified methods. -
Run the same gradle command as you build the apk:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
Generating patches always end like this,which means patches is done
-
Copy patch to your phone:
adb push ~/Desktop/code/robust/app/build/outputs/robust/patch.jar /sdcard/robust/patch.jar
patch directory can be configured in
PatchManipulateImp
. -
Open app,and click Patch button,patch is used.
-
Also you can use our sample patch in app/robust/sample_patch.jar ,this dex change text after you click Jump_second_Activity Button.
-
In the demo ,we change the text showed on the second activity which is configured in the method
getTextInfo(String meituan)
in classSecondActivity
Attentions
-
You should modify inner classes' priavte constructors to public modifier.
-
AutoPatch cannot handle situations which method returns this,you may need to wrap it like belows:
method a(){ return this; }
changed to
method a(){ return new B().setThis(this).getThis(); }
-
Not Support add fields,but you can add classes currently, this feature is under testing.
-
Classes added in patch should be static nested classes or non-inner classes,and all fields and methods in added class should be public.
-
Support to fix bugs in constructors currently is under testing.
-
Not support methods which only use fields,without method call or new expression.
-
Support to resources and so file is under testing.
-
For more help, please visit Wiki