安卓热修复之AndFIX

我致力于最新的前沿安卓技术分析和使用教学,不打算将很多很深的东西,因为有多少人愿意沉下你的心境去学习难点?我一般只会简单提及.文字错漏在所难免还希望同学们喜欢

热修复介绍

热修复是什么? 如果你一个项目已经上线,出现了严重缺陷,那么你第一反应是推送新版本.那么问题来.老子刚下你的APP 你就叫我重新下载?啥东西!卸了.从而导致用户流量的减退.而热修复就是推送一个补丁文件到客户端(很小),用户打开应用时自动安装.是不是很棒?

AndFix 热修复原理

已经翻译的源码分析

阿里github官网(英文)

推荐自行看官网

如果时间上允许我会帮大家翻译完整版的

AndFix注意的地方

  1. 不支持添加字段 方法 资源 布局修改 类
  2. 虽然不支持添加字段 但是你可以在方法内添加 局部变量(后面解释)

错误:

1. 如果添加了在生成补丁包会有如下错误(大家先看看不需要先知道怎么生成,后面阐述)

成功:

仔细看 上面的文字会有什么add modifie(添加修改) com.xxx(你修改的文件)

AndFix使用

  1. 首先添加依赖

    dependencies {
            compile ‘com.alipay.euler:andfix:0.5.0@aar‘
    }
    
  2. 初始化 一般在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","文件不存在");
            }
    
        }
    }
    
  3. 添加权限和把我们自定义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>
  4. 生成新旧版本的两个已经签名的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(这里是为了后面好讲此命名)

  5. 下载生成补丁工具

    阿里github官网(英文)

    在github下载源码不用我教吧?把阿里整个master下载到本地 并解压
    ![这里写图片描述](http://img.blog.csdn.net/20161109113056564)
    

    打开上述目录的tools目录 解压工具包到你喜欢的位置

    现在我打开我解压的后的目录

  6. 将我们生成的new.apk 和old.apk 还有签名文件一并放入此文件夹

  7. 生成补丁

    在此目录下按下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 在次和签名文件生成一个新的补丁效果就出来了.这里我就不重复无聊的步骤了,我现在导入正确的补丁

(^__^) 我很无聊吧?

后期我还会教大家一个最新的热修复

阿里百川计划 …

时间: 2024-10-08 00:02:00

安卓热修复之AndFIX的相关文章

十分钟教会你使用安卓热修复框架AndFix

腾讯最近开发出一个Tinker,阿里也有一个Dexposed框架,当然还有一个就是今天的主角热修复框架AndFix.接下来,我会从它的概念.原理.使用方法等为你详细介绍. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的

探索安卓热修复框架AndFix的奥秘

虽然阿里的AndFix框架已经出来很长时间了,但是还不了解它的同学依然挺多,接下来就跟着我一起来到AndFix的世界里一起看看,如何达到不用重新安装app就可以修复bug. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app

Android热修复框架AndFix原理解析及使用

一.前言 最近腾讯弄出一个Tinker热修复框架,那么本文先不介绍这个框架,先来介绍一下阿里的一个热修复框架AndFix,这个框架出来已经很长时间了,但是看网上没有太多非常详细的讲解,这里就来做一次分析.正好项目中要使用到.首先这个框架是开源的:https://github.com/alibaba/AndFix 其实在最早的时候我已经分析了阿里的另外一个热修复框架:Dexposed框架,还不了解的同学可以点击这里查看:Dexposed框架原理解析以及使用 当时介绍这个框架的时候发现他的实现原理很

走进热修复框架AndFix的世界

关于阿里的开源热修复框架AndFix引起了广泛共鸣,受到了很多人的青睐.那今天就跟随我的步伐来详细了解一下AndFix的详细信息和使用方法. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bugs,而不是重新安装app的一种解决方案.2.AndFix

Android热修复:Andfix和Hotfix,两种方案的比较与实现

Andfix和hotfix是两种android热修复框架. android的热修复技术我看的最早的应该是QQ空间团队的解决方案,后来真正需要了,才仔细调查,现在的方案中,阿里有两种Dexposed和Andfix框架,由于前一种不支持5.0以上android系统,所以阿里系的方案我们就看Andfix就好.Hotfix框架算是对上文提到的QQ空间团队理论实现.本文旨在写实现方案,捎带原理. Andfix 引入 框架官网:https://github.com/alibaba/AndFix 介绍是用英文

热修复干货| AndFix热补丁动态修复框架使用教程

本篇文章会与大家一起学习使用阿里的AndFix热修复框架,可以说AndFix是国内热修复技术的开山始祖,尽管现在阿里已经放弃了对这个项目的维护,但是后来很多的热修复技术都借鉴了这一框架的实现思路. 1.什么是AndFix?AndFix是阿里巴巴出的一个专门针对Android的热修复框架,那什么是热修复呢?就是不需要重新安装APK而达到修复bugs的目的.看看阿里巴巴官方对AndFix的描述:英文好的可以看官网说明文档(有翻译不妥欢迎指出)1.AndFix是一个Android库,它是在线解决bug

安卓 热修复的原理

韩梦飞沙  韩亚飞  [email protected]  yue31313  han_meng_fei_sha #热修复技术 APP提早发出去的包,如果出现客户端的问题,实在是干着急,覆水难收.因此线上修复方案迫在眉睫. ###概述 基于Xposed中的思想,通过修改c层的Method实例描述,来实现更改与之对应的java方法的行为,从而达到修复的目的. ###Xposed 诞生于XDA论坛,类似一个应用平台,不同的是其提供诸多系统级的应用.可实现许多神奇的功能.Xposed需要以越狱为前提,

(4.2.32.6)android热修复之Andfix方式:Andfix的Hook方式打补丁原理

http://pan.baidu.com/s/1hs2kHbm AndFix热补丁原理就是在 native 动态替换方法 java 层的代码,通过 native 层hook java 层的代码. 优点 1. 因为是动态的,所以不需要重启应用就可以生效 2. 支持ART与Dalvik 3. 与multidex方案相比,性能会有所提升(Multi Dex需要修改所有class的class_ispreverified标志位,导致运行时性能有所损失) 4.支持新增加方法 5. 支持在新增方法中新增局部变

安卓热修复,android打补丁,不用发版本就能实时的解决一些线上版本的bug

背景 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试. 向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖安装.有时候仅仅是为了修改了一行代码, 也要付出巨大的成本进行换包和重新发布. 这时候就提出一个问题:有没有办法以补丁的方式动态修复紧急Bug, 不再需要重新发布App,不再需要用户重新下载,覆盖安装? 搜索发现有这3种方式可以实现(至于其他的方式,暂不清楚) 1.dexposed     github https:/