安卓热修复之AndFIX
我致力于最新的前沿安卓技术分析和使用教学,不打算将很多很深的东西,因为有多少人愿意沉下你的心境去学习难点?我一般只会简单提及.文字错漏在所难免还希望同学们喜欢
热修复介绍
热修复是什么? 如果你一个项目已经上线,出现了严重缺陷,那么你第一反应是推送新版本.那么问题来.老子刚下你的APP 你就叫我重新下载?啥东西!卸了.从而导致用户流量的减退.而热修复就是推送一个补丁文件到客户端(很小),用户打开应用时自动安装.是不是很棒?
AndFix 热修复原理
推荐自行看官网
如果时间上允许我会帮大家翻译完整版的
AndFix注意的地方
- 不支持添加字段 方法 资源 布局修改 类
- 虽然不支持添加字段 但是你可以在方法内添加 局部变量(后面解释)
错误:
1. 如果添加了在生成补丁包会有如下错误(大家先看看不需要先知道怎么生成,后面阐述)
成功:
仔细看 上面的文字会有什么add modifie(添加修改) com.xxx(你修改的文件)
AndFix使用
首先添加依赖
dependencies {
compile 'com.alipay.euler:andfix:0.5.0@aar'
}
初始化 一般在application的实现类
我们首先创建一个类继承之 application 然后在oncreat方法初始化,
我先介绍几个API:此API返回你的应用版本名()
java
String appversion; appversion=getPackageManager().getPackageInfo(getPackageName(),0).ersionName;
再来看个依赖包的类PatchManager
public PatchManager patchManager ;
此类有如下几个方法
参数为上下文 一般都在application中
patchManager = new PatchManager(this);
初始化 这里传入的是版本名 可以用上面介绍的一个api填入 也可以直接写死
patchManager.init("1.0");
patchManager.init(versionName);初始化加载补丁 (你直接当写死就行一般默认在new出来并初始版本后调用.这里还是不真正的加载方法)
patchManager.loadPatch();
打入补丁 参数为字符串 打入后生效 路径你随意写 文件名也是一样
addPatch(你的补丁路径)
//移除补丁路径
patchManager.removeAllPatch();String path = Environment.getExternalStorageDirectory().getAbsoluteFile() + File.separator + "out.apatch"; File file = new File(path);
if (file.exists()){
Log.e("fmy","文件存在");
try {
patchManager.addPatch(path);
patchManager.removeAllPatch();
Log.e("fmy","热修复成功");
} catch (IOException e) {
Log.e("fmy","热修复失败:"+e.getMessage());
}
}else{
Log.e("fmy","文件不存在");
}完整代码:
package com.example.administrator.myapplication; import android.app.Application;
import android.os.Environment;
import android.util.Log; import com.alipay.euler.andfix.patch.PatchManager; import java.io.File;
import java.io.IOException; /**
* Created by Administrator on 2016/11/9.
*/ public class MainAppliacation extends Application { public PatchManager patchManager ;
private String path; @Override
public void onCreate() {
super.onCreate(); patchManager = new PatchManager(this);
patchManager.init("1.0");
patchManager.loadPatch(); path = Environment.getExternalStorageDirectory().getAbsoluteFile() + File.separator + "out.apatch"; File file = new File(path);
if (file.exists()){
Log.e("fmy","文件存在");
try {
patchManager.addPatch(path);
patchManager.removeAllPatch();
Log.e("fmy","热修复成功");
} catch (IOException e) {
Log.e("fmy","热修复失败:"+e.getMessage());
}
}else{
Log.e("fmy","文件不存在");
} }
}
添加权限和把我们自定义application关联上
权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />//关联我们自定义application类
<application
android:name=".MainAppliacation"
....完整清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.administrator.myapplication"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <application
android:name=".MainAppliacation"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>生成新旧版本的两个已经签名的APK(签名需一样)
假设我们原本的apk 两个类 一个是activity 类 和一个我们自定义的application类(上面已经说了)我们看看activity 文件
package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { String name ="你好"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //一个按钮的点击事件
public void onClick(View view) { Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}
}看下布局文件吧
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.myapplication.MainActivity"> <Button
android:onClick="onClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="看看热修复是否成功" />
</RelativeLayout>
大概的效果图
打包签名此apk 并取名为old.apk(这里是为了后面好讲此命名)修改一下activity文件
修改了name的数值package com.example.administrator.myapplication; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast; public class MainActivity extends AppCompatActivity { String name ="修复了!!!!"; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} //一个按钮的点击事件
public void onClick(View view) { Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
} }
打包签名此apk 并取名为new.apk(这里是为了后面好讲此命名)
下载生成补丁工具
阿里github官网(英文)在github下载源码不用我教吧?把阿里整个master下载到本地 并解压

打开上述目录的tools目录 解压工具包到你喜欢的位置
现在我打开我解压的后的目录
将我们生成的new.apk 和old.apk 还有签名文件一并放入此文件夹
生成补丁
在此目录下按下Shit键+鼠标右键 选择 可以看到一个选项为”在此处打开一个命令窗口” —>>不好截图 一点截图就关掉了所以 I’m so sorry在跳出命令窗口输入如下命令
命令 : apkpatch.bat -f new.apk -t old.apk -o output1 -k debug.keystore -p android -a androiddebugkey -e android -f <new.apk> :新版本
-t <old.apk> : 旧版本
-o <output> : 输出目录
-k <keystore>: 打包所用的keystore
-p <password>: keystore的密码
-a <alias>: keystore 用户别名
-e <alias password>: keystore 用户别名密码提示在 dos 窗口按下tab 输入此文件夹下的某个文件名首字母或者一段可以提示哦
-o o 我这里的用法是 在此目录下创建一个o文件夹然后将生产的东西放入此文件夹
我们打开看看我们的o文件夹有什么
可以看到有一个叫
“new-4d459be7271c372742862b1a885b176a.apatch”的文件
这个就是我们需要的 其他文件用处我以后会补充的 如加固的一些问题
我们把此文件改名 “out.apatch”
现在呢我们演示一下吧:
首先安装old.apk 到手机中 我们运行看看
我们把文件out.apath导入到此模拟器的sd卡根目录 在关闭程序(记得清后台!!!!!) 不然你不会重新调用application的oncreat
What ?为什么没有变成我们后面改成的字符串?其实是我故意写下的一个坑 我的目的很简单 如果让同学一帆风顺的写下来你永远不会影响深刻对AndFIX哪些部分可以热修复 如前文 布局文件等
这里之所以 不出来 是因为他把重新再name的类中赋值当成重新生成了一个字段(前面说过新字段不可以热修复),所以解锁方法如下
package com.example.administrator.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
String name ="你好";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//一个按钮的点击事件
public void onClick(View view) {
name ="修复了";
Toast.makeText(this, name, Toast.LENGTH_SHORT).show();
}
}
然后重新生成一个new.apk 在次和签名文件生成一个新的补丁效果就出来了.这里我就不重复无聊的步骤了,我现在导入正确的补丁
(^__^) 我很无聊吧?
后期我还会教大家一个最新的热修复
阿里百川计划 …
安卓热修复之AndFIX的更多相关文章
- 十分钟教会你使用安卓热修复框架AndFix
腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix? A ...
- 探索安卓热修复框架AndFix的奥秘
虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug. 1.什么是AndFix? ...
- 走进热修复框架AndFix的世界
关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法.1.什么是AndFix? AndFix是阿里巴巴出的一个专门 ...
- Android热修复之AndFix使用教程
AndFix的github地址 AndFix 全称Android hot-fix,是alibaba的Android热修复框架,支持Android 2.3到6.0的版本,支持arm与X86系统架构,支持 ...
- 热修复干货| AndFix热补丁动态修复框架使用教程
本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路. 1 ...
- [Android]热修复框架AndFix测试说明
AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支持arm 与 X86系 ...
- AndFix热修复 —— 实战与源码解析
当你的应用发布后第二天却发现一个重要的bug要修复,头疼的同时你可能想着赶紧修复重新打个包发布出去,让用户收到自动更新重新下载.但是万事皆有可能,万一隔一天又发现一个急需修复的bug呢?难道再次发布打 ...
- Andfix热修复原理
一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分 ...
- 阿里 AndFix 热修复框架简介
阿里AndFix热修复框架简介 热修复原理: Android的类加载机制 Android的类加载器分为两种,PathClassLoader和DexClassLoader,两者都继承自BaseDexCl ...
随机推荐
- Http读书笔记1-5章
第一章 内容提要 这一章主要介绍了什么是http以及http是干嘛的,以及与之有关的相关概念,当然了这些概念都是概览式的介绍一些.所以我将采用问答式的方式描述这一章! Q:http是干嘛的? A:ht ...
- Extensions in UWP Community Toolkit - ListViewExtensions
概述 UWP Community Toolkit Extensions 中有一个为 ListView 提供的扩展 - ListViewExtensions,本篇我们结合代码详细讲解 ListView ...
- MySQL之SQL语句的优化
仅供自己学习 结论写在前面: 1.尽量避免进行全表扫描,可以给where和order by涉及的列上建立索引 2.尽量在where子句中使用 !=或<>操作符,因为这样会导致引擎放弃索引而 ...
- [LeetCode] Special Binary String 特殊的二进制字符串
Special binary strings are binary strings with the following two properties: The number of 0's is eq ...
- 智能合约开发solidity编程语言开发一个以太坊应用区块链投票实例
智能合约开发用solidity编程语言部署在以太坊这个区块链平台,本文提供一个官方实战示例快速入门,用例子深入浅出智能合约开发,体会以太坊构建去中心化可信交易技术魅力.智能合约其实是"执行合 ...
- .NET CORE 2.0之 依赖注入在类中获取IHostingEnvironment,HttpContext
在.NET CORE 中,依赖注入非常常见, 在原先的 HttpContext中常用的server.Mappath已经么有了如下: HttpContext.Current.Server.MapPath ...
- NoClassDefFoundError: org/apache/commons/lang3/StringUtils
出错信息: 2014-2-5 21:38:05 org.apache.catalina.core.StandardContext filterStart严重: Exception starting f ...
- [Luogu 3690]【模板】Link Cut Tree (动态树)
Description 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和. ...
- [Codeforces]856E - Satellites
传送门 做法:每个卫星分别用连到左边圆与x轴交点的线的斜率和连到右边交点的线旋转90度的斜率可以表示成一个区间,问题转化成支持加/删区间和询问其中两个区间是否有交以及它们的交是否被其他区间包含.我一开 ...
- STL注意比较函数
可重复插入?: set<int ,less_equal<int> >s; s.insert(10); s.insert(10); 第二次调用insert,集合回去确认10是否已 ...