Skip to content

Commit

Permalink
update api design
Browse files Browse the repository at this point in the history
  • Loading branch information
RikkaW committed Oct 11, 2020
1 parent 392c774 commit aec5949
Show file tree
Hide file tree
Showing 12 changed files with 285 additions and 139 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ From v22.0, Riru provide a hide mechanism (idea from [Haruue Icymoon](https://gi

## Build

> Android Studio (at least 4.2 Canary 13) can't correctly handle local module using prefab, you may have to manually run ":riru:assembleDebug" to make Android Studio happy
Run gradle task `:core:assembleRelease` task from Android Studio or the terminal, zip will be saved to `out`.

## Create your own module
Expand Down
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@ task clean(type: Delete) {
ext {
minSdkVersion = 23
targetSdkVersion = 30

riruApiVersion = 9
}
16 changes: 11 additions & 5 deletions core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import java.security.MessageDigest

apply plugin: 'com.android.library'

def apiVersion = 8
def apiVersion = rootProject.ext.riruApiVersion
def moduleProp = [
id : "riru-core",
name : "Riru",
version : "v22.0",
versionCode: "37",
version : "v22.0-alpha02",
versionCode: "38",
author : "Rikka",
description: "Inject into zygote process. Required by all \"Riru\" modules."
]
Expand Down Expand Up @@ -44,7 +44,7 @@ repositories {
}

dependencies {
implementation 'rikka.ndk:riru:8'
implementation project(':riru')
implementation 'rikka.ndk.thirdparty:xhook:1.2.0'
}

Expand Down Expand Up @@ -118,7 +118,6 @@ android.libraryVariants.all { variant ->
renameOrFail(file("$magiskDir/system/lib64/libriruhide.so"), file("$magiskDir/system/lib64/libriruhide.so"))
renameOrFail(file("$magiskDir/system_x86/lib/libriruhide.so"), file("$magiskDir/system_x86/lib/libriruhide.so"))
renameOrFail(file("$magiskDir/system_x86/lib64/libriruhide.so"), file("$magiskDir/system_x86/lib64/libriruhide.so"))

//file("$magiskDir/zygote_restart").mkdir()
//renameOrFail(file("$magiskDir/system/lib/zygote_restart"), file("$magiskDir/zygote_restart/zygote_restart_arm"))
//renameOrFail(file("$magiskDir/system/lib64/zygote_restart"), file("$magiskDir/zygote_restart/zygote_restart_arm64"))
Expand All @@ -141,3 +140,10 @@ task zipMagiskMoudle(type: Zip) {
archiveName zipName
destinationDir outDir
}

evaluationDependsOn(':riru')

afterEvaluate {
assembleRelease.dependsOn(tasks.getByPath(':riru:assembleRelease'))
assembleDebug.dependsOn(tasks.getByPath(':riru:assembleDebug'))
}
4 changes: 3 additions & 1 deletion core/src/main/cpp/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@
#else
#define LIB_PATH "/system/lib/"
#endif
#define MODULE_PATH_FMT LIB_PATH "libriru_%s.so"
#define MODULE_PATH_FMT LIB_PATH "libriru_%s.so"

#define MODULES_DIR CONFIG_DIR "/modules"
62 changes: 25 additions & 37 deletions core/src/main/cpp/jni_native_method.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,22 +50,20 @@ static void nativeForkAndSpecialize_pre(
jobjectArray &whitelistedDataInfoList, jboolean &bindMountAppDataDirs, jboolean &bindMountAppStorageDirs) {

for (auto module : *get_modules()) {
if (!module->forkAndSpecializePre)
if (!module->hasForkAndSpecializePre())
continue;

if (module->shouldSkipUid && module->shouldSkipUid(uid))
if (module->hasShouldSkipUid() && module->shouldSkipUid(uid))
continue;

if (!module->shouldSkipUid && shouldSkipUid(uid))
if (!module->hasShouldSkipUid() && shouldSkipUid(uid))
continue;

if (module->apiVersion == 8) {
module->forkAndSpecializePre(
env, clazz, &uid, &gid, &gids, &runtime_flags, &rlimits, &mount_external,
&se_info, &se_name, &fdsToClose, &fdsToIgnore, &is_child_zygote,
&instructionSet, &appDataDir, &isTopApp, &pkgDataInfoList, &whitelistedDataInfoList,
&bindMountAppDataDirs, &bindMountAppStorageDirs);
}
module->forkAndSpecializePre(
env, clazz, &uid, &gid, &gids, &runtime_flags, &rlimits, &mount_external,
&se_info, &se_name, &fdsToClose, &fdsToIgnore, &is_child_zygote,
&instructionSet, &appDataDir, &isTopApp, &pkgDataInfoList, &whitelistedDataInfoList,
&bindMountAppDataDirs, &bindMountAppStorageDirs);
}
}

Expand All @@ -74,13 +72,13 @@ static void nativeForkAndSpecialize_post(JNIEnv *env, jclass clazz, jint uid, ji
if (res == 0) unhook_jniRegisterNativeMethods();

for (auto module : *get_modules()) {
if (!module->forkAndSpecializePost)
if (!module->hasForkAndSpecializePost())
continue;

if (module->shouldSkipUid && module->shouldSkipUid(uid))
if (module->hasShouldSkipUid() && module->shouldSkipUid(uid))
continue;

if (!module->shouldSkipUid && shouldSkipUid(uid))
if (!module->hasShouldSkipUid() && shouldSkipUid(uid))
continue;

/*
Expand All @@ -97,9 +95,7 @@ static void nativeForkAndSpecialize_post(JNIEnv *env, jclass clazz, jint uid, ji
*/
if (res == 0) LOGD("%s: forkAndSpecializePost", module->name);

if (module->apiVersion >= 8) {
module->forkAndSpecializePost(env, clazz, res);
}
module->forkAndSpecializePost(env, clazz, res);
}
}

Expand All @@ -113,15 +109,13 @@ static void nativeSpecializeAppProcess_pre(
jboolean &bindMountAppDataDirs, jboolean &bindMountAppStorageDirs) {

for (auto module : *get_modules()) {
if (!module->specializeAppProcessPre)
if (!module->hasSpecializeAppProcessPre())
continue;

if (module->apiVersion == 8) {
module->specializeAppProcessPre(
env, clazz, &uid, &gid, &gids, &runtimeFlags, &rlimits, &mountExternal, &seInfo,
&niceName, &startChildZygote, &instructionSet, &appDataDir, &isTopApp,
&pkgDataInfoList, &whitelistedDataInfoList, &bindMountAppDataDirs, &bindMountAppStorageDirs);
}
module->specializeAppProcessPre(
env, clazz, &uid, &gid, &gids, &runtimeFlags, &rlimits, &mountExternal, &seInfo,
&niceName, &startChildZygote, &instructionSet, &appDataDir, &isTopApp,
&pkgDataInfoList, &whitelistedDataInfoList, &bindMountAppDataDirs, &bindMountAppStorageDirs);
}
}

Expand All @@ -130,13 +124,11 @@ static void nativeSpecializeAppProcess_post(JNIEnv *env, jclass clazz) {
unhook_jniRegisterNativeMethods();

for (auto module : *get_modules()) {
if (!module->specializeAppProcessPost)
if (module->hasSpecializeAppProcessPost())
continue;

LOGD("%s: specializeAppProcessPost", module->name);
if (module->apiVersion == 8) {
module->specializeAppProcessPost(env, clazz);
}
module->specializeAppProcessPost(env, clazz);
}
}

Expand All @@ -147,26 +139,22 @@ static void nativeForkSystemServer_pre(
jobjectArray &rlimits, jlong &permittedCapabilities, jlong &effectiveCapabilities) {

for (auto module : *get_modules()) {
if (!module->forkSystemServerPre)
if (!module->hasForkSystemServerPre())
continue;

if (module->apiVersion >= 8) {
module->forkSystemServerPre(
env, clazz, &uid, &gid, &gids, &debug_flags, &rlimits, &permittedCapabilities,
&effectiveCapabilities);
}
module->forkSystemServerPre(
env, clazz, &uid, &gid, &gids, &debug_flags, &rlimits, &permittedCapabilities,
&effectiveCapabilities);
}
}

static void nativeForkSystemServer_post(JNIEnv *env, jclass clazz, jint res) {
for (auto module : *get_modules()) {
if (!module->forkSystemServerPost)
if (!module->hasForkSystemServerPost())
continue;

if (res == 0) LOGD("%s: forkSystemServerPost", module->name);
if (module->apiVersion >= 8) {
module->forkSystemServerPost(env, clazz, res);
}
module->forkSystemServerPost(env, clazz, res);
}
}

Expand Down
79 changes: 39 additions & 40 deletions core/src/main/cpp/module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,36 @@
#include "status.h"
#include "hide_utils.h"

std::vector<RiruModuleExt *> *get_modules() {
static auto *modules = new std::vector<RiruModuleExt *>({new RiruModuleExt(strdup(MODULE_NAME_CORE))});
std::vector<RiruModule *> *get_modules() {
static auto *modules = new std::vector<RiruModule *>({new RiruModule(strdup(MODULE_NAME_CORE))});
return modules;
}

static void *load_module_info_v9(uint32_t token, RiruInit_t *init) {
auto riru = new Riru();
riru->token = token;

auto funcs = new RiruFuncs();
funcs->getFunc = riru_get_func;
funcs->setFunc = riru_set_func;
funcs->getJNINativeMethodFunc = riru_get_native_method_func;
funcs->setJNINativeMethodFunc = riru_set_native_method_func;
funcs->getOriginalJNINativeMethodFunc = riru_get_original_native_methods;
riru->funcs = funcs;

init(riru);

return riru->module;
}

void load_modules() {
DIR *dir;
struct dirent *entry;
char path[PATH_MAX], modules_path[PATH_MAX], module_prop[PATH_MAX], prop_value[PATH_MAX];
int module_api_version;
char path[PATH_MAX];
void *handle;
const int riruApiVersion = RIRU_API_VERSION;

RiruFuncs riru_funcs;
riru_funcs.getFunc = riru_get_func;
riru_funcs.setFunc = riru_set_func;
riru_funcs.getJNINativeMethodFunc = riru_get_native_method_func;
riru_funcs.setJNINativeMethodFunc = riru_set_native_method_func;
riru_funcs.getOriginalJNINativeMethodFunc = riru_get_original_native_methods;

Riru riru_init_data;
riru_init_data.version = RIRU_VERSION_CODE;
riru_init_data.funcs = &riru_funcs;

snprintf(modules_path, PATH_MAX, "%s/modules", CONFIG_DIR);

if (!(dir = _opendir(modules_path))) return;
if (!(dir = _opendir(MODULES_DIR))) return;

while ((entry = _readdir(dir))) {
if (entry->d_type != DT_DIR) continue;
Expand All @@ -49,21 +53,6 @@ void load_modules() {
continue;
}

snprintf(module_prop, PATH_MAX, "%s/%s/module.prop", modules_path, name);
if (access(module_prop, F_OK) != 0) {
PLOGE("access %s", module_prop);
continue;
}

module_api_version = -1;
if (get_prop(module_prop, "api", prop_value) > 0) {
module_api_version = atoi(prop_value);
}
if (module_api_version < 8) {
LOGW("module %s does not support Riru v21+", name);
continue;
}

handle = dlopen(path, 0);
if (!handle) {
LOGE("dlopen %s failed: %s", path, dlerror());
Expand All @@ -72,18 +61,28 @@ void load_modules() {

auto init = (RiruInit_t *) dlsym(handle, "init");
if (!init) {
LOGW("module %s does not export init", name);
LOGW("%s does not export init", path);
dlclose(handle);
continue;
}

auto *module = new RiruModuleExt(strdup(name));

riru_init_data.module = module;
riru_init_data.token = module->token;
init(&riru_init_data);
// 1. pass riru api version, return module's api version
auto apiVersion = *(int *) init((void *) &riruApiVersion);

// 2. create and pass Riru struct by module's api version
auto module = new RiruModule(strdup(name));
module->handle = handle;
module->apiVersion = apiVersion;

if (apiVersion == 9) {
auto info = load_module_info_v9(module->token, init);
module->info((RiruModuleInfoV9 *) info);
} else {
LOGW("unsupported API %s: %d", name, apiVersion);
delete module;
dlclose(handle);
continue;
}

get_modules()->push_back(module);

Expand Down Expand Up @@ -114,7 +113,7 @@ void load_modules() {
}

for (auto module : *get_modules()) {
if (module->onModuleLoaded) {
if (module->hasOnModuleLoaded()) {
LOGV("%s: onModuleLoaded", module->name);

module->onModuleLoaded();
Expand Down
Loading

0 comments on commit aec5949

Please sign in to comment.