• Stars
    star
    1,571
  • Rank 29,799 (Top 0.6 %)
  • Language
    Java
  • License
    MIT License
  • Created over 8 years ago
  • Updated about 8 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

another hotfix framework

RocooFix

Another hotfix framework

update

新写了一个框架原理与美团robust框架类似,具体看这里:AnoleFix

之前的HotFix项目太过简单,也有很多同学用Nuwa遇到很多问题,作者也不再修复,所以重新构建了一套工具。

遇到问题的同学可以看一下这里

https://github.com/shoyu666/derocoodemo

Bugfix

  1. 2016-06-26
    • 增加了 Android N (API 24)的支持
    • 增加了关联引用的补丁制作模块,解决 ART NativeCode address 位置错误引起的崩溃问题,但是会造成包大小的增加,后期会支持微信提出的 Dexdiff 技术

Features

  • 支持两种模式
    1. 静态修复某种情况下需要重启应用。
    2. 动态修复,无需重启应用即可生效。
    3. 新增so修复,beta中
  • 支持DalvikVM和ART VM
  • 制作补丁更加方便
  • 支持com.android.tools.build:gradle:1.3.0->com.android.tools.build:gradle:2.1.2 (解决了Nuwa 这个issue)
  • 支持混淆和Mulitdex
  • 无需关注hash.txtmapping.txt文件的生成和保存

TODO

  • 补充单测
  • 兼容性测试
  • 目录规则调整
  • 对Win系统的支持

Use

public class RocooApplication extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //初始化
        RocooFix.init(this);
    }
}


//方案1:静态启用,一般在Application里加载补丁
/**
  * 从Assets里取出补丁,一般用于测试
  *
  * @param context
  * @param assetName
  */
RocooFix.initPathFromAssets(Context context, String assetName);
 /**
   * 从指定目录加载补丁
   * @param context
   * @param dexPath
   */
RocooFix.applyPatch(Context context, String dexPath);


//方案2:动态打补丁,立即生效,有性能问题,适用于补丁方法数较少的情况,建议在ART虚拟机里启用该模式
/**
 * 从Asset里加载补丁,一般用于本地测试
 * @param context
 * @param assetName
 */
RocooFix.initPathFromAssetsRuntime(Context context, String assetName) ;

/**
 * 从指定目录加载补丁
 * @param context
 * @param dexPath
 */ 
RocooFix.applyPatchRuntime(Context context, String dexPath)  ;


/**
 *  
 *  new Feature  beta 中
 * 从指定目录加载so补丁,使用so还需调用System.loadLibrary("xx")
 * @param context
 * @param soDirPath  so补丁路径(这里是dir)
 */ 
 RocooSoFix.applyPatch(Context context, String soDirPath);

Configuration

1 在root的build.gradle增加如下内容:

 repositories {
        jcenter()
    }
 dependencies {
        classpath 'com.dodola:rocoofix:1.2.6’
    }

2 在你项目的build.gradle文件里添加如下配置

apply plugin: 'com.dodola.rocoofix'

repositories {
    jcenter()
}

rocoo_fix {
    includePackage = ['com/dodola/rocoosample']//指定将来可能需要制作补丁的package(就是指定插庄的范围)
    excludeClass = ['BaseApplication.class']//将不需要加到patch里的类写在这里(不需要插庄的类)
    
    preVersionPath = '1'//注意:此项属性只在需要制作补丁的时候才需开启!!如果不需要制作补丁则需要去掉此项
    
    enable = true//注意:关掉此项会无法生成Hash.txt文件
    
    scanref=true//默认为 false,开启这个选项会将与补丁 class 相引用的 class 都打入包中来解决 ART 虚拟机崩溃问题,功能 Beta 中
}

dependencies {

    compile 'com.dodola:rocoo:1.1'
}

这里主要介绍一下preVersionPath这个属性的作用。

rocoo_fix将制作补丁的步骤透明化,用户无需手动备份hash.txt文件,插件会自动根据当前的versionCode生成hash.txtmapping.txt文件到指定目录,比如:

上一个版本发布的时候版本号是1,那么生成的文件会放在app源码目录/rocooFix/version1/[debug]|[release]的目录下,如果需要制作补丁那么在配置里指定preVersionPath 属性,它的值是上一个版本的版本号,这里的值是1

然后将build.gradleversionCode的号码修改,这里修改成2,只要和之前的版本不同就可以,没有具体值的要求

Proguard(混淆)

-keep class com.dodola.rocoofix.** {*;}
-keep class com.lody.legend.** {*;}
-keepclassmembers class com.dodola.rocoosample.** {
  public <init>();//保留init,和include package保持一致
}

Build Patch

下面演示一下使用项目demo生成补丁的制作过程

1 假如我们需要打补丁的文件是

package com.dodola.rocoosample;

public class HelloHack {

    public String showHello() {
        return "hello world";
    }
}

此时build.gradle里的VersionCode1 enter description here

2 运行一次应用,这时会在app的目录下生成如下文件:

enter description here

这里可以看做是我们已经发布版本的hash.txt

3 假设我们需要修复步骤1 里的showHello方法,修改如下:

package com.dodola.rocoosample;

public class HelloHack {

    public String showHello() {
        return "hello Hack";//此处修复,补丁加载后该方法返回hello hack
    }
}

4 修改build.gradle 文件里rocoo_fix项,让其执行patch 的task,配置如下

rocoo_fix {

    preVersionPath = '1'//注意:这里指定的是需要打补丁的VersionCode
    enable = true
}

5 修改当前项目的versionCode2,说明这个是一个升级fix版本。

enter description here

6 正常发布应用,此时会在下图所示的路径中生成补丁文件:

enter description here

7 我们可以反编译apk来确认插庄是否成功

enter description here

相关项目

Legend

More Repositories

1

HotFix

安卓App热补丁动态修复框架
Java
1,702
star
2

MetaballLoading

A 2d metaball loading
Java
1,526
star
3

WeexOne

Weex [one 一个]客户端
Java
966
star
4

android_waterfall

Android版的瀑布流布局
Java
722
star
5

Gitbook

收录找到的不错的文档
546
star
6

OverscrollScale

ListView overscroll scale
Java
405
star
7

AnoleFix

Another hotfix 另一个热修复方案 Alpha,来自InstantRun 和 Robust 类似
Java
381
star
8

DynamicCardLayout

在Android中实现的类似Windows8的瓷片布局
Java
276
star
9

ListItemFold

ListView and RecyclerView item fold and expand
Java
243
star
10

WaterFallExt

增强版的瀑布流 扩展自StaggeredGridView.
Java
209
star
11

ToyView

Drawing animation
Java
195
star
12

PathButton

仿Path按钮动画效果 a button animation layout like Path
Java
186
star
13

DeepInVirtualApp

VirtualApp的技术文档和各个技术点拆解demo
Java
172
star
14

BinderDebug

Android Studio+LLDB调试内核Binder
C
135
star
15

fbhookfork

从 fb 的 profilo 项目里提取出来的hook 库,自己用
C
124
star
16

YoutubeDown

a Youtube Downloader, can download youtube video on Android ,include encrypted video
Java
123
star
17

SimpleSmali

通过精简Smali语法细节来增强反编译代码阅读性,自定义了一种简单语法
Java
72
star
18

TrapHook

C
71
star
19

BubbleCloudView

Like apple watch launcher view(仿苹果表应用表盘界面)
Java
71
star
20

AndroidPatcher

Android 下的增量更新
C
36
star
21

DInlineHook

simple art inline hook
C++
34
star
22

DumpDex

dump dex from memory NEED ROOT
Go
28
star
23

WaveLoadingView

A loading view animation
Java
26
star
24

ply_android

Dynamic Tracing in Android (fork from iovisor/ply)
C
20
star
25

TogicLoading

A loading view animation found in dribbble
Java
19
star
26

TidyDemo

这是一个模仿Tidy相册底部模糊效果的例子
Java
18
star
27

TraceToHtml

Convert debug trace file to html on Android device
C
18
star
28

ColorCode

An android code file reader (一款Android下的代码阅读工具)
Java
16
star
29

SpringRecyclerView

Java
15
star
30

blockindigo

another ui-block detection library for Android base on Blockcanary
Java
14
star
31

FanPullToRefresh

Pull to refresh for android
Java
14
star
32

WebPageClip

Clip the whole webpage
Java
12
star
33

DSPatch

BSPatch Java implement with android (based on bspatch by Joe Desbonnet, [email protected] (JBPatch))
Java
10
star
34

dex-ui-ext

dex-ui animation project
C++
8
star
35

MemoryViewer

Rust
7
star
36

HookZzAndroidDemo

HookZz Android Demo
Java
5
star
37

TextOnAPathPhone

Text on A Path for Windows Phone
5
star
38

WP7Fanfou

Windows Phone 7版饭否
C#
4
star
39

AndroidToolsBuild

Common Android NDK Build Configure
Makefile
2
star
40

gicentreutils

Automatically exported from code.google.com/p/gicentreutils
HTML
1
star
41

WhaleSample

1
star
42

cool-retro-term-threejs

A cool retro terminal emulator with a 3D effect.
HTML
1
star
43

TopitMeDownload

用来下载Topit.me图片的小工具,暂时只有下载专辑的功能
C#
1
star