红米3s可以装xposed吗

红米3s可以装xposed吗,第1张

进system /framework 删除secondary-frameworkjarjex和servicesjarjex (这两个档案必删,不删的话会卡黄米)

删除androidpolicyjarjex (想使用Mi-Tools就得删这个档案)

注意。不是删除secondary-frameworkjar和servicesjar和androidpolicyjar,千万不要删错了。 用re文本编辑器打开/system/buildprop。添加如下命令

dalvikvmexecution-mode=int:fast

dalvikvmjitcodecachesize=0 (这目的是关闭JIT,避免闪退)

然后保存并退出,删除自动备份的文件。

针对Android平台,Dexposed支持函数级别的在线热更新,例如对已经发布在应用市场上的宿主APK,当我们从crash统计平台上发现某个函数调用有bug,导致经常性crash,这时,可以在本地开发一个补丁APK,并发布到服务器中,宿主APK下载这个补丁APK并集成后,就可以很容易修复这个crash。

Dexposed是基于久负盛名的开源Xposed框架实现的一个Android平台上功能强大的无侵入式运行时AOP框架。

Dexposed的AOP实现是完全非侵入式的,没有使用任何注解处理器,编织器或者字节码重写器。集成Dexposed框架很简单,只需要在应用初始化阶段加载一个很小的JNI库就可以,这个加载 *** 作已经封装在DexposedBridge函数库里面的canDexposed函数中,源码如下所示:

/

Check device if can run dexposed, and load libs auto

/

public synchronized static boolean canDexposed(Context context) {

if (!DeviceCheckisDeviceSupport(context)) {

return false;

}

//load xposed lib for hook

return loadDexposedLib(context);

}

private static boolean loadDexposedLib(Context context) {

// load xposed lib for hook

try {

if (androidosBuildVERSIONSDK_INT > 19){

SystemloadLibrary("dexposed_l");

} else if (androidosBuildVERSIONSDK_INT == 10

|| androidosBuildVERSIONSDK_INT == 9 ||

androidosBuildVERSIONSDK_INT > 14){

SystemloadLibrary("dexposed");

}

return true;

} catch (Throwable e) {

return false;

}

}

Dexposed实现的hooking,不仅可以hook应用中的自定义函数,也可以hook应用中调用的Android框架的函数。Android开发者将从这一点得到很多好处,因为我们严重依赖于Android SDK的版本碎片化。

推荐1重力工具箱:Xposed框架上必备神器级模块,软件原生支持中文,可以修改和定制非常多系统级的功能。原生这个工具只能用于MTK平台,现在作者已经将它弄成通用的了。喜欢Xposed框架的机友必备!

2应用变量:

必备的修改手机型号的模块,它不但可以修改型号,还可以对不同应用自定义成不同的型号。

因为 dexposed 其实是用了dvm和art调用class的方式来做的, 而dvm和art的头文件什么的在android源码中, 所以下一份源码, 具体办法见上一个博文:准备android源码库

最简单的hook

MainActivity中有个test函数, 原来返回11111, 在调用hook之前正常返回的; 调用hook之后, 调用 同一个函数 , 但是却返回22222

public class MainActivity extends Activity

{

static {

SystemloadLibrary("hookdemo");

}

public static final String TAG = "===[hookdemo]===";

@Override

protected void onCreate(Bundle savedInstanceState)

{

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

String param1 = "param1";

Logd(TAG, "===========before hook test:" + thistest(param1));

hook(MainActivityclass, "test", "(Ljava/lang/String;)Ljava/lang/String;");

Logd(TAG, "===========after hook test:" + thistest(param1));

Logd(TAG, "===========before hook staticTest:" + thisstaticTest(param1));

hook(MainActivityclass, "staticTest", "(Ljava/lang/String;)Ljava/lang/String;");

Logd(TAG, "===========after hook staticTest:" + thisstaticTest(param1));

}

public static String staticTest(String param1)

{

return "staticTest";

}

public String test(String param1)

{

return "11111";

}

public native void hook(Class<> clazzToHook, String methodName, String methodSig);

}

ndk 中的部分

#include <jnih>

#include "logh"

#include "Dalvikh"

void showMethodInfo(const Method method)

{

//看看method的各个属性都是啥:

LOGD("accessFlags:%d",method->accessFlags);

LOGD("clazz->descriptor:%s",method->clazz->descriptor);

LOGD("clazz->sourceFile:%s",method->clazz->sourceFile);

LOGD("methodIndex:%d",method->methodIndex);

LOGD("name:%s",method->name);

LOGD("shorty:%s",method->shorty);

}

/

替换原来java类中test方法的 本地c 函数

args : 原来函数的参数数组

pResult: 返回值

/

static void newTestMethod(const u4 args, JValue pResult,

const Method method, struct Thread self) {

showMethodInfo(method);

// args 是原来函数的参数数组, 原来test函数只有一个String型参数

// 并且要注意, 如果是不是static函数, 下标0 是函数所在类的实例obj

// 在dvm中Object, jni 中的jobject 和 java 中的 Object类 都不是同一个东西

// String类对应StringObject

// 取出参数打印出来看看

StringObject param1 = NULL;

if(dvmIsStaticMethod(method))

param1 = (StringObject)args[0];

else

param1 = (StringObject)args[1];

LOGD("param1:%s",dvmCreateCstrFromString(param1));

//JValue 是个union ,要返回int 就 pResult->i=1; 返回Object对象就 pResult->l = ojb;

// 但是, 在dvm中的Object, jni 中的jobject 和 java 中的 Object类 都不是同一个东西

// 所以, 我们这里使用dvm的函数来创建一个StringObject

pResult->l = dvmCreateStringFromCstr("newTestMethod");

// 一般情况应该使用宏 : RETURN_XXX(result);

return;

}

/

hook 的jni 函数

/

extern "C" JNIEXPORT void JNICALL

Java_com_zhaoxiaodan_hookdemo_MainActivity_hook(JNIEnv env, jobject instance, jobject clazzToHook,

jstring methodName_, jstring methodSig_) {

const char methodName = env->GetStringUTFChars(methodName_, 0);

const char methodSig = env->GetStringUTFChars(methodSig_, 0);

jmethodID methodIDToHook = env->GetMethodID((jclass) clazzToHook,methodName,methodSig);

// 找不到有可能是个static

if(nullptr == methodIDToHook){

env->ExceptionClear();

methodIDToHook = env->GetStaticMethodID((jclass) clazzToHook,methodName,methodSig);

}

if(methodIDToHook != nullptr)

{

//主要在这里替换

//jmethodID 在dvm里实际上就是个Method 结构体

Method method = (Method) methodIDToHook;

//看看method的各个属性都是啥:

showMethodInfo(method);

//设置Method 的 accessFlags 为 枚举型

// ACC_NATIVE 表示 这个method 切换成了一个native 方法

// 这个枚举 在 dalvik/libdex/DexFileh

// 类似:

// ACC_PUBLIC = 0x00000001, // class, field, method, ic

// ACC_PRIVATE = 0x00000002, // field, method, ic

// ACC_PROTECTED = 0x00000004, // field, method, ic

SET_METHOD_FLAG(method, ACC_NATIVE);

//既然是一个native方法, 那就把 nativeFunc 指针指向我们的hook, 用来替换test的新方法

method->nativeFunc = &newTestMethod;

// registersSize是函数栈大小, insSize是参数占用大小

// 如果是native方法, 就没有额外开销了

// 所有开销就是参数占用, 所以把它设置成跟参数占用空间

method->registersSize=method->insSize;

//未知

method->outsSize=0;

}

env->ReleaseStringUTFChars(methodName_, methodName);

env->ReleaseStringUTFChars(methodSig_, methodSig);

}

extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM vm, void reserved)

{

JNIEnv env = nullptr;

if (vm->GetEnv((void) &env, JNI_VERSION_1_6) != JNI_OK) {

return -1;

}

return JNI_VERSION_1_6;

}

运行之后得到:

===[hookdemo]===﹕ ===========before hook:11111

[---hookdemo---]﹕ 1

[---hookdemo---]﹕ Lcom/zhaoxiaodan/hookdemo/MainActivity;

[---hookdemo---]﹕ MainActivityjava

[---hookdemo---]﹕ 334

[---hookdemo---]﹕ test

[---hookdemo---]﹕ LL

[---hookdemo---]﹕ param1:

===[hookdemo]===﹕ ===========after hook:22222

王者荣耀O3,T & V,T优化方案修改教程(Root修改方案)

安卓版本:7x & 8x

农药版本:134111全量包及以上(App版本)

测试机型初始优化:O2,F(没有优化)

正文:(请务必看完本文所有内容再 *** 作,尤其是注意事项)

前提准备:

MT管理器20(同类软件均可,推荐MT)

Root权限(推荐Magisk)

*** 作步骤:

第一步:

路径:/data/data/comtencenttmgpsgame

文件夹:shared_prefs

改权限:0551(原权限0771,多了两项写入权限)

第二步:

路径:/data/data/comtencenttmgpsgame/shared_prefs/

文件:comtencenttmgpsgamev2playerprefsxml

改权限:0440(原权限0660,多了两项写入权限)

第三步:(两种优化2选1)

修改上一步的文件内容:

O3,T优化:

<int name="EnableGLES3" value="2" /> OpenGL选项

<int name="EnableMTR" value="1" /> 多线程选项

<int name="EnableVulkan" value="3" /> Vulkan选项

V,T优化:

<int name="EnableGLES3" value="3" /> OpenGL选项

<int name="EnableMTR" value="1" /> 多线程选项

<int name="EnableVulkan" value="2" /> Vulkan选项

数值的意义:

0是关闭,1是可以则开启,2是强制,3是隐藏

注:MTR多线程开启只能用数字1

Vulkan & OpenGL3优化开启可用数字1或2

注意:

1若出现没有的选项代码,则在任意位置添加缺失代码。以上3个代码之间的相对位置仅供参考,但注意代码添加的位置不要超过开头结尾的map语句之外,添加的代码单独另起一行与其他原代码书写格式上保持一致即可;

2所有步骤修改完毕后注意保存,修改过程中及修改后农药不要清除数据,否则文件会被清楚,手机重启前后不会失效,但app更新后不能保证失效与否;

3修改后,农药游戏内的部分设置内容会被锁定(具体哪些内容自己测试,反正都是些影响游戏体验的设置),建议玩家先登陆自己账号设置好具体的 *** 作设置后,再退出游戏app,最后执行整套 *** 作,以避免后续的重复登陆(取决于修改之前是否退出过账号)以及重复修改游戏设置(实际上完全无效)等问题;

4该方法只依赖Root,无需配合xposed及机型修改等 *** 作,修改V,T & O3,T的方法有很多,例如:Xposed应用变量,Magisk机型伪装以及非Root状态下利用分身多开类app即可办到,具体结合自身情况选择修改的方式,两种优化具体效果请玩家自行实战测试;

5关于两种优化:

Vulkan优化开启的最低要求:安卓70 & SOC 高通808(其他非高通系处理器自行测试);

O3,T优化目前没有指定机型,所以只能用本文的教程开启优化;Vulkan优化更换了渲染引擎,理论上画面和稳定性效果显著,未来V, T优化应为最佳状态。

以上就是关于红米3s可以装xposed吗全部的内容,包括:红米3s可以装xposed吗、Android插件化和热修复的区别和联系、Android 系统上的 Xposed 框架中都有哪些值得推荐的模块等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9566461.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存