zoukankan      html  css  js  c++  java
  • 基于AndFix的热修复 成功后简单的总结总结错失

    首先了解热修复是什么东西??

    就我自己简单的理解:就是不须要又一次打包 公布到市场 然后再让用户又一次下载就能够把一些小bug和需求通过补丁的形式进行改动。

    然后如今的热修复方式有大致的三种:

         1.dexposed   github https://github.com/alibaba/dexposed

    2.andfix   github https://github.com/alibaba/AndFix

    3.bsdiff  http://blog.csdn.net/lazyer_dog/article/details/47173013

    可是我如今仅仅先搞定了一种 ,andfix。

    。。以后再慢慢来

    首先AndroidStudio的导入路径:compile 'com.alipay.euler:andfix:0.3.1@aar'

    在程序的入口处初始化PatchManager 一般在BaseApp里面进行初始化:

    public class MainApplication extends Application {
        private static final String TAG = "euler";
    
        private static final String APATCH_PATH = "/out.apatch";
    
        private static final String DIR = "apatch";//补丁目录
        /**
         * patch manager
         */
        private PatchManager mPatchManager;
    
        @Override
        public void onCreate() {
            super.onCreate();
            // initialize
            mPatchManager = new PatchManager(this);
            mPatchManager.init("1.0");
    
            //载入已经有了的路径
            mPatchManager.loadPatch();
    
            try {
                String patchFileString = Environment.getExternalStorageDirectory()
                        .getAbsolutePath() + APATCH_PATH;
                //加入新的路径
                mPatchManager.addPatch(patchFileString);
                
                //复制且载入补丁成功后,删除下载的补丁
                File f = new File(this.getFilesDir(), DIR + APATCH_PATH);
                if (f.exists()) {
                    new File(patchFileString).delete();
                }
            } catch (IOException e) {
                Log.e(TAG, "", e);
            }
    
        }
    
    }

    对了 ,记得一定要在清单文件中面注冊哦 ~ 不要粗心 

    补丁文件保存的路径就是mPatchManager.addPatch("");的路径。然后假设须要更新应该会给一个补丁下载的地址 把补丁保存到你设置好的这个路径里面,又一次启动程序就能够把补丁载入进去了,每次载入补丁后 把补丁进行删除。防止每次进程序都会去载入补丁。

    然后重点是补丁的生成,,在这一步有点有失误。。希望可以给你们一点提醒

    生成path文件的工具就是apkpatch-1.0.3 详细的下载地址 https://github.com/alibaba/AndFix 能够在这里面找到


    然后就是生成补丁文件

    先进入到apkpatch所在的目录  假设输入apkpatch显演示样例如以下 是对的  


    然后能够把你要合并的两个apk 和你的密钥库文件都放到里面来 方便 命令的输入

    命令 : apkpatch.bat-fnew.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的password

    -a<alias>: keystore 用户别名

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


    然后要注意的是 andfix 不能改动成员变量 也不能改动布局文件 

    在你打包的时候 两个apk包必须都是用相同的打包方式 debug 或者release 假设两个不相同的话,会报错 。由于两次生成的buildConfig是不同的,改动了成员变量然后就会报错,产生不了补丁文件。


    如图所看到的 是成功的。




    当你补丁文件产生成功后。把他移至你在程序入口定义的addPath()路径里面,第二次启动程序后就会改动你改动过的内容。



    记得混淆代码:

    -optimizationpasses 5                                                           # 指定代码的压缩级别
    -dontusemixedcaseclassnames                                                     # 是否使用大写和小写混合
    -dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar
    -dontpreverify                                                                  # 混淆时是否做预校验
    -verbose                                                                        # 混淆时是否记录日志
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所採用的算法
    
    #重要,別忘了這些。不混淆andfix包,不混淆native方法
    -dontwarn android.annotation
    -dontwarn com.alipay.euler.**
    -keep class com.alipay.euler.** {*;}
    -keep class * extends java.lang.annotation.Annotation
    -keepclasseswithmembernames class * {
        native <methods>;
    }


  • 相关阅读:
    DotNetty是微软的Azure团队,使用C#实现的Netty的版本发布
    C# 与 .NET Framework 对应关系
    C# 基于Directshow.Net lib库 USB摄像头使用DirectShow.NET获取摄像头视频流
    Actor模型的状态(State)+行为(Behavior)+邮箱(Mailbox)
    c# 无法加载DLL:找不到指定的模块(异常来自HRESULT:0X8007007E)
    管道式编程(Pipeline Style programming)
    Word文档转Markdown插件(Windows)
    纯Java实现定时任务(转)
    Spring MVC使用Schedule实现定时任务
    Spring Boot使用Schedule实现定时任务
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/7122744.html
Copyright © 2011-2022 走看看