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 注册该服务)
网友评论