Robust is an Android HotFix solution with high compatibility and high stability. Robust can fix bugs immediately without publishing apk.
More help on Wiki
- Mac Linux and Windows
- Gradle 2.10+ , include 3.0
- Java 1.7 +
- 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.4.99'
-
Add below codes in the outest project's build.gradle file.
buildscript { repositories { jcenter() } dependencies { classpath 'com.meituan.robust:gradle-plugin:0.4.99' classpath 'com.meituan.robust:auto-patch-plugin:0.4.99' } }
-
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.
- Support 2.3 to 10 Android OS
- Perfect compatibility
- Patch takes effect without a reboot
- Support fixing at method level,including static methods
- Support add classes and methods
- Support ProGuard,including inline methods or changing methods' signature
When you build APK,you may need to save "mapping.txt" and the files in directory "build/outputs/robust/".
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
-
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
The apk and patch.jar have been pre-compiled in the app/robust
folder, and the patch effect can be previewed.
-
Install the apk in the
app/robust
. -
Open the App, click
Jump_second_Activity
, you can see thaterror occur
appears. -
Push the patch to the specified directory
adb push ~/Desktop/code/robust/app/build/outputs/robust/patch.jar /sdcard/robust/patch.jar
-
Open the App and click the
Patch
button to load the patch. -
Click
Jump_second_Activity
again, you can seeerror fixed
is displayed.
-
You can delete all files in
app/robust
, which are pre-compiled sample files. -
Generate a sample apk and execute the gradle command:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
Install the compiled apk
app/build/outputs/apk/app-release.apk
. Save theapp/build/outputs/mapping/release/mapping.txt
file and theapp/build/outputs/robust/methodsMap.robust
file -
After modifying the code, add @Modify annotation or call RobustModify.modify() method
- Here you can modify the return value of the method
getTextInfo()
of the classSecondActivity
, and make a patch.
- Here you can modify the return value of the method
-
Modify the header of the
app/build.gradle
file to use plugins.// Uncomment the following line apply plugin:'auto-patch-plugin'
-
Put the saved mapping.txt and methodsMap.robust in the
app/robust
folder, create the folder if not exist. -
Execute the same gradle command as the generated the sample apk:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
After the patch is successfully made, the apk will stop building, and a prompt similar to the following appears, indicating that the patch is successfully generated
-
Copy the patch file to the phone directory
/sdcard/robust
adb push ~/Desktop/code/robust/app/build/outputs/robust/patch.jar /sdcard/robust/patch.jar
The patch path
/sdcard/robust
is specified inPatchManipulateImp
-
Open the App and click
Jump_second_Activity
to preview the display text of the Activity before modification. -
Click the
Patch
button to load the patch. -
Click
Jump_second_Activity
, you can see that the display text of Activity has been modified.
-
You should modify inner classes' private 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
Copyright 2017 Meituan-Dianping
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.