zoukankan      html  css  js  c++  java
  • AndFix 实现热修复功能

    参考资料:http://blog.csdn.net/qxs965266509/article/details/49802429

                  http://blog.csdn.net/yaya_soft/article/details/50460102

                  http://www.jianshu.com/p/479b8c7ec3e3

                  http://blog.hwangjr.com/2016/03/02/Android-HotFix%E6%96%B9%E6%A1%88/

    随着开发需求的不断迫切,目前开源已经涌现了很多Hot Fix项目,但是从方案上来说,主要是基于rovo89/Xposedalibaba/dexposed;以方法hook,从Field切入的AndFixDex分包Nuwa。而相同原理的不同实现有很多,这里就不再累赘。这三个实现原理截然不同,各有各自优缺点,让我们走近这几个方案。

    本文只实现了AndFix来实现热修复功能

    1.首先添加依赖关系

       compile ‘com.alipay.euler:andfix:0.3.1@aar’

    2.然后在Application的onCreate方法中初始化AndFix(自定义BaseApplication,继承Application) 

    public class BaseApplication extends Application {
          private String appVersion;
          private PatchManager patchManager;
          private static final String APATCH_PATH = "/out.apatch";
          private String patchFile;
          @Override
          public void onCreate() {
              super.onCreate();
              try {
                  appVersion = getApplicationContext().getPackageManager().
                          getPackageInfo(getPackageName(), 0).versionName;
              } catch (PackageManager.NameNotFoundException e) {
                  e.printStackTrace();
              }
              // 初始化patch管理类
              patchManager = new PatchManager(this);
              // 初始化patch版本
              patchManager.init(appVersion);
              // 加载已经添加到PatchManager中的patch
              patchManager.loadPatch();
              try {
                  //自动获取路径
                  //patchFile = Environment.getExternalStorageDirectory()
                  //.getAbsolutePath().concat(APATCH_PATH);
                  //暂时写固定路径,测试用
                  patchFile ="/sdcard" + APATCH_PATH;
                  //添加到patch
                  patchManager.addPatch(patchFile);
                 } catch (IOException e) {
                   e.printStackTrace();
              }
          }
       }
           

    3.在需要的地方调用addPatch方法加载新补丁,如第2步,比如在下载补丁文件后调      用这个方法。

    4.修改有bug的地方,分别打出apk包,命名为old.apk,new.apk如下:   

    public class MainActivity extends AppCompatActivity {
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTextView = (TextView) findViewById(R.id.textview);
            mTextView.setText(R.string.old_name);
        }
    }

    此时 TextView显示的字为“这是old app”,打出一个包,改名字为old.apk。

    将MainActivity的修改为:
        public class MainActivity extends AppCompatActivity {
        private TextView mTextView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            mTextView = (TextView) findViewById(R.id.textview);
            mTextView.setText(R.string.new_name);
        }
    }
    

      

    此时 TextView显示的字为“这是and_fix app”,打出一个包,改名字为new.apk。

    5.关键一步,生成apatch文件,也就是补丁文件,用到的是apkpatch-1.0.3工具,这这一步,要把第四步生成的两个apk和签名文件要放到apkpatch的同一文件夹下,如图:

     

    然后在终端运行命令:前提是已经定位到此目录下,否则会报 commond not found

    ./apkpatch.sh -f new.apk -t old.apk -o ./ -k andfix.jks -p 1q2w3e4r -a 123456 -e 1q2w3e4r

     

    说明: 

    -f <new.apk> :新版本

    -t <old.apk> : 旧版本

    -o <output> : 输出目录

    -k <keystore>: 打包所用的keystore

    -p <password>: keystore的密码

    -a <alias>: keystore 用户别名

    -e <alias password>: keystore 用户别名密码

     

    运行完命令后:

     

    将后缀名为.apatch的文件改下名字,为out.apatch,然后拷贝到手机中的sd的根目录下,重新安装old.apk,就会看到页面如下:

     

    注意 !!前提要在Manifest中注册相关权限

     <!-- 在SDCard中创建与删除文件权限 -->

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

        <!-- 往SDCard写入数据权限 -->

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

  • 相关阅读:
    性能测试七:jmeter进阶之文件上传下载、定时器
    性能测试六:jmeter进阶之Cookie与header管理器
    导出文本、表格、图像到PDF格式文件中(学习整理)
    数据库(学习整理)----7--Oracle多表查询,三种join连接
    反射(学习整理)----Class类和加载器ClassLoader类的整理
    反射(学习整理)----操作类、属性、方法!
    数据库(学习整理)----6--Oracle如何快速备份和多次备份数表数据
    数据库(学习整理)----5--Oracle常用的组函数
    数据库(学习整理)----4--Oracle数据查询(基础点1)
    Java小例子(学习整理)-----学生管理系统-控制台版
  • 原文地址:https://www.cnblogs.com/ylt-niuniu/p/5432845.html
Copyright © 2011-2022 走看看