文档章节

热修复

android-key
 android-key
发布于 2017/07/07 13:28
字数 537
阅读 8
收藏 0

1.接入Tinker

接入tinker目前给了两种方式,一种是基于命令行的方式,类似于AndFix的接入方式;一种就是gradle的方式。

1.1)命令行接入

  1. 对于API: 一般来说,我们接入热修库,会在Application#onCreate中进行一下初始化操作。然后在某个地方去调用类似loadPatch这样的API去加载patch文件。
  2. 对于patch的生成:简单的方式就是通过两个apk做对比然后生成;需要注意的是:两个apk做对比,需要的前提条件,第二次打包混淆所使用的mapping文件应该和线上apk是一致的。

1.2)依赖引入

dependencies {
    // ...
    //可选,用于生成application类
     provided('com.tencent.tinker:tinker-android-anno:1.7.11')
    //tinker的核心库
   compile('com.tencent.tinker:tinker-android-lib:1.7.11') 
}

1.3)添加签名配置,这里我直接采用Tinker给的签名文件

signingConfigs {
        release {
            try {
                storeFile file("release.keystore")
                storePassword "testres"
                keyAlias "testres"
                keyPassword "testres"
            } catch (ex) {
                throw new InvalidUserDataException(ex.toString())
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
            minifyEnabled true
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

1.4)Api的引入主要进行初始化和loadpacth

@DefaultLifeCycle(application = ".SimpleTinkerInApplicationLike",
                  flags = ShareConstants.TINKER_ENABLE_ALL,
                  loadVerifyFlag = false
                )
public class SimpleTinkerInApplicationLike extends ApplicationLike{
    public SimpleTinkerInApplicationLike(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
        super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
    }

    @Override
    public void onBaseContextAttached(Context base) {
        super.onBaseContextAttached(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

ApplicationLike通过名字你可能会猜,并非是Application的子类,而是一个类似Application的类。

tinker建议编写一个ApplicationLike的子类,你可以当成Application去使用,注意顶部的注解:@DefaultLifeCycle,其application属性,会在编译期生成一个SimpleTinkerInApplication类。

因此我们需要去AndroidManifest.xml配置

<application
        android:name=".SimpleTinkerInApplication"
        .../>

上述,就完成了tinker的初始化,那么调用loadPatch的时机,我们直接在Activity中添加一个Button设置:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

    public void loadPacth(View v){
        TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(),
                Environment.getExternalStorageState()+"/patch_signed.apk");
    }
}

这样就把patch文件直接push到sdcard根目录(如果是6.0以上自己去动态的申请权限)

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

除以以外,有个特殊的地方就是tinker需要在AndroidManifest.xml中指定TINKER_ID。

到此API相关的就结束了,剩下的就是考虑patch如何生成。

 

 

 

© 著作权归作者所有

共有 人打赏支持
android-key
粉丝 7
博文 119
码字总数 170926
作品 0
武汉
荐书丨深入探索Android热修复技术原理

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 Android 系统热修复技术之作|移动开发人员人手一本查阅| 详解Sophix 热修复开发实践过程 热修复技术,可以看...

CSDN程序人生
09/01
0
0
全面了解Android热修复技术

作者:赵裕, 腾讯移动客户端开发 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处。 原文链接:http://wetest.qq.com/lab/view/338.html WeTest 导读 本文探讨了Android热修复技术...

腾讯WeTest
2017/09/26
0
0
Android 插件化和热修复知识梳理

概述 在Android开发中,插件化和热修复的话题越来越多的被大家提及,同时随着技术的迭代,各种框架的发展更新,插件化和热修复的框架似乎已经日趋成熟,许多开发者也把这两项技术运用到实际开...

IAM四十二
2017/11/28
0
0
“百川解码”第一期 热修复的坑和阿里的解

热修复是很多开发者关心的技术,8月27日晚,阿里百川组织了“百川解码”在线直播,以“热修复的坑和阿里的解”为主题,邀请了三位业界嘉宾对热修复技术进行了探讨,并介绍了阿里百川全面接受...

阿里百川
2016/09/12
1K
5
Android 热修复 - 各框架原理学习及对比

写在开头 从15年开始各技术大佬们开始研究热修复技术,并陆续开源了许多的热修复框架。如和Jasonross 的[Nuwa][1],美团的[Robust][2],阿里的[Andfix][3],腾讯的[Tinker][4] 等等...均是A...

GoileoLee
2017/12/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

70.shell的函数 数组 告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析 20.16/20.17 shell中的函数: ~1. 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段...

王鑫linux
今天
2
0
分布式框架spring-session实现session一致性使用问题

前言:项目中使用到spring-session来缓存用户信息,保证服务之间session一致性,但是获取session信息为什么不能再服务层获取? 一、spring-session实现session一致性方式 用户每一次请求都会...

WALK_MAN
今天
5
0
C++ yield()与sleep_for()

C++11 标准库提供了yield()和sleep_for()两个方法。 (1)std::this_thread::yield(): 线程调用该方法时,主动让出CPU,并且不参与CPU的本次调度,从而让其他线程有机会运行。在后续的调度周...

yepanl
今天
4
0
Java并发编程实战(chapter_3)(线程池ThreadPoolExecutor源码分析)

这个系列一直没再写,很多原因,中间经历了换工作,熟悉项目,熟悉新团队等等一系列的事情。并发课题对于Java来说是一个又重要又难的一大块,除非气定神闲、精力满满,否则我本身是不敢随便写...

心中的理想乡
今天
35
0
shell学习之获取用户的输入命令read

在运行脚本的时候,命令行参数是可以传入参数,还有就是在脚本运行过程中需要用户输入参数,比如你想要在脚本运行时问个问题,并等待运行脚本的人来回答。bash shell为此提 供了read命令。 ...

woshixin
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部