Skip to content

Instantly share code, notes, and snippets.

@s1ntoneli
Created November 7, 2017 10:02
Show Gist options
  • Select an option

  • Save s1ntoneli/b4668637fa487e394a6f56a601e39850 to your computer and use it in GitHub Desktop.

Select an option

Save s1ntoneli/b4668637fa487e394a6f56a601e39850 to your computer and use it in GitHub Desktop.
美团热修复框架 Robust 使用

Robust

Robust 官方文档

导入 robust 插件

  1. 在项目 build.gradle 中添加
buildscript {
  repositories {
      jcenter()
  }
  dependencies {
       classpath 'com.meituan.robust:gradle-plugin:0.4.71'
       classpath 'com.meituan.robust:auto-patch-plugin:0.4.71'
  }
}
  1. 应用插件 robust/auto-patch-plugin

打包 apk 时只使用 robust 自动打包 patch 时只使用 auto-patch-plugin

apply plugin: 'com.android.application'
//制作补丁时将这个打开,auto-patch-plugin紧跟着com.android.application
//apply plugin: 'auto-patch-plugin'
apply plugin: 'robust'
  1. 添加依赖
compile 'com.meituan.robust:robust:0.4.71'

配置项目

  1. 拷贝 robust.xml 配置文件到 app/robust.xml

robust.xml

按需修改。

注意: 这两部分保留,不需要修改

   <exceptPackname name="exceptPackage">
        <name>com.meituan.robust</name>
   </exceptPackname>
   
   <patchPackname name="patchPackname">
        <name>com.meituan.robust.patch</name>
    </patchPackname>
  1. 实现自己的 PatchManipulate

示例: PatchManipulateImpl.java

wiki:

注意: 这行不需要修改,不需要自己实现PatchesInfoImpl

patch.setPatchesInfoImplClassFullName("com.meituan.robust.patch.PatchesInfoImpl");

制作 patch

  1. build.gradle 中应用 robust 插件,使用 gradle 打包 apk
/gradlew clean assembleRelease --stacktrace --no-daemon
  1. 拷贝 mapping.txtmethodsMap.robustapp/robust/ 目录
mkdir app/robust/
cp app/build/outputs/mapping/release/mapping.txt app/robust/
cp app/build/outputs/robust/methodsMap.robust app/robust/
  1. 修改代码 使用 @Modify@Add 标签

  2. build.gradle 中应用 auto-patch-plugin 插件,打包 patch.jar

./gradlew clean assembleRelease --stacktrace --no-daemon 
  1. push patch.jarPatchManipulateImpl.java 中指定的 patch 位置
adb push app/build/outputs/robust/patch.jar /storage/emulated/0/robust/patch.jar

应用 patch

new PatchExecutor(getApplicationContext(), new PatchManipulateImp(), new RobustCallBackImp()).start();

一些坑

  1. 没有生成 mapping.txt 文件

app/build.gradle 中虽然定义了 proguard 文件,但是 minifyEnabled 没有置为 true

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
  1. 无法安装,或安装后打开闪退

没有签名

  1. 找不到 patch.jar 文件

可能没有添加读写权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment