Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5f30976b authored by Lev Rumyantsev's avatar Lev Rumyantsev Committed by Gerrit Code Review
Browse files

Merge changes from topic "native_bridge_for_app_zygote"

* changes:
  Zygote: support native-bridge for app-zygote
  AppZygote: start with the correct instruction set
parents 7826c2f4 2b7a5ea3
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -21,6 +21,8 @@ import android.util.Log;

import com.android.internal.annotations.GuardedBy;

import dalvik.system.VMRuntime;

/**
 * AppZygote is responsible for interfacing with an application-specific zygote.
 *
@@ -113,7 +115,7 @@ public class AppZygote {
                    "app_zygote",  // seInfo
                    abi,  // abi
                    abi, // acceptedAbiList
                    null, // instructionSet
                    VMRuntime.getInstructionSet(abi), // instructionSet
                    mZygoteUidGidMin,
                    mZygoteUidGidMax);

+15 −20
Original line number Diff line number Diff line
@@ -1063,22 +1063,16 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids,

  DropCapabilitiesBoundingSet(fail_fn);

  bool use_native_bridge = !is_system_server &&
  bool need_pre_initialize_native_bridge =
      !is_system_server &&
      instruction_set.has_value() &&
      android::NativeBridgeAvailable() &&
      // Native bridge may be already initialized if this
      // is an app forked from app-zygote.
      !android::NativeBridgeInitialized() &&
      android::NeedsNativeBridge(instruction_set.value().c_str());

  if (use_native_bridge && !app_data_dir.has_value()) {
    // The app_data_dir variable should never be empty if we need to use a
    // native bridge.  In general, app_data_dir will never be empty for normal
    // applications.  It can only happen in special cases (for isolated
    // processes which are not associated with any app).  These are launched by
    // the framework and should not be emulated anyway.
    use_native_bridge = false;
    ALOGW("Native bridge will not be used because managed_app_data_dir == nullptr.");
  }

  MountEmulatedStorage(uid, mount_external, use_native_bridge, fail_fn);
  MountEmulatedStorage(uid, mount_external, need_pre_initialize_native_bridge, fail_fn);

  // If this zygote isn't root, it won't be able to create a process group,
  // since the directory is owned by root.
@@ -1094,10 +1088,11 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids,
  SetGids(env, gids, fail_fn);
  SetRLimits(env, rlimits, fail_fn);

  if (use_native_bridge) {
    // Due to the logic behind use_native_bridge we know that both app_data_dir
    // and instruction_set contain values.
    android::PreInitializeNativeBridge(app_data_dir.value().c_str(),
  if (need_pre_initialize_native_bridge) {
    // Due to the logic behind need_pre_initialize_native_bridge we know that
    // instruction_set contains a value.
    android::PreInitializeNativeBridge(
        app_data_dir.has_value() ? app_data_dir.value().c_str() : nullptr,
        instruction_set.value().c_str());
  }