Refactor project structure
This commit is contained in:
parent
573f52360a
commit
53d0dbd120
|
|
@ -1,132 +0,0 @@
|
||||||
import groovy.xml.XmlUtil
|
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
|
||||||
|
|
||||||
gradle.projectsEvaluated {
|
|
||||||
tasks.withType(JavaCompile) {
|
|
||||||
options.compilerArgs.add('-Xbootclasspath/p:libs/framework-stub.jar')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
|
||||||
compileSdkVersion 28
|
|
||||||
buildToolsVersion '28.0.3'
|
|
||||||
|
|
||||||
defaultConfig {
|
|
||||||
multiDexEnabled false
|
|
||||||
minSdkVersion 23
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
java.srcDirs += ['src/main/apacheCommonsLang']
|
|
||||||
jniLibs.srcDirs = ['libs']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTypes {
|
|
||||||
release {
|
|
||||||
minifyEnabled true
|
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Only build the release variant
|
|
||||||
// variantFilter { variant ->
|
|
||||||
// if (variant.buildType.name != BuilderConstants.DEBUG) {
|
|
||||||
// variant.ignore = true
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
|
||||||
|
|
||||||
task generateStubs(type: Javadoc, dependsOn: 'compileReleaseSources') {
|
|
||||||
source = file('src/main/java')
|
|
||||||
ext.stubsDir = "$buildDir/api/stub-sources"
|
|
||||||
outputs.dir ext.stubsDir
|
|
||||||
title = null
|
|
||||||
|
|
||||||
options {
|
|
||||||
doclet = 'com.google.doclava.Doclava'
|
|
||||||
docletpath = fileTree(dir: 'doclib', include: '**/*.jar').asType(List)
|
|
||||||
jFlags '-Dignore.symbol.file'
|
|
||||||
addBooleanOption 'nodocs', true
|
|
||||||
addFileOption 'stubs', file(ext.stubsDir)
|
|
||||||
addFileOption 'api', file('doclib/api/current.txt')
|
|
||||||
addBooleanOption 'hide 111', true
|
|
||||||
addBooleanOption 'hide 113', true
|
|
||||||
addBooleanOption 'hidePackage xposed.dummy', true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
task compileStubs(type: JavaCompile, dependsOn: 'generateStubs') {
|
|
||||||
source = fileTree(generateStubs.ext.stubsDir)
|
|
||||||
destinationDir = file("$buildDir/api/stub-classes")
|
|
||||||
options.compilerArgs += '-XDsuppressNotes'
|
|
||||||
}
|
|
||||||
|
|
||||||
task jarStubs(type: Jar) {
|
|
||||||
from compileStubs
|
|
||||||
destinationDir = file("$buildDir/api")
|
|
||||||
baseName = 'api'
|
|
||||||
}
|
|
||||||
|
|
||||||
task jarStubsSource(type: Jar) {
|
|
||||||
from generateStubs.source
|
|
||||||
destinationDir = jarStubs.destinationDir
|
|
||||||
baseName = jarStubs.baseName
|
|
||||||
classifier = 'sources'
|
|
||||||
}
|
|
||||||
|
|
||||||
task generateAPI(dependsOn: ['generateStubs', 'jarStubs', 'jarStubsSource'])
|
|
||||||
|
|
||||||
// Make sure that hiddenapistubs are placed before the Android SDK in app.iml
|
|
||||||
// as there doesn't seem to be any way to configure this in Android Studio.
|
|
||||||
task fixIml {
|
|
||||||
ext.imlFile = projectDir.absolutePath + '/' + project.name + '.iml'
|
|
||||||
inputs.file imlFile
|
|
||||||
outputs.file imlFile
|
|
||||||
|
|
||||||
println imlFile
|
|
||||||
doLast {
|
|
||||||
def imlFile = file(project.name + ".iml")
|
|
||||||
println 'Change ' + project.name + '.iml order'
|
|
||||||
try {
|
|
||||||
def parsedXml = (new XmlParser()).parse(imlFile)
|
|
||||||
def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
|
|
||||||
parsedXml.component[1].remove(jdkNode)
|
|
||||||
def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
|
|
||||||
new Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
|
|
||||||
XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
|
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
// nop, iml not found
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tasks.preBuild.dependsOn fixIml
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
compileOnly files("libs/framework-stub.jar")
|
|
||||||
compileOnly project(':dexmaker')
|
|
||||||
}
|
|
||||||
|
|
||||||
afterEvaluate {
|
|
||||||
|
|
||||||
task javac
|
|
||||||
|
|
||||||
tasks.withType(JavaCompile) {
|
|
||||||
options.compilerArgs.add('-Xbootclasspath/p:libs/framework-stub.jar')
|
|
||||||
}
|
|
||||||
|
|
||||||
android.applicationVariants.all { variant ->
|
|
||||||
def nameCapped = variant.name.capitalize()
|
|
||||||
def nameLowered = variant.name.toLowerCase()
|
|
||||||
|
|
||||||
def makeAndCopyTask = task("makeAndCopy${nameCapped}", type: Jar, dependsOn: "assemble${nameCapped}") {
|
|
||||||
from "build/intermediates/transforms/dexMerger/${nameLowered}/0/"
|
|
||||||
destinationDir file("../Core/template_override/system/framework/")
|
|
||||||
baseName "edxp"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -32,10 +32,9 @@ and zip binaries can be downloaded from [here](http://gnuwin32.sourceforge.net/p
|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
1. run `:Bridge:makeAndCopyRelease` in Gradle window to build `edxp.jar`
|
1. run `./gradlew :edxp-core:zipRelease` to build flashable zip
|
||||||
2. run `:Core:zipRelease` to build Magisk Riru module flashable zip file
|
2. find the flashable under `edxp-core/release/`
|
||||||
3. find the flashable under `Core/release/`
|
3. flash the zip in recovery mode or in Magisk Manager
|
||||||
4. flash the zip in recovery mode or in Magisk Manager
|
|
||||||
|
|
||||||
## Install
|
## Install
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ buildscript {
|
||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.2.1'
|
classpath 'com.android.tools.build:gradle:3.3.2'
|
||||||
|
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import org.gradle.internal.os.OperatingSystem;
|
import org.gradle.internal.os.OperatingSystem
|
||||||
|
|
||||||
apply plugin: 'com.android.library'
|
apply plugin: 'com.android.library'
|
||||||
version "v0.3.1.6_beta-SNAPSHOT"
|
version "v0.3.1.6_beta-SNAPSHOT"
|
||||||
extensions["module_name"] = "EdXposed"
|
extensions["module_name"] = "EdXposed"
|
||||||
|
|
@ -28,12 +27,12 @@ afterEvaluate {
|
||||||
def nameCapped = variant.name.capitalize()
|
def nameCapped = variant.name.capitalize()
|
||||||
def nameLowered = variant.name.toLowerCase()
|
def nameLowered = variant.name.toLowerCase()
|
||||||
|
|
||||||
def zipTask = task("zip${nameCapped}", type: Exec, dependsOn: ":Bridge:makeAndCopy${nameCapped}") {
|
def zipTask = task("zip${nameCapped}", type: Exec, dependsOn: ":edxp-yahfa:makeAndCopy${nameCapped}") {
|
||||||
workingDir '..'
|
workingDir '..'
|
||||||
commandLine 'sh', 'build.sh', \
|
commandLine 'sh', 'build.sh', \
|
||||||
project.name, \
|
project.name, \
|
||||||
"${project.version}-${nameLowered}", \
|
"${project.version}-${nameLowered}", \
|
||||||
"${project.extensions['module_name']}"
|
"${project.extensions['module_name']}"
|
||||||
}
|
}
|
||||||
|
|
||||||
def pushTask = task("push${nameCapped}", type: Exec) {
|
def pushTask = task("push${nameCapped}", type: Exec) {
|
||||||
|
|
@ -51,3 +50,6 @@ afterEvaluate {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 28
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "com.elderdrivers.riru.edxp.yahfa"
|
||||||
|
minSdkVersion 26
|
||||||
|
targetSdkVersion 28
|
||||||
|
versionCode 1
|
||||||
|
versionName "1.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly files("libs/framework-stub.jar")
|
||||||
|
implementation project(':xposed-bridge')
|
||||||
|
compileOnly project(':dexmaker')
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
preBuild.doLast {
|
||||||
|
def imlFile = file(project.name + ".iml")
|
||||||
|
println 'Change ' + project.name + '.iml order'
|
||||||
|
try {
|
||||||
|
def parsedXml = (new groovy.util.XmlParser()).parse(imlFile)
|
||||||
|
def jdkNode = parsedXml.component[1].orderEntry.find { it.'@type' == 'jdk' }
|
||||||
|
parsedXml.component[1].remove(jdkNode)
|
||||||
|
def sdkString = "Android API " + android.compileSdkVersion.substring("android-".length()) + " Platform"
|
||||||
|
new groovy.util.Node(parsedXml.component[1], 'orderEntry', ['type': 'jdk', 'jdkName': sdkString, 'jdkType': 'Android SDK'])
|
||||||
|
groovy.xml.XmlUtil.serialize(parsedXml, new FileOutputStream(imlFile))
|
||||||
|
} catch (FileNotFoundException e) {
|
||||||
|
// nop, iml not found
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
afterEvaluate {
|
||||||
|
|
||||||
|
tasks.withType(JavaCompile) {
|
||||||
|
options.compilerArgs.add("-Xbootclasspath/p:${projectDir.absolutePath}/libs/framework-stub.jar")
|
||||||
|
}
|
||||||
|
|
||||||
|
android.applicationVariants.all { variant ->
|
||||||
|
def nameCapped = variant.name.capitalize()
|
||||||
|
def nameLowered = variant.name.toLowerCase()
|
||||||
|
|
||||||
|
def makeAndCopyTask = task("makeAndCopy${nameCapped}", type: Jar, dependsOn: "assemble${nameCapped}") {
|
||||||
|
from "build/intermediates/dex/${nameLowered}/mergeDex${nameCapped}/out/"
|
||||||
|
destinationDir file("../edxp-core/template_override/system/framework/")
|
||||||
|
baseName "edxp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
<manifest package="com.elderdrivers.riru.edxp.yahfa" />
|
||||||
|
|
@ -11,6 +11,7 @@ import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import dalvik.system.PathClassLoader;
|
import dalvik.system.PathClassLoader;
|
||||||
|
import de.robv.android.xposed.XposedHelpers;
|
||||||
|
|
||||||
public class ClassLoaderUtils {
|
public class ClassLoaderUtils {
|
||||||
|
|
||||||
|
|
@ -91,7 +92,7 @@ public class ClassLoaderUtils {
|
||||||
try {
|
try {
|
||||||
PathClassLoader baseDexClassLoader = (PathClassLoader) classLoader;
|
PathClassLoader baseDexClassLoader = (PathClassLoader) classLoader;
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
baseDexClassLoader.addDexPath(DEXPATH);
|
XposedHelpers.callMethod(baseDexClassLoader, "addDexPath", DEXPATH);
|
||||||
} else {
|
} else {
|
||||||
DexUtils.injectDexAtFirst(DEXPATH, baseDexClassLoader);
|
DexUtils.injectDexAtFirst(DEXPATH, baseDexClassLoader);
|
||||||
}
|
}
|
||||||
|
|
@ -7,6 +7,7 @@ import android.os.Process;
|
||||||
import com.elderdrivers.riru.common.KeepAll;
|
import com.elderdrivers.riru.common.KeepAll;
|
||||||
import com.elderdrivers.riru.edxp.BuildConfig;
|
import com.elderdrivers.riru.edxp.BuildConfig;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.core.HookMethodResolver;
|
import com.elderdrivers.riru.edxp.yahfa.core.HookMethodResolver;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.proxy.BlackWhiteListProxy;
|
import com.elderdrivers.riru.edxp.yahfa.proxy.BlackWhiteListProxy;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.proxy.NormalProxy;
|
import com.elderdrivers.riru.edxp.yahfa.proxy.NormalProxy;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
|
|
@ -26,6 +27,7 @@ public class Main implements KeepAll {
|
||||||
static {
|
static {
|
||||||
init(Build.VERSION.SDK_INT);
|
init(Build.VERSION.SDK_INT);
|
||||||
HookMethodResolver.init();
|
HookMethodResolver.init();
|
||||||
|
Router.injectConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.elderdrivers.riru.edxp.yahfa.config;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.edxp.config.EdXpConfig;
|
||||||
|
import com.elderdrivers.riru.edxp.config.InstallerChooser;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.Main;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.entry.hooker.XposedBlackListHooker;
|
||||||
|
|
||||||
|
public class YahfaEdxpConfig implements EdXpConfig {
|
||||||
|
@Override
|
||||||
|
public String getInstallerBaseDir() {
|
||||||
|
return InstallerChooser.INSTALLER_DATA_BASE_DIR;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getBlackListModulePackageName() {
|
||||||
|
return XposedBlackListHooker.BLACK_LIST_PACKAGE_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isDynamicModulesMode() {
|
||||||
|
return Main.isDynamicModulesEnabled();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
package com.elderdrivers.riru.edxp.yahfa.config;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
||||||
|
import com.elderdrivers.riru.edxp.util.PrebuiltMethodsDeopter;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
||||||
|
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
import java.lang.reflect.Member;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
|
public class YahfaHookProvider implements HookProvider {
|
||||||
|
@Override
|
||||||
|
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
||||||
|
DynamicBridge.hookMethod(method, additionalInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object invokeOriginalMethod(Member method, Object thisObject, Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
|
||||||
|
return DynamicBridge.invokeOriginalMethod(method, thisObject, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Member findMethodNative(Member hookMethod) {
|
||||||
|
return DexMakerUtils.findMethodNative(hookMethod);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void deoptMethods(String packageName, ClassLoader classLoader) {
|
||||||
|
PrebuiltMethodsDeopter.deoptMethods(packageName, classLoader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,10 +3,13 @@ package com.elderdrivers.riru.edxp.yahfa.dexmaker;
|
||||||
import android.app.AndroidAppHelper;
|
import android.app.AndroidAppHelper;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
import com.elderdrivers.riru.edxp.yahfa.Main;
|
import com.elderdrivers.riru.edxp.yahfa.Main;
|
||||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.core.HookMain;
|
||||||
|
|
||||||
|
import java.lang.reflect.Member;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
@ -243,4 +246,17 @@ public class DexMakerUtils {
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Member findMethodNative(Member hookMethod) {
|
||||||
|
MethodInfo methodInfo = new MethodInfo(hookMethod);
|
||||||
|
Class declaringClass = methodInfo.getClassForSure();
|
||||||
|
Member reflectMethod = (Member) HookMain.findMethod(
|
||||||
|
declaringClass, methodInfo.methodName, methodInfo.methodSig);
|
||||||
|
if (reflectMethod == null) {
|
||||||
|
DexLog.e("method not found: name="
|
||||||
|
+ methodInfo.methodName + ", sig=" + methodInfo.methodSig);
|
||||||
|
reflectMethod = hookMethod;
|
||||||
|
}
|
||||||
|
return reflectMethod;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
package com.elderdrivers.riru.edxp.yahfa.entry;
|
package com.elderdrivers.riru.edxp.yahfa.entry;
|
||||||
|
|
||||||
|
import android.app.AndroidAppHelper;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
||||||
|
import com.elderdrivers.riru.edxp.util.Utils;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.config.YahfaEdxpConfig;
|
||||||
|
import com.elderdrivers.riru.edxp.yahfa.config.YahfaHookProvider;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.core.HookMain;
|
import com.elderdrivers.riru.edxp.yahfa.core.HookMain;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.AppBootstrapHookInfo;
|
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.AppBootstrapHookInfo;
|
||||||
|
|
@ -9,7 +14,8 @@ import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.SysBootstrapHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.SysInnerHookInfo;
|
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.SysInnerHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.WorkAroundHookInfo;
|
import com.elderdrivers.riru.edxp.yahfa.entry.bootstrap.WorkAroundHookInfo;
|
||||||
import com.elderdrivers.riru.edxp.yahfa.entry.hooker.SystemMainHooker;
|
import com.elderdrivers.riru.edxp.yahfa.entry.hooker.SystemMainHooker;
|
||||||
import com.elderdrivers.riru.edxp.util.Utils;
|
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
import de.robv.android.xposed.XposedInit;
|
import de.robv.android.xposed.XposedInit;
|
||||||
|
|
@ -18,6 +24,9 @@ public class Router {
|
||||||
|
|
||||||
public volatile static boolean forkCompleted = false;
|
public volatile static boolean forkCompleted = false;
|
||||||
|
|
||||||
|
private static volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
|
||||||
|
|
||||||
|
|
||||||
public static void prepare(boolean isSystem) {
|
public static void prepare(boolean isSystem) {
|
||||||
// this flag is needed when loadModules
|
// this flag is needed when loadModules
|
||||||
XposedInit.startsSystemServer = isSystem;
|
XposedInit.startsSystemServer = isSystem;
|
||||||
|
|
@ -43,6 +52,10 @@ public class Router {
|
||||||
public static void installBootstrapHooks(boolean isSystem) {
|
public static void installBootstrapHooks(boolean isSystem) {
|
||||||
// Initialize the Xposed framework
|
// Initialize the Xposed framework
|
||||||
try {
|
try {
|
||||||
|
if (!bootstrapHooked.compareAndSet(false, true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Router.startBootstrapHook(isSystem);
|
||||||
XposedInit.initForZygote(isSystem);
|
XposedInit.initForZygote(isSystem);
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
Utils.logE("error during Xposed initialization", t);
|
Utils.logE("error during Xposed initialization", t);
|
||||||
|
|
@ -93,4 +106,19 @@ public class Router {
|
||||||
forkCompleted = true;
|
forkCompleted = true;
|
||||||
DynamicBridge.onForkPost();
|
DynamicBridge.onForkPost();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void logD(String prefix) {
|
||||||
|
Utils.logD(String.format("%s: pkg=%s, prc=%s", prefix, AndroidAppHelper.currentPackageName(),
|
||||||
|
AndroidAppHelper.currentProcessName()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void logE(String prefix, Throwable throwable) {
|
||||||
|
Utils.logE(String.format("%s: pkg=%s, prc=%s", prefix, AndroidAppHelper.currentPackageName(),
|
||||||
|
AndroidAppHelper.currentProcessName()), throwable);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void injectConfig() {
|
||||||
|
EdXpConfigGlobal.sConfig = new YahfaEdxpConfig();
|
||||||
|
EdXpConfigGlobal.sHookProvider = new YahfaHookProvider();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue