Refactor project structure

This commit is contained in:
solohsu 2019-03-19 02:12:56 +08:00
parent 573f52360a
commit 53d0dbd120
207 changed files with 423 additions and 250 deletions

View File

@ -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"
}
}
}

View File

@ -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

View File

@ -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

View File

@ -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 {
}

61
edxp-yahfa/build.gradle Normal file
View File

@ -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"
}
}
}

View File

@ -0,0 +1 @@
<manifest package="com.elderdrivers.riru.edxp.yahfa" />

View File

@ -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);
}

View File

@ -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();
}
///////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -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();
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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