Android開源:Robust - 美團點評出品的新一代熱更新系統
Robust
新一代熱更新系統Robust,對Android版本無差別兼容。無需發版就可以做到隨時修改線上bug,快速對重大線上問題作出反應,補丁修補成功率高達99.9%。
環境
- Mac or Linux
- Gradle 2.10+
- Java 1.7 +
使用方法
-
在App的build.gradle,加入如下依賴
apply plugin: 'com.android.application' //制作補丁時將這個打開,auto-patch-plugin緊跟著com.android.application //apply plugin: 'auto-patch-plugin' apply plugin: 'robust'
compile 'com.meituan.robust:robust:0.3.0'</code></pre> </li>
在整個項目的build.gradle加入classpath
buildscript { repositories { jcenter() } dependencies { classpath 'com.meituan.robust:gradle-plugin:0.3.0' classpath 'com.meituan.robust:auto-patch-plugin:0.3.0' } }
需要在項目的src同級目錄下配置部分配置robust.xml文件,具體項請參考 app/robust.xml ,在這里面有多個配置項。
優勢
- 支持Android2.3-7.X版本
- 高兼容性、高穩定性,修復成功率高達三個九
- 補丁下發立即生效,不需要重新啟動
- 支持方法級別的修復,包括靜態方法
- 支持增加方法和類
- 支持ProGuard的混淆、內聯、優化等操作
需要保存打包時生成的mapping文件以及 build/outputs/robust/methodsMap.robust 文件。
AutoPatch
Robust補丁自動化,為Robust自動生成補丁,使用者只需要提交修改完bug后的代碼,運行和線上apk打包同樣的gradle命令即可,會在項目的app/build/outputs/robust目錄下生成補丁。
使用方法
-
使用插件時,需要把auto-patch-plugin放置在com.android.application插件之后,其余插件之前。
apply plugin: 'com.android.application' apply plugin: 'auto-patch-plugin'
-
將保存下來的mapping文件和methodsMap.robust文件放在app/robust/文件夾下。
-
修改代碼,在改動的方法上面添加**@Modify**注解或者在修改的方法里面調用RobustModify.modify()(針對Lambda表達式)
@Modify protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } //或者是被修改的方法里面調用RobustModify.modify()方法 protected void onCreate(Bundle savedInstanceState) { RobustModify.modify() super.onCreate(savedInstanceState); }
新增的方法和字段使用 @Add 注解
//增加方法 @Add public String getString() { return "Robust"; } //增加類 @Add public class NewAddCLass { public static String get() { return "robust"; } }
-
運行和生成線上apk同樣的命令,即可生成補丁,補丁目錄app/build/outputs/robust/patch.jar
樣例使用:
-
生成樣例apk,執行gradle命令:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
安裝生成的apk。保存mapping.txt文件以及app/build/outputs/robust/methodsMap.robust文件
-
修改代碼之后,加上**@Modify**注解或者調用指定的方法
-
把保存的mapping.txt和methodsMap.robust放到app/robust目錄下
-
執行和打包相同的gradle命令:
./gradlew clean assembleRelease --stacktrace --no-daemon
-
將補丁文件copy到手機上:
adb push /Users/zhangmeng/Desktop/code/robust/app/build/outputs/robust/patch.jar /sdcard/robust/patch_temp.jar
手機上補丁的路徑是 PatchManipulateImp 中指定的
-
打開App,點擊Patch按鈕就會加載補丁。
-
也可以加載app/robust的樣例dex,修改了Jump_second_Activity跳轉Activity的顯示文字。
-
補丁加載之后每次都會刪除,再次運行需要重新copy補丁。
注意事項
-
內部類的構造方法是private(private會生成一個匿名的構造函數),這時需要在制作補丁過程中手動修改構造方法的訪問域,修改為public就好,根據ProGuard力度有關系
-
對于方法的返回值是this的情況無法處理,對builder模式支持并不是太好,在代碼編寫需要注意,可以增加一個類來包裝一下,
method a(){ return this; }
改為
method a(){ return new B().setThis(this).getThis(); }
-
暫時不支持增加字段,但是自動化補丁現在可以增加類
-
新增加的類不能是非靜態內部類(靜態的內部類可以),新增類中的方法和字段需要全部都是public的
-
對于只有字段的訪問的函數無法修復
-
不支持構造方法的修復
License
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.</code></pre>