美文网首页
Eclipse 简单集成 Tinker 热修复

Eclipse 简单集成 Tinker 热修复

作者: 蒙子瑜 | 来源:发表于2018-06-23 16:41 被阅读0次

1.前言
对于一些 eclipse 上的一些老项目无法使用 gradle 方式集成 Tinker,这里简单的介绍 eclipse 集成方法
2.获取 Tinker 库
2.1 https://github.com/Tencent/tinker 下载源码
2.2 用 Android Studio 打开,编译 Tinker ,生成builSdk 目录,里面包含了所需要的依赖库和打补丁包工具



3.集成 Tinker 库
3.1 把android目录下的 jar 包复制到自己项目的 libs 下,arr 文件要修改后缀为 zip,把里面的资源文件、jar 等都拷贝到项目相对应的目录,包括 AndroidManifest.xml 里面注册的 service 或者 activity 也要添加到项目中去
3.2 在AndroidManifest.xml添加,TINKER_ID 的作用官方文档有说明
<meta-data android:name="TINKER_ID" android:value="tinker_id_b168b32"/> 

4.代码实现
4.1 自定义类继承DefaultApplicationLike,这相当于一个 Application 代理类。若项目已有自定义 Application,则直接修改继承自DefaultApplicationLike,其他内容不变,原有Context 实例可以通过getApplication()获得

public class ApplicationLike extends DefaultApplicationLike{

    private static Context context;
    public ApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag,
            long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime,
                tinkerResultIntent);
    }
    
    @Override
    public void onCreate() {
        super.onCreate();
        //获取context实例
        context=getApplication();
        //注册Tinker
        TinkerInstaller.install(this);
    }
    
    public static Context getContext(){
        return context;
    }

}

4.2 自定义类继承 TinkerApplication,这相当于真实的 Application 类,注意传参时是自己的 ApplicationLike com.example.tinkertest.ApplicationLike,然后添加到 AndroidManifest.xml 的 application 标签下,若原来已有,则替换掉

public class App extends TinkerApplication{
     public App() {
          super(
            //tinkerFlags, tinker支持的类型,dex,library,还是全部都支持!
            ShareConstants.TINKER_ENABLE_ALL,
            //ApplicationLike的实现类,只能传递字符串 
            "com.example.tinkertest.ApplicationLike",
            //Tinker的加载器,一般来说用默认的即可
            "com.tencent.tinker.loader.TinkerLoader",
            //tinkerLoadVerifyFlag, 运行加载时是否校验dex与,ib与res的Md5
            false);
        } 
}

(这个类文档说明是用 Annotation 注解自动生成的,这里手动创建)

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:name=".App"
        android:theme="@style/AppTheme" >
        ...
</application>

5.补丁包生成
5.1 生成 old.apk,运行到手机上,这是一个有 bug 的程序

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("test", "i write bug");
    }
    
    public void load(View view){
        TinkerInstaller.onReceiveUpgradePatch(this, Environment.getExternalStorageDirectory().getAbsolutePath()+"/patch_signed.apk");
    }
}

5.2 生成 new.apk,修复了 bug,不用运行到手机上,用来做补丁的新 apk

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.i("test", "i fix bug");
    }
    
    public void load(View view){
        TinkerInstaller.onReceiveUpgradePatch(this, Environment.getExternalStorageDirectory().getAbsolutePath()+"/patch_signed.apk");
    }
}

5.3
新建一个目录并拷贝之前生成的补丁包工具,然后把 old.apk 和 new.apk 也拷贝进去


修改 tinker_config.xml
<loader value="com.example.tinkertest.App"/>
<issue id="sign">
    <!--the signature file path, in window use \, in linux use /, and the default path is the running location-->
    <path value="release.keystore"/> 
    <!--storepass-->
    <storepass value="testres"/> 
    <!--keypass-->
    <keypass value="testres"/> 
    <!--alias-->
    <alias value="testres"/> 
</issue>

(其他参数参考文档,与 gradle 配置的类似)

5.4 执行命令生成补丁包 patch_signed.apk
java -jar tinker-patch-cli.jar -old old.apk -new new.apk -config tinker_config.xml -out output_path
(就不演示了)

6.加载补丁
把 patch_signed.apk 拷贝到手机 sdcard,执行下面这个方法就可以加载补丁,重启应用生效

 public void load(View view){
     TinkerInstaller.onReceiveUpgradePatch(this, Environment.getExternalStorageDirectory().getAbsolutePath()+"/patch_signed.apk");
 }

(用这个方法加载补丁会自动退出应用,重启即可。正式使用场景应该是从网络取获取这个补丁包)

7.其他用法
不想加载补丁包时应用自动重启,需要重写DefaultTinkerResultService做相关处理
可参考官方 sample SampleResultService
然后替换自己的服务

 TinkerInstaller.install(appLike, 
                new TinkerLoadReporter(appLike.getApplication()),
                new DefaultPatchReporter(appLike.getApplication()),
                new DefaultPatchListener(appLike.getApplication()),
                SampleResultService.class,
                new UpgradePatch());

(别忘了也要在 AndroidManifest.xml 注册该服务)

参考文章
https://github.com/Tencent/tinker/wiki

相关文章

网友评论

      本文标题:Eclipse 简单集成 Tinker 热修复

      本文链接:https://www.haomeiwen.com/subject/vqpryftx.html