private static String configPath
=
"/data/local/tmp/xcube/xcube.yaml"
;
public static boolean hooked
=
false;
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
String remoteName
=
Utils.getRemoteName();
XcubeConfig config
=
new XcubeConfig(configPath);
if
(!config.active || !config.contains(loadPackageParam.packageName)) {
return
;
}
String script
=
config.getScriptPath(loadPackageParam.packageName);
Log.e(TAG,
"current app packageName : "
+
loadPackageParam.packageName
+
":"
+
remoteName);
XposedHelpers.findAndHookMethod(Application.
class
,
"attach"
, Context.
class
, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
Log.d(TAG,
"attach beforeHookedMethod script:"
+
script);
if
(hooked || !remoteName.isEmpty()) {
/
/
只hook主进程一次
return
;
}
try
{
Context base
=
(Context) param.args[
0
];
File
toPath
=
base.getDir(
"libs"
, Context.MODE_PRIVATE);
String libpath
=
"/data/local/tmp/xcube/"
;
String ABI
=
android.os.Process.is64Bit() ?
"arm64-v8a"
:
"armeabi-v7a"
;
/
/
System.loadlibrary使用的classloader是当前classloader,而param.args[
0
]是目标应用的classloader,二者不同
Log.d(TAG,
"attach beforeHookedMethod toPath:"
+
toPath);
LoadLibraryUtil.loadSoFile(this.getClass().getClassLoader(), libpath
+
ABI, toPath);
System.loadLibrary(
"xcubebase"
);
Log.d(TAG,
"script path :"
+
script);
gumjsHook(script);
hooked
=
true;
} catch (Throwable throwable) {
throwable.printStackTrace();
}
}
});
XposedHelpers.findAndHookMethod(Activity.
class
,
"onCreate"
, Bundle.
class
, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
((Activity) param.thisObject).getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
});
}