Skip to content

Commit 0327664

Browse files
committed
Migrate to new EdXposedManager installer app
1 parent bb1ac03 commit 0327664

File tree

5 files changed

+58
-68
lines changed

5 files changed

+58
-68
lines changed

Diff for: .gitattributes

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ META-INF/** text eol=lf
66
*.prop text eol=lf
77
*.sh text eol=lf
88
*.md text eol=lf
9+
update-binary text eol=lf
10+
update-script text eol=lf
911

1012
# Denote all files that are truly binary and should not be modified.
1113
*.so binary

Diff for: Bridge/src/main/java/com/elderdrivers/riru/xposed/dexmaker/DexMakerUtils.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
import external.com.android.dx.Local;
1515
import external.com.android.dx.TypeId;
1616

17+
import static de.robv.android.xposed.XposedInit.INSTALLER_DATA_BASE_DIR;
18+
1719
public class DexMakerUtils {
1820

1921
private static final boolean IN_MEMORY_DEX_ELIGIBLE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
20-
private static final String COMPAT_LIST_PATH = "/data/misc/riru/modules/edxposed/compatlist/";
22+
private static final String COMPAT_LIST_PATH = INSTALLER_DATA_BASE_DIR + "conf/compatlist/";
2123

2224
public static boolean shouldUseInMemoryHook() {
2325
if (!IN_MEMORY_DEX_ELIGIBLE) {

Diff for: Bridge/src/main/java/com/elderdrivers/riru/xposed/entry/hooker/XposedInstallerHooker.java

+2-48
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,19 @@
22

33
import com.elderdrivers.riru.xposed.util.Utils;
44

5-
import java.io.File;
6-
import java.io.FileInputStream;
7-
import java.io.IOException;
8-
9-
import de.robv.android.xposed.XC_MethodHook;
105
import de.robv.android.xposed.XC_MethodReplacement;
116
import de.robv.android.xposed.XposedBridge;
127

13-
import static de.robv.android.xposed.XposedHelpers.callStaticMethod;
148
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
15-
import static de.robv.android.xposed.XposedHelpers.findClass;
16-
import static de.robv.android.xposed.XposedHelpers.getObjectField;
17-
import static de.robv.android.xposed.XposedHelpers.setObjectField;
18-
import static de.robv.android.xposed.XposedInit.INSTALLER_PACKAGE_NAME;
9+
import static de.robv.android.xposed.XposedInit.INSTALLER_LEGACY_PACKAGE_NAME;
1910

2011
public class XposedInstallerHooker {
2112

2213
public static void hookXposedInstaller(ClassLoader classLoader) {
2314
try {
24-
final String xposedAppClass = INSTALLER_PACKAGE_NAME + ".XposedApp";
25-
final Class InstallZipUtil = findClass(INSTALLER_PACKAGE_NAME
26-
+ ".util.InstallZipUtil", classLoader);
15+
final String xposedAppClass = INSTALLER_LEGACY_PACKAGE_NAME + ".XposedApp";
2716
findAndHookMethod(xposedAppClass, classLoader, "getActiveXposedVersion",
2817
XC_MethodReplacement.returnConstant(XposedBridge.getXposedVersion()));
29-
findAndHookMethod(xposedAppClass, classLoader,
30-
"reloadXposedProp", new XC_MethodHook() {
31-
@Override
32-
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
33-
Utils.logD("before reloadXposedProp...");
34-
final String propFieldName = "mXposedProp";
35-
final Object thisObject = param.thisObject;
36-
if (getObjectField(thisObject, propFieldName) != null) {
37-
param.setResult(null);
38-
Utils.logD("reloadXposedProp already done, skip...");
39-
return;
40-
}
41-
File file = new File("/system/framework/edconfig.dex");
42-
FileInputStream is = null;
43-
try {
44-
is = new FileInputStream(file);
45-
Object props = callStaticMethod(InstallZipUtil,
46-
"parseXposedProp", is);
47-
synchronized (thisObject) {
48-
setObjectField(thisObject, propFieldName, props);
49-
}
50-
Utils.logD("reloadXposedProp done...");
51-
param.setResult(null);
52-
} catch (IOException e) {
53-
Utils.logE("Could not read " + file.getPath(), e);
54-
} finally {
55-
if (is != null) {
56-
try {
57-
is.close();
58-
} catch (IOException ignored) {
59-
}
60-
}
61-
}
62-
}
63-
});
6418
} catch (Throwable t) {
6519
Utils.logE("Could not hook Xposed Installer", t);
6620
}

Diff for: Bridge/src/main/java/de/robv/android/xposed/XposedInit.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ public final class XposedInit {
3737
private static boolean startsSystemServer = false;
3838
private static final String startClassName = ""; // ed: no support for tool process anymore
3939

40-
public static final String INSTALLER_PACKAGE_NAME = "de.robv.android.xposed.installer";
40+
public static final String INSTALLER_PACKAGE_NAME = "org.meowcat.edxposed.manager";
41+
public static final String INSTALLER_LEGACY_PACKAGE_NAME = "de.robv.android.xposed.installer";
4142
@SuppressLint("SdCardPath")
42-
private static final String BASE_DIR = Build.VERSION.SDK_INT >= 24
43+
public static final String INSTALLER_DATA_BASE_DIR = Build.VERSION.SDK_INT >= 24
4344
? "/data/user_de/0/" + INSTALLER_PACKAGE_NAME + "/"
4445
: "/data/data/" + INSTALLER_PACKAGE_NAME + "/";
4546
private static final String INSTANT_RUN_CLASS = "com.android.tools.fd.runtime.BootstrapApplication";
@@ -88,15 +89,15 @@ private static boolean needsToCloseFilesForFork() {
8889
}
8990

9091
/**
91-
* Try to load all modules defined in <code>BASE_DIR/conf/modules.list</code>
92+
* Try to load all modules defined in <code>INSTALLER_DATA_BASE_DIR/conf/modules.list</code>
9293
*/
9394
private static volatile AtomicBoolean modulesLoaded = new AtomicBoolean(false);
9495

9596
public static void loadModules() throws IOException {
9697
if (!modulesLoaded.compareAndSet(false, true)) {
9798
return;
9899
}
99-
final String filename = BASE_DIR + "conf/modules.list";
100+
final String filename = INSTALLER_DATA_BASE_DIR + "conf/modules.list";
100101
BaseService service = SELinuxHelper.getAppDataFileService();
101102
if (!service.checkFileExists(filename)) {
102103
Log.e(TAG, "Cannot load any modules because " + filename + " was not found");

Diff for: Core/jni/main/inject/config_manager.cpp

+46-15
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,51 @@
1111
#include <vector>
1212
#include <string>
1313
#include <include/logging.h>
14+
#include <sys/system_properties.h>
1415
#include "config_manager.h"
1516

16-
#define BLACK_LIST_PATH "/data/misc/riru/modules/edxposed/blacklist/"
17-
#define WHITE_LIST_PATH "/data/misc/riru/modules/edxposed/whitelist/"
18-
#define USE_WHITE_LIST "/data/misc/riru/modules/edxposed/usewhitelist"
19-
#define GLOBAL_MODE "/data/misc/riru/modules/edxposed/forceglobal"
20-
#define DYNAMIC_MODULES "/data/misc/riru/modules/edxposed/dynamicmodules"
17+
#define INSTALLER_PACKAGE_NAME "org.meowcat.edxposed.manager"
2118

2219
static char package_name[256];
2320
static bool global_mode = false;
2421
static bool dynamic_modules = false;
2522
static bool inited = false;
23+
static char sdk[PROP_VALUE_MAX + 1];
24+
static bool use_protected_storage =
25+
__system_property_get("ro.build.version.sdk", sdk) > 0 && atoi(sdk) >= 24;
26+
static const char *data_dir = use_protected_storage ?
27+
"/data/user_de/0/" INSTALLER_PACKAGE_NAME "/" :
28+
"/data/user/0/" INSTALLER_PACKAGE_NAME "/";
2629

27-
void initOnce() {
30+
const char *get_black_list_path() {
31+
char *result = new char[256];
32+
return strcat(strcpy(result, data_dir), "conf/blacklist/");
33+
}
34+
35+
const char *get_white_list_path() {
36+
char *result = new char[256];
37+
return strcat(strcpy(result, data_dir), "conf/whitelist/");
38+
}
39+
40+
const char *get_use_white_list_file() {
41+
char *result = new char[256];
42+
return strcat(strcpy(result, data_dir), "conf/usewhitelist");
43+
}
44+
45+
const char *get_force_global_file() {
46+
char *result = new char[256];
47+
return strcat(strcpy(result, data_dir), "conf/forceglobal");
48+
}
49+
50+
const char *get_dynamic_modules_file() {
51+
char *result = new char[256];
52+
return strcat(strcpy(result, data_dir), "conf/dynamicmodules");
53+
}
54+
55+
void init_once() {
2856
if (!inited) {
29-
global_mode = access(GLOBAL_MODE, F_OK) == 0;
30-
dynamic_modules = access(DYNAMIC_MODULES, F_OK) == 0;
57+
global_mode = access(get_force_global_file(), F_OK) == 0;
58+
dynamic_modules = access(get_dynamic_modules_file(), F_OK) == 0;
3159
inited = true;
3260
}
3361
}
@@ -51,18 +79,21 @@ int is_app_need_hook(JNIEnv *env, jstring appDataDir) {
5179
}
5280
}
5381
env->ReleaseStringUTFChars(appDataDir, app_data_dir);
54-
bool use_white_list = access(USE_WHITE_LIST, F_OK) == 0;
55-
bool white_list_exists = access(WHITE_LIST_PATH, F_OK) == 0;
56-
bool black_list_exists = access(BLACK_LIST_PATH, F_OK) == 0;
82+
const char *white_list_path = get_white_list_path();
83+
const char *black_list_path = get_black_list_path();
84+
bool use_white_list = access(get_use_white_list_file(), F_OK) == 0;
85+
bool white_list_exists = access(white_list_path, F_OK) == 0;
86+
bool black_list_exists = access(black_list_path, F_OK) == 0;
5787
if (use_white_list && white_list_exists) {
5888
char path[PATH_MAX];
59-
snprintf(path, PATH_MAX, WHITE_LIST_PATH "%s", package_name);
89+
LOGE("package_name: %s", package_name);
90+
snprintf(path, PATH_MAX, "%s%s", white_list_path, package_name);
6091
int res = access(path, F_OK) == 0;
6192
LOGD("use whitelist, res=%d", res);
6293
return res;
6394
} else if (!use_white_list && black_list_exists) {
6495
char path[PATH_MAX];
65-
snprintf(path, PATH_MAX, BLACK_LIST_PATH "%s", package_name);
96+
snprintf(path, PATH_MAX, "%s%s", black_list_path, package_name);
6697
int res = access(path, F_OK) != 0;
6798
LOGD("use blacklist, res=%d", res);
6899
return res;
@@ -73,11 +104,11 @@ int is_app_need_hook(JNIEnv *env, jstring appDataDir) {
73104
}
74105

75106
bool is_global_mode() {
76-
initOnce();
107+
init_once();
77108
return global_mode;
78109
}
79110

80111
bool is_dynamic_modules() {
81-
initOnce();
112+
init_once();
82113
return dynamic_modules;
83114
}

0 commit comments

Comments
 (0)