Add support for Android Q (API Level 29)
This commit is contained in:
parent
dfa8e94e1d
commit
3d863cb4c2
|
|
@ -46,7 +46,14 @@ public class Utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getSysProp(String key) {
|
public static String getSysProp(String key) {
|
||||||
|
try {
|
||||||
Class sysProps = XposedHelpers.findClassIfExists("android.os.SystemProperties", null);
|
Class sysProps = XposedHelpers.findClassIfExists("android.os.SystemProperties", null);
|
||||||
|
if (sysProps != null) {
|
||||||
return (String) XposedHelpers.callStaticMethod(sysProps, "get", key);
|
return (String) XposedHelpers.callStaticMethod(sysProps, "get", key);
|
||||||
}
|
}
|
||||||
|
} catch (Throwable throwable) {
|
||||||
|
Utils.logE("error when get sys prop", throwable);
|
||||||
|
}
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,10 +3,10 @@ import org.gradle.internal.os.OperatingSystem
|
||||||
|
|
||||||
apply plugin: 'com.android.library'
|
apply plugin: 'com.android.library'
|
||||||
|
|
||||||
version "v0.4.3.7_alpha"
|
version "v0.4.4.0_alpha"
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
versionCode = "4370"
|
versionCode = "4400"
|
||||||
module_name = "EdXposed"
|
module_name = "EdXposed"
|
||||||
jar_dest_dir = "${projectDir}/template_override/system/framework/"
|
jar_dest_dir = "${projectDir}/template_override/system/framework/"
|
||||||
is_windows = OperatingSystem.current().isWindows()
|
is_windows = OperatingSystem.current().isWindows()
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,7 @@ void Java_lab_galaxy_yahfa_HookMain_init(JNIEnv *env, jclass clazz, jint sdkVers
|
||||||
SDKVersion = sdkVersion;
|
SDKVersion = sdkVersion;
|
||||||
LOGI("init to SDK %d", sdkVersion);
|
LOGI("init to SDK %d", sdkVersion);
|
||||||
switch (sdkVersion) {
|
switch (sdkVersion) {
|
||||||
|
case ANDROID_Q:
|
||||||
case ANDROID_P:
|
case ANDROID_P:
|
||||||
kAccCompileDontBother = 0x02000000;
|
kAccCompileDontBother = 0x02000000;
|
||||||
OFFSET_ArtMehod_in_Object = 0;
|
OFFSET_ArtMehod_in_Object = 0;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
#define ANDROID_O 26
|
#define ANDROID_O 26
|
||||||
#define ANDROID_O2 27
|
#define ANDROID_O2 27
|
||||||
#define ANDROID_P 28
|
#define ANDROID_P 28
|
||||||
|
#define ANDROID_Q 29
|
||||||
|
|
||||||
#define roundUpTo4(v) ((v+4-1) - ((v+4-1)&3))
|
#define roundUpTo4(v) ((v+4-1) - ((v+4-1)&3))
|
||||||
#define roundUpTo8(v) ((v+8-1) - ((v+8-1)&7))
|
#define roundUpTo8(v) ((v+8-1) - ((v+8-1)&7))
|
||||||
|
|
|
||||||
|
|
@ -40,11 +40,13 @@ namespace art {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void Setup(void *handle, HookFunType hook_func) {
|
static void Setup(void *handle, HookFunType hook_func) {
|
||||||
HOOK_FUNC(Constructor, "_ZN3art11ClassLinkerC2EPNS_11InternTableE");
|
HOOK_FUNC(Constructor, "_ZN3art11ClassLinkerC2EPNS_11InternTableE",
|
||||||
|
"_ZN3art11ClassLinkerC2EPNS_11InternTableEb"); // 10.0
|
||||||
RETRIEVE_FUNC_SYMBOL(SetEntryPointsToInterpreter,
|
RETRIEVE_FUNC_SYMBOL(SetEntryPointsToInterpreter,
|
||||||
"_ZNK3art11ClassLinker27SetEntryPointsToInterpreterEPNS_9ArtMethodE");
|
"_ZNK3art11ClassLinker27SetEntryPointsToInterpreterEPNS_9ArtMethodE");
|
||||||
|
|
||||||
HOOK_FUNC(FixupStaticTrampolines, "_ZN3art11ClassLinker22FixupStaticTrampolinesENS_6ObjPtrINS_6mirror5ClassEEE");
|
HOOK_FUNC(FixupStaticTrampolines,
|
||||||
|
"_ZN3art11ClassLinker22FixupStaticTrampolinesENS_6ObjPtrINS_6mirror5ClassEEE");
|
||||||
}
|
}
|
||||||
|
|
||||||
ALWAYS_INLINE void SetEntryPointsToInterpreter(void *art_method) const {
|
ALWAYS_INLINE void SetEntryPointsToInterpreter(void *art_method) const {
|
||||||
|
|
|
||||||
|
|
@ -22,16 +22,34 @@ namespace art {
|
||||||
return Action::kAllow;
|
return Action::kAllow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CREATE_HOOK_STUB_ENTRIES(bool, ShouldDenyAccessToMethodImpl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CREATE_HOOK_STUB_ENTRIES(bool, ShouldDenyAccessToFieldImpl) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static void DisableHiddenApi(void *handle, HookFunType hook_func) {
|
static void DisableHiddenApi(void *handle, HookFunType hook_func) {
|
||||||
if (GetAndroidApiLevel() < ANDROID_P) {
|
const int api_level = GetAndroidApiLevel();
|
||||||
|
if (api_level < ANDROID_P) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (api_level == ANDROID_P) {
|
||||||
HOOK_FUNC(GetMethodActionImpl,
|
HOOK_FUNC(GetMethodActionImpl,
|
||||||
"_ZN3art9hiddenapi6detail19GetMemberActionImplINS_9ArtMethodEEENS0_"
|
"_ZN3art9hiddenapi6detail19GetMemberActionImplINS_9ArtMethodEEENS0_"
|
||||||
"6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE");
|
"6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE");
|
||||||
HOOK_FUNC(GetFieldActionImpl,
|
HOOK_FUNC(GetFieldActionImpl,
|
||||||
"_ZN3art9hiddenapi6detail19GetMemberActionImplINS_8ArtFieldEEENS0_"
|
"_ZN3art9hiddenapi6detail19GetMemberActionImplINS_8ArtFieldEEENS0_"
|
||||||
"6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE");
|
"6ActionEPT_NS_20HiddenApiAccessFlags7ApiListES4_NS0_12AccessMethodE");
|
||||||
|
} else {
|
||||||
|
HOOK_FUNC(ShouldDenyAccessToMethodImpl,
|
||||||
|
"_ZN3art9hiddenapi6detail28ShouldDenyAccessToMemberImplINS_"
|
||||||
|
"9ArtMethodEEEbPT_NS0_7ApiListENS0_12AccessMethodE");
|
||||||
|
HOOK_FUNC(ShouldDenyAccessToFieldImpl,
|
||||||
|
"_ZN3art9hiddenapi6detail28ShouldDenyAccessToMemberImplINS_"
|
||||||
|
"8ArtFieldEEEbPT_NS0_7ApiListENS0_12AccessMethodE");
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "art/base/macros.h"
|
#include "art/base/macros.h"
|
||||||
|
#include "android_build.h"
|
||||||
|
|
||||||
namespace edxp {
|
namespace edxp {
|
||||||
|
|
||||||
|
|
@ -17,19 +18,23 @@ namespace edxp {
|
||||||
# define LP_SELECT(lp32, lp64) (lp32)
|
# define LP_SELECT(lp32, lp64) (lp32)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static constexpr const char *kInjectDexPath = "/system/framework/edxp.jar:"
|
static constexpr auto kInjectDexPath = "/system/framework/edxp.jar:"
|
||||||
"/system/framework/eddalvikdx.jar:"
|
"/system/framework/eddalvikdx.jar:"
|
||||||
"/system/framework/eddexmaker.jar";
|
"/system/framework/eddexmaker.jar";
|
||||||
static constexpr const char *kEntryClassName = "com.elderdrivers.riru.edxp.core.Main";
|
static constexpr auto kEntryClassName = "com.elderdrivers.riru.edxp.core.Main";
|
||||||
static constexpr const char *kClassLinkerClassName = "com.elderdrivers.riru.edxp.art.ClassLinker";
|
static constexpr auto kClassLinkerClassName = "com.elderdrivers.riru.edxp.art.ClassLinker";
|
||||||
static constexpr const char *kSandHookClassName = "com.swift.sandhook.SandHook";
|
static constexpr auto kSandHookClassName = "com.swift.sandhook.SandHook";
|
||||||
static constexpr const char *kSandHookNeverCallClassName = "com.swift.sandhook.ClassNeverCall";
|
static constexpr auto kSandHookNeverCallClassName = "com.swift.sandhook.ClassNeverCall";
|
||||||
|
|
||||||
static const std::string kLibBasePath = LP_SELECT("/system/lib/", "/system/lib64/");
|
static const auto kLibBasePath = std::string(LP_SELECT("/system/lib/", "/system/lib64/"));
|
||||||
static const std::string kLibArtPath = kLibBasePath + "libart.so";
|
static const auto kLibRuntimeBasePath = std::string(LP_SELECT("/apex/com.android.runtime/lib/",
|
||||||
static const std::string kLibWhalePath = kLibBasePath + "libwhale.edxp.so";
|
"/apex/com.android.runtime/lib64/"));
|
||||||
static const std::string kLibSandHookPath = kLibBasePath + "libsandhook.edxp.so";
|
static const auto kLibArtPath =
|
||||||
static const std::string kLibFwPath = kLibBasePath + "libandroidfw.so";
|
(GetAndroidApiLevel() >= ANDROID_Q ? kLibRuntimeBasePath : kLibBasePath) + "libart.so";
|
||||||
|
static const auto kLibWhalePath = kLibBasePath + "libwhale.edxp.so";
|
||||||
|
static const auto kLibSandHookPath = kLibBasePath + "libsandhook.edxp.so";
|
||||||
|
static const auto kLibFwPath = kLibBasePath + "libandroidfw.so";
|
||||||
|
static const auto kLibDlPath = kLibBasePath + "libdl.so";
|
||||||
|
|
||||||
inline const char *const BoolToString(bool b) {
|
inline const char *const BoolToString(bool b) {
|
||||||
return b ? "true" : "false";
|
return b ? "true" : "false";
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,7 @@ namespace edxp {
|
||||||
LoadDexAndInit(env, kInjectDexPath);
|
LoadDexAndInit(env, kInjectDexPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
inline void Context::FindAndCall(JNIEnv *env, const char *method_name,
|
inline void Context::FindAndCall(JNIEnv *env, const char *method_name,
|
||||||
const char *method_sig, ...) const {
|
const char *method_sig, ...) const {
|
||||||
if (!entry_class_) {
|
if (!entry_class_) {
|
||||||
|
|
@ -209,14 +210,14 @@ namespace edxp {
|
||||||
jobjectArray rlimits,
|
jobjectArray rlimits,
|
||||||
jint mount_external,
|
jint mount_external,
|
||||||
jstring se_info,
|
jstring se_info,
|
||||||
jstring se_name,
|
jstring nice_name,
|
||||||
jintArray fds_to_close,
|
jintArray fds_to_close,
|
||||||
jintArray fds_to_ignore,
|
jintArray fds_to_ignore,
|
||||||
jboolean is_child_zygote,
|
jboolean is_child_zygote,
|
||||||
jstring instruction_set,
|
jstring instruction_set,
|
||||||
jstring app_data_dir) {
|
jstring app_data_dir) {
|
||||||
app_data_dir_ = app_data_dir;
|
app_data_dir_ = app_data_dir;
|
||||||
nice_name_ = se_name;
|
nice_name_ = nice_name;
|
||||||
if (ConfigManager::GetInstance()->IsBlackWhiteListEnabled() &&
|
if (ConfigManager::GetInstance()->IsBlackWhiteListEnabled() &&
|
||||||
ConfigManager::GetInstance()->IsDynamicModulesEnabled()) {
|
ConfigManager::GetInstance()->IsDynamicModulesEnabled()) {
|
||||||
// when black/white list is on, never inject into zygote if dynamic modules mode is on
|
// when black/white list is on, never inject into zygote if dynamic modules mode is on
|
||||||
|
|
@ -226,7 +227,7 @@ namespace edxp {
|
||||||
FindAndCall(env, "forkAndSpecializePre",
|
FindAndCall(env, "forkAndSpecializePre",
|
||||||
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)V",
|
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)V",
|
||||||
uid, gid, gids, runtime_flags, rlimits,
|
uid, gid, gids, runtime_flags, rlimits,
|
||||||
mount_external, se_info, se_name, fds_to_close, fds_to_ignore,
|
mount_external, se_info, nice_name, fds_to_close, fds_to_ignore,
|
||||||
is_child_zygote, instruction_set, app_data_dir);
|
is_child_zygote, instruction_set, app_data_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,67 +19,65 @@
|
||||||
#pragma clang diagnostic push
|
#pragma clang diagnostic push
|
||||||
#pragma clang diagnostic ignored "-Wunused-value"
|
#pragma clang diagnostic ignored "-Wunused-value"
|
||||||
|
|
||||||
|
#define EXPORT extern "C" __attribute__((visibility("default")))
|
||||||
|
|
||||||
namespace edxp {
|
namespace edxp {
|
||||||
|
|
||||||
extern "C" {
|
EXPORT void onModuleLoaded() {
|
||||||
|
|
||||||
__attribute__((visibility("default"))) void onModuleLoaded() {
|
|
||||||
LOG(INFO) << "onModuleLoaded: welcome to EdXposed!";
|
LOG(INFO) << "onModuleLoaded: welcome to EdXposed!";
|
||||||
InstallInlineHooks();
|
InstallInlineHooks();
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default"))) int shouldSkipUid(int uid) {
|
EXPORT int shouldSkipUid(int uid) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default"))) void
|
EXPORT void nativeForkAndSpecializePre(JNIEnv *env, jclass clazz, jint *_uid, jint *gid,
|
||||||
nativeForkAndSpecializePre(JNIEnv *env, jclass clazz, jint *_uid, jint *gid, jintArray *gids,
|
jintArray *gids, jint *runtime_flags,
|
||||||
jint *runtime_flags,
|
jobjectArray *rlimits, jint *mount_external,
|
||||||
jobjectArray *rlimits, jint *mount_external, jstring *se_info,
|
jstring *se_info, jstring *nice_name,
|
||||||
jstring *se_name,
|
|
||||||
jintArray *fds_to_close, jintArray *fds_to_ignore,
|
jintArray *fds_to_close, jintArray *fds_to_ignore,
|
||||||
jboolean *is_child_zygote,
|
jboolean *start_child_zygote, jstring *instruction_set,
|
||||||
jstring *instruction_set, jstring *app_data_dir,
|
jstring *app_data_dir,
|
||||||
jstring *package_name,
|
/* parameters added in Android Q */
|
||||||
jobjectArray *packages_for_uid, jstring *sandbox_id) {
|
jstring *package_name, jobjectArray *packages_for_uid,
|
||||||
|
jstring *sandbox_id) {
|
||||||
Context::GetInstance()->OnNativeForkAndSpecializePre(env, clazz, *_uid, *gid, *gids,
|
Context::GetInstance()->OnNativeForkAndSpecializePre(env, clazz, *_uid, *gid, *gids,
|
||||||
*runtime_flags, *rlimits,
|
*runtime_flags, *rlimits,
|
||||||
*mount_external, *se_info, *se_name,
|
*mount_external, *se_info, *nice_name,
|
||||||
*fds_to_close,
|
*fds_to_close,
|
||||||
*fds_to_ignore,
|
*fds_to_ignore,
|
||||||
*is_child_zygote, *instruction_set,
|
*start_child_zygote, *instruction_set,
|
||||||
*app_data_dir);
|
*app_data_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default"))) int
|
EXPORT int nativeForkAndSpecializePost(JNIEnv *env, jclass clazz, jint res) {
|
||||||
nativeForkAndSpecializePost(JNIEnv *env, jclass clazz,
|
|
||||||
jint res) {
|
|
||||||
return Context::GetInstance()->OnNativeForkAndSpecializePost(env, clazz, res);
|
return Context::GetInstance()->OnNativeForkAndSpecializePost(env, clazz, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default")))
|
EXPORT void nativeForkSystemServerPre(JNIEnv *env, jclass clazz, uid_t *uid, gid_t *gid,
|
||||||
void
|
jintArray *gids, jint *runtime_flags,
|
||||||
nativeForkSystemServerPre(JNIEnv *env, jclass clazz, uid_t *uid, gid_t *gid, jintArray *gids,
|
|
||||||
jint *runtime_flags,
|
|
||||||
jobjectArray *rlimits, jlong *permitted_capabilities,
|
jobjectArray *rlimits, jlong *permitted_capabilities,
|
||||||
jlong *effective_capabilities) {
|
jlong *effective_capabilities) {
|
||||||
Context::GetInstance()->OnNativeForkSystemServerPre(env, clazz, *uid, *gid, *gids,
|
Context::GetInstance()->OnNativeForkSystemServerPre(env, clazz, *uid, *gid, *gids,
|
||||||
*runtime_flags, *rlimits,
|
*runtime_flags, *rlimits,
|
||||||
*permitted_capabilities,
|
*permitted_capabilities,
|
||||||
*effective_capabilities);
|
*effective_capabilities
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default")))
|
EXPORT int nativeForkSystemServerPost(JNIEnv *env, jclass clazz, jint res) {
|
||||||
int nativeForkSystemServerPost(JNIEnv *env, jclass clazz, jint res) {
|
|
||||||
return Context::GetInstance()->OnNativeForkSystemServerPost(env, clazz, res);
|
return Context::GetInstance()->OnNativeForkSystemServerPost(env, clazz, res);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default"))) void specializeAppProcessPre(
|
/* method added in Android Q */
|
||||||
JNIEnv *env, jclass clazz, jint *_uid, jint *gid, jintArray *gids, jint *runtime_flags,
|
EXPORT void specializeAppProcessPre(JNIEnv *env, jclass clazz, jint *uid, jint *gid,
|
||||||
jobjectArray *rlimits, jint *mount_external, jstring *se_info, jstring *nice_name,
|
jintArray *gids, jint *runtime_flags, jobjectArray *rlimits,
|
||||||
jboolean *start_child_zygote, jstring *instruction_set, jstring *app_data_dir,
|
jint *mount_external, jstring *se_info, jstring *nice_name,
|
||||||
jstring *package_name, jobjectArray *packages_for_uid, jstring *sandbox_id) {
|
jboolean *start_child_zygote, jstring *instruction_set,
|
||||||
Context::GetInstance()->OnNativeForkAndSpecializePre(env, clazz, *_uid, *gid, *gids,
|
jstring *app_data_dir, jstring *package_name,
|
||||||
|
jobjectArray *packages_for_uid, jstring *sandbox_id) {
|
||||||
|
Context::GetInstance()->OnNativeForkAndSpecializePre(env, clazz, *uid, *gid, *gids,
|
||||||
*runtime_flags, *rlimits,
|
*runtime_flags, *rlimits,
|
||||||
*mount_external, *se_info, *nice_name,
|
*mount_external, *se_info, *nice_name,
|
||||||
nullptr, nullptr,
|
nullptr, nullptr,
|
||||||
|
|
@ -87,13 +85,10 @@ namespace edxp {
|
||||||
*app_data_dir);
|
*app_data_dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
__attribute__((visibility("default"))) int specializeAppProcessPost(
|
EXPORT int specializeAppProcessPost(JNIEnv *env, jclass clazz) {
|
||||||
JNIEnv *env, jclass clazz) {
|
|
||||||
return Context::GetInstance()->OnNativeForkAndSpecializePost(env, clazz, 0);
|
return Context::GetInstance()->OnNativeForkAndSpecializePost(env, clazz, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma clang diagnostic pop
|
#pragma clang diagnostic pop
|
||||||
|
|
@ -20,6 +20,19 @@
|
||||||
namespace edxp {
|
namespace edxp {
|
||||||
|
|
||||||
static bool installed = false;
|
static bool installed = false;
|
||||||
|
static bool art_hooks_installed = false;
|
||||||
|
static HookFunType hook_func = nullptr;
|
||||||
|
|
||||||
|
void InstallArtHooks(void *art_handle);
|
||||||
|
|
||||||
|
CREATE_HOOK_STUB_ENTRIES(void *, mydlopen, const char *file_name, int flags,
|
||||||
|
const void *caller) {
|
||||||
|
void *handle = mydlopenBackup(file_name, flags, caller);
|
||||||
|
if (std::string(file_name).find("libart.so") != std::string::npos) {
|
||||||
|
InstallArtHooks(handle);
|
||||||
|
}
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
void InstallInlineHooks() {
|
void InstallInlineHooks() {
|
||||||
if (installed) {
|
if (installed) {
|
||||||
|
|
@ -46,18 +59,31 @@ namespace edxp {
|
||||||
if (!hook_func_symbol) {
|
if (!hook_func_symbol) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
auto hook_func = reinterpret_cast<HookFunType>(hook_func_symbol);
|
hook_func = reinterpret_cast<HookFunType>(hook_func_symbol);
|
||||||
ScopedDlHandle art_handle(kLibArtPath.c_str());
|
|
||||||
if (!art_handle.IsValid()) {
|
if (api_level >= ANDROID_P) {
|
||||||
|
void *handle = DlOpen(kLibDlPath.c_str());
|
||||||
|
HOOK_FUNC(mydlopen, "__loader_dlopen");
|
||||||
|
dlclose(handle);
|
||||||
|
} else {
|
||||||
|
void *art_handle = DlOpen(kLibArtPath.c_str());
|
||||||
|
InstallArtHooks(art_handle);
|
||||||
|
dlclose(art_handle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstallArtHooks(void *art_handle) {
|
||||||
|
if (art_hooks_installed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
art::hidden_api::DisableHiddenApi(art_handle.Get(), hook_func);
|
art::hidden_api::DisableHiddenApi(art_handle, hook_func);
|
||||||
art::Runtime::Setup(art_handle.Get(), hook_func);
|
art::Runtime::Setup(art_handle, hook_func);
|
||||||
art::gc::Heap::Setup(art_handle.Get(), hook_func);
|
art::gc::Heap::Setup(art_handle, hook_func);
|
||||||
art::ClassLinker::Setup(art_handle.Get(), hook_func);
|
art::ClassLinker::Setup(art_handle, hook_func);
|
||||||
art::mirror::Class::Setup(art_handle.Get(), hook_func);
|
art::mirror::Class::Setup(art_handle, hook_func);
|
||||||
art::JNIEnvExt::Setup(art_handle.Get(), hook_func);
|
art::JNIEnvExt::Setup(art_handle, hook_func);
|
||||||
LOGI("Inline hooks installed");
|
art_hooks_installed = true;
|
||||||
|
LOGI("ART hooks installed");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#!/system/bin/sh
|
#!/system/bin/sh
|
||||||
|
|
||||||
EDXP_VERSION="0.4.3.7_alpha (4370)"
|
EDXP_VERSION="0.4.4.0_alpha (4400)"
|
||||||
ANDROID_SDK=`getprop ro.build.version.sdk`
|
ANDROID_SDK=`getprop ro.build.version.sdk`
|
||||||
BUILD_DESC=`getprop ro.build.description`
|
BUILD_DESC=`getprop ro.build.description`
|
||||||
PRODUCT=`getprop ro.build.product`
|
PRODUCT=`getprop ro.build.product`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue