Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 13 additions & 2 deletions loader/src/injector/gen_jni_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,17 @@ def init_args(self):
se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list,
whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides, Anon(jlongArray)])

# GrapheneOS Android 17 Support
Comment thread
diwangs marked this conversation as resolved.
Outdated
fas_grapheneos_c = ForkAndSpec('grapheneos_c', [Anon(jlongArray), uid, gid, gids, runtime_flags,

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know you followed the pattern 2x And I should have fixed it, but do move this fas to the tons of fas before this to make it consistent. I'll fix the inconsistency of GOS soon, after this PR being merged.

@diwangs diwangs Aug 4, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could move the GOS inconsistency for you in one PR. Do you want them to be grouped to?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, in another PR

rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote,
instruction_set, app_data_dir, is_top_app, Anon(jboolean), pkg_data_info_list,
whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides])

spec_grapheneos_c = SpecApp('grapheneos_c', [Anon(jlongArray), uid, gid, gids, runtime_flags,
rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir,
is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs,
mount_storage_dirs, mount_sysprop_overrides])

hook_map = {}

def gen_jni_def(clz, methods):
Expand Down Expand Up @@ -286,10 +297,10 @@ def gen_jni_def(clz, methods):

zygote = 'com/android/internal/os/Zygote'

methods = [fas_l, fas_o, fas_p, fas_q_alt, fas_r, fas_u, fas_c, fas_samsung_m, fas_samsung_n, fas_samsung_o, fas_samsung_p, fas_samsung_b, fas_grapheneos_u]
methods = [fas_l, fas_o, fas_p, fas_q_alt, fas_r, fas_u, fas_c, fas_samsung_m, fas_samsung_n, fas_samsung_o, fas_samsung_p, fas_samsung_b, fas_grapheneos_u, fas_grapheneos_c]
f.write(gen_jni_def(zygote, methods))

methods = [spec_q, spec_q_alt, spec_r, spec_u, spec_c, spec_samsung_q, spec_grapheneos_u]
methods = [spec_q, spec_q_alt, spec_r, spec_u, spec_c, spec_samsung_q, spec_grapheneos_u, spec_grapheneos_c]
f.write(gen_jni_def(zygote, methods))

methods = [server_l, server_samsung_q]
Expand Down
48 changes: 48 additions & 0 deletions loader/src/injector/jni_hooks.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,26 @@ __attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_graphene
rz_cleanup(&ctx);
return ctx.pid;
}
__attribute__((no_stack_protector)) static jint nativeForkAndSpecialize_grapheneos_c(JNIEnv *env, jclass clazz, jlongArray _19, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jintArray fds_to_close, jintArray fds_to_ignore, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jboolean _20, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs, jboolean mount_sysprop_overrides) {
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
args.fds_to_ignore = &fds_to_ignore;
args.is_child_zygote = &is_child_zygote;
args.is_top_app = &is_top_app;
args.pkg_data_info_list = &pkg_data_info_list;
args.whitelisted_data_info_list = &whitelisted_data_info_list;
args.mount_data_dirs = &mount_data_dirs;
args.mount_storage_dirs = &mount_storage_dirs;
args.mount_sysprop_overrides = &mount_sysprop_overrides;
struct zygisk_context ctx;
rz_init(&ctx, env, &args);
rz_nativeForkAndSpecialize_pre(&ctx);
((nativeForkAndSpecialize_fn)nativeForkAndSpecialize_orig)(
env, clazz, _19, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, fds_to_close, fds_to_ignore, is_child_zygote, instruction_set, app_data_dir, is_top_app, _20, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
);
rz_nativeForkAndSpecialize_post(&ctx);
rz_cleanup(&ctx);
return ctx.pid;
}
static JNINativeMethod nativeForkAndSpecialize_methods[] = {
{
"nativeForkAndSpecialize",
Expand Down Expand Up @@ -275,6 +295,11 @@ static JNINativeMethod nativeForkAndSpecialize_methods[] = {
"(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ[J)I",
(void *) &nativeForkAndSpecialize_grapheneos_u
},
{
"nativeForkAndSpecialize",
"([JII[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;ZZ[Ljava/lang/String;[Ljava/lang/String;ZZZ)I",
(void *) &nativeForkAndSpecialize_grapheneos_c
},
};

static void *nativeSpecializeAppProcess_orig = NULL;
Expand Down Expand Up @@ -387,6 +412,24 @@ __attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_graph
rz_nativeSpecializeAppProcess_post(&ctx);
rz_cleanup(&ctx);
}
__attribute__((no_stack_protector)) static void nativeSpecializeAppProcess_grapheneos_c(JNIEnv *env, jclass clazz, jlongArray _21, jint uid, jint gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jint mount_external, jstring se_info, jstring nice_name, jboolean is_child_zygote, jstring instruction_set, jstring app_data_dir, jboolean is_top_app, jobjectArray pkg_data_info_list, jobjectArray whitelisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs, jboolean mount_sysprop_overrides) {
struct app_specialize_args_v5 args = { .uid = &uid, .gid = &gid, .gids = &gids, .runtime_flags = &runtime_flags, .rlimits = &rlimits, .mount_external = &mount_external, .se_info = &se_info, .nice_name = &nice_name, .instruction_set = &instruction_set, .app_data_dir = &app_data_dir };
args.is_child_zygote = &is_child_zygote;
args.is_top_app = &is_top_app;
args.pkg_data_info_list = &pkg_data_info_list;
args.whitelisted_data_info_list = &whitelisted_data_info_list;
args.mount_data_dirs = &mount_data_dirs;
args.mount_storage_dirs = &mount_storage_dirs;
args.mount_sysprop_overrides = &mount_sysprop_overrides;
struct zygisk_context ctx;
rz_init(&ctx, env, &args);
rz_nativeSpecializeAppProcess_pre(&ctx);
((nativeSpecializeAppProcess_fn)nativeSpecializeAppProcess_orig)(
env, clazz, _21, uid, gid, gids, runtime_flags, rlimits, mount_external, se_info, nice_name, is_child_zygote, instruction_set, app_data_dir, is_top_app, pkg_data_info_list, whitelisted_data_info_list, mount_data_dirs, mount_storage_dirs, mount_sysprop_overrides
);
rz_nativeSpecializeAppProcess_post(&ctx);
rz_cleanup(&ctx);
}
static JNINativeMethod nativeSpecializeAppProcess_methods[] = {
{
"nativeSpecializeAppProcess",
Expand Down Expand Up @@ -423,6 +466,11 @@ static JNINativeMethod nativeSpecializeAppProcess_methods[] = {
"(II[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ[J)V",
(void *) &nativeSpecializeAppProcess_grapheneos_u
},
{
"nativeSpecializeAppProcess",
"([JII[II[[IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;Z[Ljava/lang/String;[Ljava/lang/String;ZZZ)V",
(void *) &nativeSpecializeAppProcess_grapheneos_c
},
};

static void *nativeForkSystemServer_orig = NULL;
Expand Down
Loading