
GG修改器破解版下载地址:https://ghb2023zs.bj.bcebos.com/gg/xgq/ggxgq?GGXGQ
大家好,今天小编为大家分享关于去除GG修改器root提示_gg修改器怎么修复root的内容,赶快来一起来看看吧。
先说结论吧,就是将补丁 dex 文件放到 dexElements 数组靠前位置,这样在加载 class 时,优先找到补丁包中的 dex 文件,加载到 class 之后就不再寻找,从而原来的 apk 文件中同名的类就不会再使用,从而达到修复的目的。


热修复即”打补丁“,当一个app上线后,如果发现重大的bug,需要紧急修复。常规的做法是修复bug,然后重新打包,再上线到各个渠道。这种方式的成本高,效率低。 于是热修复技术应运而生,热修复技术一般的做法是应用启动的时候,主动去服务端查询是否有补丁包,有就下载下来,并在下一次启动的时候生效,这样就可以快速解决线上的紧急bug。


Instant Run资源热修复分两步:
把补丁so库的路径插入到nativeLibraryDirectories数组的最前面,就能达到加载so库时是补丁so库,而非原来so库的目录。
代码修复主要有三个方案,分别是:
类加载方案基于Dex分包方案,什么是Dex分包方案呢?这个得先从65536限制和LinearAlloc限制说起。 65536限制 随着应用功能越来越复杂,代码量不断地增大,引入的库也越来越多,可能会在编译时提示如下异常:
<.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff]: 65536
这说明应用中引用的方法数超过了最大数65536个。产生这一问题的原因就是系统的65536限制,65536限制的主要原因是DVM Bytecode的限制,DVM指令集的方法调用指令invoke-kind索引为16bits,最多能引用 65535个方法。
在安装时可能会提示INSTALL_FAILED_DEXOPT。产生的原因就是LinearAlloc限制,DVM中的LinearAlloc是一个固定的缓存区,当方法数过多超出了缓存区的大小时会报错。
为了解决65536限制和LinearAlloc限制,从而产生了Dex分包方案。Dex分包方案主要做的是在打包时将应用代码分成多个Dex,将应用启动时必须用到的类和这些类的直接引用类放到主Dex中,其他代码放到次Dex中。当应用启动时先加载主Dex,等到应用启动后再动态的加载次Dex,从而缓解了主Dex的65536限制和LinearAlloc限制。
Dex分包方案主要有两种,分别是Google官方方案、Dex自动拆包和动态加载方案。因为Dex分包方案不是本章的重点,这里就不再过多的介绍,我们接着来学习类加载方案。 调用DexPathList的findClass的方法,如下所示。 libcore/dalvik/src/main/java/dalvik/system/DexPathList.java
 public Class<?> findClass(String name, List<Throwable> suppressed) {
        for (Element element : dexElements) {//1
            Class<?> clazz = element.findClass(name, definingContext, suppressed);//2
            if (clazz != null) {
                return clazz;
            }
        }
        if (dexElementsSuppressedExceptions != null) {
            suppressed.addAll(Arrays.asList(dexElementsSuppressedExceptions));
        }
        return null;
    }
与类加载方案不同的是,底层替换方案不会再次加载新类,而是直接在Native层修改原有类,由于是在原有类进行修改限制会比较多,不能够增减原有类的方法和字段,如果我们增加了方法数,那么方法索引数也会增加,这样访问方法时会无法通过索引找到正确的方法,同样的字段也是类似的情况。 底层替换方案和反射的原理有些关联,就拿方法替换来说,方法反射我们可以调用java.lang.Class.getDeclaredMethod,假设我们要反射Key的show方法,会调用如下所示。
   Key.class.getDeclaredMethod("show").invoke(Key.class.newInstance());
Android 8.0的invoke方法,如下所示。 libcore/ojluni/src/main/java/java/lang/reflect/Method.java
    @FastNative
    public native Object invoke(Object obj, Object... args)
            throws IllegalAccessException, IllegalArgumentException, InvocationTargetException;
 
invoke方法是个native方法,对应Jni层的代码为: art/runtime/native/java_lang_reflect_Method.cc
static jobject Method_invoke(JNIEnv* env, jobject javaMethod, jobject javaReceiver,
                             jobject javaArgs) {
  ScopedFastNativeObjectAccess soa(env);
  return InvokeMethod(soa, javaMethod, javaReceiver, javaArgs);
Method_invoke函数中又调用了InvokeMethod函数: art/runtime/reflection.cc
jobject InvokeMethod(const ScopedObjectAccessAlreadyRunnable& soa, jobject javaMethod,
                     jobject javaReceiver, jobject javaArgs, size_t num_frames) {
...
  ObjPtr<mirror::Executable> executable = soa.Decode<mirror::Executable>(javaMethod);
  const bool accessible = executable->IsAccessible();
  ArtMethod* m = executable->GetArtMethod();//1
...
}
注释1处获取传入的javaMethod(Key的show方法)在ART虚拟机中对应的一个ArtMethod指针,ArtMethod结构体中包含了Java方法的所有信息,包括执行入口、访问权限、所属类和代码执行地址等等,ArtMethod结构如下所示。 art/runtime/art_method.h
class ArtMethod FINAL {
...
 protected:
  GcRoot<mirror::Class> declaring_class_;
  std::atomic<std::uint32_t> access_flags_;
  uint32_t dex_code_item_offset_;
  uint32_t dex_method_index_;
  uint16_t method_index_;
  uint16_t hotness_count_;
 struct PtrSizedFields {
    ArtMethod** dex_cache_resolved_methods_;//1
    void* data_;
    void* entry_point_from_piled_code_;//2
  } ptr_sized_fields_;
}
ArtMethod结构中比较重要的字段是注释1处的dex_cache_resolved_methods和注释2处的entry_point_from_piled_code,它们是方法的执行入口,当我们调用某一个方法时(比如Key的show方法),就会取得show方法的执行入口,通过执行入口就可以跳过去执行show方法。 替换ArtMethod结构体中的字段或者替换整个ArtMethod结构体,这就是底层替换方案。 AndFix采用的是替换ArtMethod结构体中的字段,这样会有兼容问题,因为厂商可能会修改ArtMethod结构体,导致方法替换失败。Sophix采用的是替换整个ArtMethod结构体,这样不会存在兼容问题。 底层替换方案直接替换了方法,可以立即生效不需要重启。采用底层替换方案主要是阿里系为主,包括AndFix、Dexposed、阿里百川、Sophix。
除了资源修复,代码修复同样也可以借鉴Instant Run的原理, 可以说Instant Run的出现推动了热修复框架的发展。 Instant Run在第一次构建apk时,使用ASM在每一个方法中注入了类似如下的代码:
IncrementalChange localIncrementalChange = $change;//1
        if (localIncrementalChange != null) {//2
            localIncrementalChange.access$dispatch(
                    "onCreate.(Landroid/os/Bundle;)V", new Object[] { this,
                            paramBundle });
            return;
        }
其中注释1处是一个成员变量localIncrementalChange ,它的值为$change,$change实现了IncrementalChange这个抽象接口。当我们点击InstantRun时,如果方法没有变化则$change为null,就调用return,不做任何处理。
如果方法有变化,就生成替换类,这里我们假设MainActivity的onCreate方法做了修改,就会生成替换类MainActivity$override,这个类实现了IncrementalChange接口,同时也会生成一个AppPatchesLoaderImpl类,这个类的getPatchedClasses方法会返回被修改的类的列表(里面包含了MainActivity)。
根据列表会将MainActivity的$change设置为MainActivity$override,因此满足了注释2的条件,会执行MainActivity$override的access$dispatch方法,accessd i s p a t c h 方 法 中 会 根 据 参 数 ” o n C r e a t e . ( L a n d r o i d / o s / B u n d l e ; ) V ” 执 行 ‘ M a i n A c t i v i t y dispatch方法中会根据参数”onCreate.(Landroid/os/Bundle;)V”执行MainActivitydispatch方法中会根据参数”onCreate.(Landroid/os/Bundle;)V”执行‘MainActivityoverride的onCreate方法,从而实现了onCreate方法的修改。 借鉴Instant Run的原理的热修复框架有Robust和Aceso。



本文主要浅析了热修复中的;资源修复,so库修复。深度讲解了代码修复中的三个方案。更多Android技术学习,及得关注评论哦!
以上就是关于去除GG修改器root提示_gg修改器怎么修复root的全部内容,感谢大家的浏览观看,如果你喜欢本站的文章可以CTRL+D收藏哦。

gg修改器软root怎么使用_gg修改器需要root怎么办 大小:11.21MB9,963人安装 大家好,今天小编为大家分享关于gg修改器软root怎么使用_gg修改器需要root怎么办的……
下载
GG修改器最新安卓,GG修改器最新安卓:让你畅玩游戏的神器 大小:10.21MB8,692人安装 当今社会,游戏已经成为人们日常生活中不可或缺的一部分,很多人通过游戏来放松压力……
下载
免root框架支持gg修改器_gg修改器框架免root版中文 大小:14.13MB9,764人安装 大家好,今天小编为大家分享关于免root框架支持gg修改器_gg修改器框架免root版中文……
下载
gg代码修改器最新版本,提高效率的神器gg代码修改器最新版本 大小:18.39MB8,611人安装 在当今信息时代,计算机软件逐渐占据了我们日常工作的核心地位,而程序员也因此成为……
下载
gg修改器中文版的官网网址,GG修改器中文版官网:全面提升游戏体验 大小:10.52MB8,880人安装 现在的游戏越来越火爆,但随之而来的问题就是游戏环境变得越来越复杂,除了游戏本身……
下载
gg修改器中文汉化版,如何通过gg修改器中文汉化版来提高游戏体验 大小:8.09MB8,708人安装 gg修改器是一款广受欢迎的游戏辅助软件,中文汉化版更是让很多玩家受益。这个修改器……
下载
gg修改器在哪下载免root的,如何在无需root的情况下下载gg修改器? 大小:11.82MB8,890人安装 gg修改器是一款非常实用的软件,它可以帮助我们在游戏中修改金币、道具和游戏设置等……
下载
最新gg修改器怎么下,最新gg修改器怎么下? 大小:11.34MB8,496人安装 最新gg修改器是一款功能强大而且非常实用的游戏辅助工具,可以帮助玩家实现更高效的……
下载
gg游戏修改器视频如何使用,GG游戏修改器视频如何使用 大小:10.68MB8,974人安装 现在的游戏越来越丰富多彩,但是随之而来的问题也不断增加,例如游戏画质较差、游戏……
下载
gg修改器怎么调回中文_gg更改器怎么用 大小:13.23MB9,803人安装 大家好,今天小编为大家分享关于gg修改器怎么调回中文_gg更改器怎么用的内容,赶快……
下载