进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 框架中都有哪些值得推荐的模块等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)