当前位置: 首页 > news >正文

曲阜建设公司网站/seo教学网seo

曲阜建设公司网站,seo教学网seo,用wang域名做购物网站怎么样,公司网站定制阿里 AndFix 热修复框架简介 阿里AndFix热修复框架简介热修复原理:Android的类加载机制Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexClassLoaderPathClassLoader代码位于libcore\dalvik\src\main\Java\dalvik\system…
阿里 AndFix 热修复框架简介

阿里AndFix热修复框架简介



热修复原理:

Android类加载机制

Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexClassLoader

PathClassLoader代码位于libcore\dalvik\src\main\Java\dalvik\system\PathClassLoader.java 
DexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\system\DexClassLoader.java 
BaseDexClassLoader代码位于libcore\dalvik\src\main\java\dalvik\system\BaseDexClassLoader.java

PathClassLoader: 用来加载系统类和应用类

DexClassLoader :  用来加载jar、apk、dex文件.加载jar、apk也是最终抽取里面的Dex文件进行加载

看下PathClassLoader代码

  1. public class PathClassLoader extends BaseDexClassLoader {
  2. public PathClassLoader(String dexPath, ClassLoader parent) {
  3. super(dexPath, null, null, parent);
  4. }
  5. public PathClassLoader(String dexPath, String libraryPath,
  6. ClassLoader parent) {
  7. super(dexPath, null, libraryPath, parent);
  8. }
  9. }
DexClassLoader代码
  1. public class DexClassLoader extends BaseDexClassLoader {
  2. public DexClassLoader(String dexPath, String optimizedDirectory, String libraryPath, ClassLoader parent) {
  3. super(dexPath, new File(optimizedDirectory), libraryPath, parent);
  4. }
  5. }
两个ClassLoader就两三行代码,只是调用了父类的构造函数.
  1. public class BaseDexClassLoader extends ClassLoader {
  2. private final DexPathList pathList;
  3. public BaseDexClassLoader(String dexPath, File optimizedDirectory,
  4. String libraryPath, ClassLoader parent) {
  5. super(parent);
  6. this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);
  7. }
  8. @Override
  9. protected Class<?> findClass(String name) throws ClassNotFoundException {
  10. List<Throwable> suppressedExceptions = new ArrayList<Throwable>();
  11. Class c = pathList.findClass(name, suppressedExceptions);
  12. if (c == null) {
  13. ClassNotFoundException cnfe = new ClassNotFoundException("Didn't find class \"" + name + "\" on path: " + pathList);
  14. for (Throwable t : suppressedExceptions) {
  15. cnfe.addSuppressed(t);
  16. }
  17. throw cnfe;
  18. }
  19. return c;
  20. }
在BaseDexClassLoader 构造函数中创建一个DexPathList类的实例,这个DexPathList的构造函数会创建一个dexElements 数组

  1. public DexPathList(ClassLoader definingContext, String dexPath, String libraryPath, File optimizedDirectory) {
  2. ...
  3. this.definingContext = definingContext;
  4. ArrayList<IOException> suppressedExceptions = new ArrayList<IOException>();
  5. //创建一个数组
  6. this.dexElements = makeDexElements(splitDexPath(dexPath), optimizedDirectory, suppressedExceptions);
  7. ...
  8. }

然后BaseDexClassLoader 重写了findClass方法,调用了pathList.findClass,跳到DexPathList类中.

  1. /* package */final class DexPathList {
  2. ...
  3. public Class findClass(String name, List<Throwable> suppressed) {
  4. //遍历该数组
  5. for (Element element : dexElements) {
  6. //初始化DexFile
  7. DexFile dex = element.dexFile;
  8. if (dex != null) {
  9. //调用DexFile类的loadClassBinaryName方法返回Class实例
  10. Class clazz = dex.loadClassBinaryName(name, definingContext, suppressed);
  11. if (clazz != null) {
  12. return clazz;
  13. }
  14. }
  15. }
  16. return null;
  17. }
  18. ...
  19. }
会遍历这个数组,然后初始化DexFile,如果DexFile不为空那么调用DexFile类的loadClassBinaryName方法返回Class实例. 
归纳上面的话就是:ClassLoader会遍历这个数组,然后加载这个数组中的dex文件. 
而ClassLoader在加载到正确的类之后,就不会再去加载有Bug的那个类了,我们把这个正确的类放在Dex文件中,让这个Dex文件排在dexElements数组前面即可.


热修复框架AndFix的使用

AndFix:阿里开源的热修复框架AndFix,AndFix是 “Android Hot-Fix”的缩写。它支持Android 2.3到6.0版本,并且支持arm与X86系统架构的设备。完美支持Dalvik与ART的Runtime。AndFix 的补丁文件是以 .apatch 结尾的文件。

我这是用eclipse写的Demo.

1.把AndFix抽取成library依赖的形式

这里写图片描述

2.新建一个AndFixDemo项目,依赖AndFix这个library

2.1 新建一个MyApplication继承Application

public class MyApplication extends Application {private static final String TAG = "MyApplication";/*** apatch文件*/private static final String APATCH_PATH = "/Dennis.apatch";private PatchManager mPatchManager;@Overridepublic void onCreate() {super.onCreate();// 初始化mPatchManager = new PatchManager(this);mPatchManager.init("1.0"); // 版本号// 加载 apatchmPatchManager.loadPatch();//apatch文件的目录String patchFileString = Environment.getExternalStorageDirectory().getAbsolutePath() + APATCH_PATH;File apatchPath = new File(patchFileString);if (apatchPath.exists()) {Log.i(TAG, "补丁文件存在");try {//添加apatch文件mPatchManager.addPatch(patchFileString);} catch (IOException e) {Log.i(TAG, "打补丁出错了");e.printStackTrace();}} else {Log.i(TAG, "补丁文件不存在");}}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

实际当中肯定是通过网络接口下载apatch文件,我这里为了方便演示就放在了SD卡根目录

2.2

在MainActivity用一个按钮弹出吐司,上面是有Bug的代码,下面是修正后的代码

这里写图片描述

这里写图片描述

分别打包成Bug.apk和NoBug.apk

这里写图片描述

2.3 . 然后要用到一个生成补丁的工具apkpatch 

这里写图片描述

_MACOSX是给OSX系统用的 
.bat是给window系统用的

我用得是.bat

把之前生成的Bug.apkNoBug.apk,还有打包所使用的keystore文件放到apkpatch-1.0.3目录下 
打开cmd,进入到apkpatch-1.0.3目录下,输入如下指令

apkpatch.bat -f NoBug.apk -t Bug.apk -o Dennis -k keystore -p 111111 -a 111111 -e 111111

每个参数含义如下

-f 新版本的apk 
-t 旧版本的apk 
-o 输出apatch文件的文件夹,可以随意命名 
-k 打包的keystore文件名 
-p keystore的密码 
-a keystore 用户别名 
-e keystore 用户别名的密码

这里写图片描述

如果出现add modified …….就表示成功了,去apkpatch-1.0.3目录看下,新增了Dennis目录

这里写图片描述

这里写图片描述

我把这个文件改为Dennis.apatch

2.4

手机装上Bug.apk运行起来

这里写图片描述

然后把Dennis.apatch 放到SD卡根目录,退出app,再进入,按下按钮

这里写图片描述

最后附上Demo还有apk和apatch 文件

























null


posted on 2017-03-11 11:08 蕉下客--) 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jiaoxiake/p/6534348.html

http://www.lbrq.cn/news/1466857.html

相关文章:

  • 昌平区住房和建设委员会官方网站/电商网站建设步骤
  • 湛江免费网站制作/b站推广网站2023
  • 张家港网站建设培训学校/新华传媒b2b商务平台
  • 中国招聘网/做网站怎么优化
  • 百度该网站无法进行访问阿里云/网络软文广告
  • 网站服务器知识/病毒营销案例
  • 济南网站建设网站/百度推广怎么优化
  • 网龙网络有限公司/seo排名优化教学
  • 开封网站制作公司/徐州网站建设方案优化
  • ssm网站开发视频/网络推广文案有哪些
  • 完善网站通讯员队伍建设/成都网站建设
  • 攀枝花建设规划网站/青岛百度网站排名优化
  • 作为一个大学生网站 应该怎么做/农村电商平台
  • 茶山网站建设公司/口碑营销案例有哪些
  • 微信公众号直接链接网站怎么做/百度收录怎么做
  • 重庆新闻头条今天/济南网络优化网站
  • 广东新闻联播回看/怎么优化网络
  • 做seo网站图片怎么优化/google推广seo
  • 一站式做网站价格/营业推广促销
  • 邢台做移动网站/平台交易网
  • 外国人 做的中国字网站/企业网站快速建站
  • 大丰市市城乡建设局网站/产品软文范例100字
  • wordpress仪表盘默认/seo课培训
  • 重庆系统建站怎么用/互联网营销师考试内容
  • 如何把自己做的网站 放在网上/什么是核心关键词
  • 一个备案号可以绑定几个网站/济南seo网络优化公司
  • 建设中标查询网站/seo网站关键词优化哪家好
  • 乐清外贸网站建设/如何建造一个网站
  • wordpress 仿站交叉/seo关键字怎么优化
  • wordpress diy插件/seo网站推广下载
  • Java 中的 HashMap.merge() 方法详解
  • qt中的手势
  • c#中switch case语句的用法
  • 什么是数据集成?和数据融合有什么区别?
  • 辐射源定位方法简述
  • Camera相机人脸识别系列专题分析之十九:MTK ISP6S平台FDNode传递三方FFD到APP流程解析