坑1:
跑起来出现class ref in pre-verified class resolved to unexpected implementation
解决1:
是因为XposedBridgeApi-<version>.jar这个包要放在lib文件夹下,需要自己新建一个lib文件夹,然后选中jar包添加到build_path,不能放在android工程自带的libs中去,或者放在和项目同级下面然后右键build path添加进去。
集成方式:
需要root的手机并且安装xposed框架,试过genymotion和夜神模拟器都不行,逍遥模拟器可以使用
添加xposed jar包到根目录
AndroidManifest.xml添加
<!-- Xposed -->
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposedminversion"
android:value="54" />
<meta-data
android:name="xposeddescription"
android:value="test" />
assets文件添加xposed_init文件com.example.hook_test.TestHook(包名加hook类名)
复杂的资源替换
public class ColoredCircleBattery implements IXposedHookZygoteInit, IXposedHookInitPackageResources {
private static String MODULE_PATH = null;
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
MODULE_PATH = startupParam.modulePath;
}
@Override
public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable {
if (!resparam.packageName.equals("com.android.systemui"))
return;
XModuleResources modRes = XModuleResources.createInstance(MODULE_PATH, resparam.res);
resparam.res.setReplacement("com.android.systemui", "drawable", "stat_sys_battery", modRes.fwd(R.drawable.battery_icon));
resparam.res.setReplacement("com.android.systemui", "drawable", "stat_sys_battery_charge", modRes.fwd(R.drawable.battery_icon_charge));
}
}
//修改布局:实现IXposedHookInitPackageResources
//资源替换:@Override public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable { if (!resparam.packageName.equals("com.android.systemui")) return; resparam.res.hookLayout("com.android.systemui", "layout", "status_bar", new XC_LayoutInflated() { @Override public void handleLayoutInflated(LayoutInflatedParam liparam) throws Throwable { TextView clock = (TextView) liparam.view.findViewById( liparam.res.getIdentifier("clock", "id", "com.android.systemui")); clock.setTextColor(Color.RED); } }); }
@Override public void initZygote(IXposedHookZygoteInit.StartupParam startupParam) throws Throwable { XResources.setSystemWideReplacement("android", "bool", "config_unplugTurnsOnScreen", false); } @Override public void handleInitPackageResources(InitPackageResourcesParam resparam) throws Throwable { // replacements only for SystemUI if (!resparam.packageName.equals("com.android.systemui")) return; // different ways to specify the resources to be replaced resparam.res.setReplacement(0x7f080083, "YEAH!"); // WLAN toggle text. You should not do this because the id is not fixed. Only for framework resources, you could use android.R.string.something resparam.res.setReplacement("com.android.systemui:string/quickpanel_bluetooth_text", "WOO!"); resparam.res.setReplacement("com.android.systemui", "string", "quickpanel_gps_text", "HOO!"); resparam.res.setReplacement("com.android.systemui", "integer", "config_maxLevelOfSignalStrengthIndicator", 6); }
//返回值修改:public class TestHook implements IXposedHookLoadPackage{ @Override public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable { if ("".equals(lpparam.packageName))// System { return; } XposedHelpers.findAndHookMethod("org.example.android_test.MainActivity", lpparam.classLoader, "test", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { XposedBridge.log("test------------"); param.setResult("成功"); } }); } }