jint nativeForkAndSpecialize_r(
JNIEnv
*
env, jclass clazz, jint uid, jint gid, jintArray gids, jint runtime_flags,
jobjectArray rlimits, jint mount_external, jstring se_info, jstring se_name,
jintArray fdsToClose, jintArray fdsToIgnore, jboolean is_child_zygote,
jstring instructionSet, jstring appDataDir, jboolean isTopApp, jobjectArray pkgDataInfoList,
jobjectArray whitelistedDataInfoList, jboolean bindMountAppDataDirs, jboolean bindMountAppStorageDirs) {
/
/
通过nativeForkAndSpecialize_pre和nativeForkAndSpecialize_post完成了nativeForkAndSpecialize方法的AOP
nativeForkAndSpecialize_pre(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);
jint res
=
((nativeForkAndSpecialize_r_t
*
) JNI::Zygote::nativeForkAndSpecialize
-
>fnPtr)(
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);
nativeForkAndSpecialize_post(env, clazz, uid, res);
return
res;
}
static void nativeForkAndSpecialize_pre(
JNIEnv
*
env, jclass clazz, jint &uid, jint &gid, jintArray &gids, jint &runtime_flags,
jobjectArray &rlimits, jint &mount_external, jstring &se_info, jstring &se_name,
jintArray &fdsToClose, jintArray &fdsToIgnore, jboolean &is_child_zygote,
jstring &instructionSet, jstring &appDataDir, jboolean &isTopApp, jobjectArray &pkgDataInfoList,
jobjectArray &whitelistedDataInfoList, jboolean &bindMountAppDataDirs, jboolean &bindMountAppStorageDirs) {
/
/
遍历执行每个模块的forkAndSpecializePre方法,这里可以知道,只需要在模块中声明forkAndSpecializePre方法,即可在com.android.internal.os.Zygote
for
(auto module :
*
get_modules()) {
if
(!module
-
>hasForkAndSpecializePre())
continue
;
if
(module
-
>hasShouldSkipUid() && module
-
>shouldSkipUid(uid))
continue
;
if
(!module
-
>hasShouldSkipUid() && shouldSkipUid(uid))
continue
;
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);
}
}