Nuwa热修复在项目中应用

来源:互联网 发布:excel数据等距分组 编辑:程序博客网 时间:2024/04/30 19:13
1.热修复 Nuwa的引入过程。
     a.  add following to the build.gradle of your root project.
          classpath 'cn.jiajixin.nuwa:gradle:1.2.2'
     b.  add following to your build.gradle:
           apply plugin: "cn.jiajixin.nuwa"
          nuwa{
          //baseApplication类  
          excludeClass = ['BaseApplication.class','AppContext.class','StringUtils.class
          //nuwa dex打包的文件夹
          includePackage = ['com/sdtv/qingkcloud/mvc']
       }
  c.  依赖包
dependencies {
     compile 'cn.jiajixin.nuwa:nuwa:1.0.0'
}
2.应用nuwa
  a.  add following to your application class:  
/**
 * 分包处理
 */
@Override
protected void attachBaseContext(Context base) {
   super .attachBaseContext(base);

    Nuwa.init(this);
    Nuwa.loadPatch(this,       Environment.getExternalStorageDirectory().getAbsolutePath().concat("/patch.jar"));

   if (!quickStart() && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {//>=5.0的系统默认对dex进行oat优化
       if (needWait(base)){
            waitForDexopt(base);
        }
        MultiDex.install(this);
    }
}
注意: 我工程当中针对5.0以下 解决65535的限制 使用android-support-multidex解决Dex超出方法数的限制问题. Nuwa写在  MultiDex之前。 patch.jar加载完一次退出应用不会再次加载 清除应用数据会再次加载。 5.0以下加载时会碰到加载dex比较长时间(该问题继续跟踪)。所以针对热修复包管理 patch包名字要进行处理最好不要用同一个名字。
      b.  打包时使用的混淆包
                   
debug {
   minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

-keep class cn.jiajixin.nuwa.** { *; }
  3.打包过程。
     a.正常打包
      b.copy  build/outputs/nuwa  到备份文件夹
          c.修改代码 修复bug.
          d.执行./gradlew clean nuwaQihooDebugPatch -P NuwaDir=/Users/jason/Documents/nuwa 
                         其实Qihoo为打包渠道  后面文件夹为备份的文件夹路径
          e.把patch文件拷贝到sd卡中
          f.重启客户端 注意杀死进程 然后重启。

    4.热修复过程中遇到的问题:
          a.
               java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
              原因:  third party library reference added two times.
                我的解决方案: 指定includePackage包
          nuwa{
          //baseApplication类  
          excludeClass = ['BaseApplication.class','AppContext.class','StringUtils.class
          //nuwa dex打包的文件夹
          includePackage = ['com/sdtv/qingkcloud/mvc']
       }

       b.  java.lang.NoClassDefFoundError: cn.jiajixin.nuwa.Hack
         解决方案: 指定excludeClass 注意是全路径
          
nuwa{
    excludeClass =      ['com/sdtv/qingkcloud/general/baseactivity/BaseApplication.class','com/sdtv/qingkcloud/general/appmanage/AppContext.class']
}
 c. 5.0以下 第一次打开解析比较慢 会有一个(3-4s)的黑屏  正在跟踪此问题 可能和我分包MultiDex 有关系


  在4.2  4.4  5.0 6.0手机上都测试通过。测试修改了一个空指针和修改toolbar名称。

0 0