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
|
||||
|
||||
1. run `:Bridge:makeAndCopyRelease` in Gradle window to build `edxp.jar`
|
||||
2. run `:Core:zipRelease` to build Magisk Riru module flashable zip file
|
||||
3. find the flashable under `Core/release/`
|
||||
4. flash the zip in recovery mode or in Magisk Manager
|
||||
1. run `./gradlew :edxp-core:zipRelease` to build flashable zip
|
||||
2. find the flashable under `edxp-core/release/`
|
||||
3. flash the zip in recovery mode or in Magisk Manager
|
||||
|
||||
## Install
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ buildscript {
|
|||
jcenter()
|
||||
}
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import org.gradle.internal.os.OperatingSystem;
|
||||
|
||||
import org.gradle.internal.os.OperatingSystem
|
||||
apply plugin: 'com.android.library'
|
||||
version "v0.3.1.6_beta-SNAPSHOT"
|
||||
extensions["module_name"] = "EdXposed"
|
||||
|
|
@ -28,12 +27,12 @@ afterEvaluate {
|
|||
def nameCapped = variant.name.capitalize()
|
||||
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 '..'
|
||||
commandLine 'sh', 'build.sh', \
|
||||
project.name, \
|
||||
"${project.version}-${nameLowered}", \
|
||||
"${project.extensions['module_name']}"
|
||||
commandLine 'sh', 'build.sh', \
|
||||
project.name, \
|
||||
"${project.version}-${nameLowered}", \
|
||||
"${project.extensions['module_name']}"
|
||||
}
|
||||
|
||||
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 dalvik.system.PathClassLoader;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
public class ClassLoaderUtils {
|
||||
|
||||
|
|
@ -91,7 +92,7 @@ public class ClassLoaderUtils {
|
|||
try {
|
||||
PathClassLoader baseDexClassLoader = (PathClassLoader) classLoader;
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||
baseDexClassLoader.addDexPath(DEXPATH);
|
||||
XposedHelpers.callMethod(baseDexClassLoader, "addDexPath", DEXPATH);
|
||||
} else {
|
||||
DexUtils.injectDexAtFirst(DEXPATH, baseDexClassLoader);
|
||||
}
|
||||
|
|
@ -7,6 +7,7 @@ import android.os.Process;
|
|||
import com.elderdrivers.riru.common.KeepAll;
|
||||
import com.elderdrivers.riru.edxp.BuildConfig;
|
||||
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.NormalProxy;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
|
|
@ -26,6 +27,7 @@ public class Main implements KeepAll {
|
|||
static {
|
||||
init(Build.VERSION.SDK_INT);
|
||||
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.os.Build;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Log;
|
||||
|
||||
import com.elderdrivers.riru.edxp.yahfa.Main;
|
||||
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.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
|
@ -243,4 +246,17 @@ public class DexMakerUtils {
|
|||
}
|
||||
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;
|
||||
|
||||
import android.app.AndroidAppHelper;
|
||||
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.dexmaker.DynamicBridge;
|
||||
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.WorkAroundHookInfo;
|
||||
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.XposedInit;
|
||||
|
|
@ -18,6 +24,9 @@ public class Router {
|
|||
|
||||
public volatile static boolean forkCompleted = false;
|
||||
|
||||
private static volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
|
||||
|
||||
|
||||
public static void prepare(boolean isSystem) {
|
||||
// this flag is needed when loadModules
|
||||
XposedInit.startsSystemServer = isSystem;
|
||||
|
|
@ -43,6 +52,10 @@ public class Router {
|
|||
public static void installBootstrapHooks(boolean isSystem) {
|
||||
// Initialize the Xposed framework
|
||||
try {
|
||||
if (!bootstrapHooked.compareAndSet(false, true)) {
|
||||
return;
|
||||
}
|
||||
Router.startBootstrapHook(isSystem);
|
||||
XposedInit.initForZygote(isSystem);
|
||||
} catch (Throwable t) {
|
||||
Utils.logE("error during Xposed initialization", t);
|
||||
|
|
@ -93,4 +106,19 @@ public class Router {
|
|||
forkCompleted = true;
|
||||
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