diff options
37 files changed, 665 insertions, 61 deletions
diff --git a/api/Android.bp b/api/Android.bp index 735d85a06388..ea59d0b5ccdc 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -208,7 +208,7 @@ genrule { out: ["current.srcjar"], cmd: "$(location merge_zips) $(out) $(in)", srcs: [ - ":api-stubs-docs-non-updatable", + ":api-stubs-docs-non-updatable{.exportable}", ":all-modules-public-stubs-source", ], visibility: ["//visibility:private"], // Used by make module in //development, mind diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 440257605e69..e3bb53adba9b 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1630,6 +1630,7 @@ package android.hardware.input { method @NonNull public java.util.List<java.lang.String> getKeyboardLayoutDescriptorsForInputDevice(@NonNull android.view.InputDevice); method @NonNull public String getKeyboardLayoutTypeForLayoutDescriptor(@NonNull String); method @NonNull @RequiresPermission(android.Manifest.permission.REMAP_MODIFIER_KEYS) public java.util.Map<java.lang.Integer,java.lang.Integer> getModifierKeyRemapping(); + method public int getMousePointerSpeed(); method @RequiresPermission(android.Manifest.permission.REMAP_MODIFIER_KEYS) public void remapModifierKey(int, int); method @RequiresPermission(android.Manifest.permission.SET_KEYBOARD_LAYOUT) public void removeKeyboardLayoutForInputDevice(@NonNull android.hardware.input.InputDeviceIdentifier, @NonNull String); method public void removeUniqueIdAssociation(@NonNull String); @@ -1639,6 +1640,7 @@ package android.hardware.input { public class InputSettings { method @RequiresPermission(android.Manifest.permission.WRITE_SECURE_SETTINGS) public static void setMaximumObscuringOpacityForTouch(@NonNull android.content.Context, @FloatRange(from=0, to=1) float); + field public static final int DEFAULT_POINTER_SPEED = 0; // 0x0 } } @@ -2790,6 +2792,10 @@ package android.provider { field public static final String VOICE_INTERACTION_SERVICE = "voice_interaction_service"; } + public static final class Settings.System extends android.provider.Settings.NameValueTable { + field public static final String POINTER_SPEED = "pointer_speed"; + } + public static final class Telephony.Sms.Intents { field public static final String SMS_CARRIER_PROVISION_ACTION = "android.provider.Telephony.SMS_CARRIER_PROVISION"; } diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index ccd83f756730..667d3e6baa53 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -4338,19 +4338,19 @@ public class AppOpsManager { */ private @Nullable NoteOpEvent getLastRejectEvent(@UidState int fromUidState, @UidState int toUidState, @OpFlags int flags) { - NoteOpEvent lastAccessEvent = null; + NoteOpEvent lastRejectEvent = null; for (AttributedOpEntry attributionEntry : mAttributedOpEntries.values()) { - NoteOpEvent lastAttributionAccessEvent = attributionEntry.getLastRejectEvent( + NoteOpEvent lastAttributionRejectEvent = attributionEntry.getLastRejectEvent( fromUidState, toUidState, flags); - if (lastAccessEvent == null || (lastAttributionAccessEvent != null - && lastAttributionAccessEvent.getNoteTime() - > lastAccessEvent.getNoteTime())) { - lastAccessEvent = lastAttributionAccessEvent; + if (lastRejectEvent == null || (lastAttributionRejectEvent != null + && lastAttributionRejectEvent.getNoteTime() + > lastRejectEvent.getNoteTime())) { + lastRejectEvent = lastAttributionRejectEvent; } } - return lastAccessEvent; + return lastRejectEvent; } /** diff --git a/core/java/android/app/ApplicationExitInfo.java b/core/java/android/app/ApplicationExitInfo.java index d859f3f9e175..17177ff85016 100644 --- a/core/java/android/app/ApplicationExitInfo.java +++ b/core/java/android/app/ApplicationExitInfo.java @@ -460,6 +460,15 @@ public final class ApplicationExitInfo implements Parcelable { */ public static final int SUBREASON_SDK_SANDBOX_NOT_NEEDED = 28; + /** + * The process was killed by the [kernel] Out-of-memory (OOM) killer; this + * would be set only when the reason is {@link #REASON_LOW_MEMORY}. + * + * For internal use only. + * @hide + */ + public static final int SUBREASON_OOM_KILL = 30; + // If there is any OEM code which involves additional app kill reasons, it should // be categorized in {@link #REASON_OTHER}, with subreason code starting from 1000. @@ -635,6 +644,7 @@ public final class ApplicationExitInfo implements Parcelable { SUBREASON_KILL_BACKGROUND, SUBREASON_PACKAGE_UPDATE, SUBREASON_UNDELIVERED_BROADCAST, + SUBREASON_OOM_KILL, }) @Retention(RetentionPolicy.SOURCE) public @interface SubReason {} @@ -1360,6 +1370,8 @@ public final class ApplicationExitInfo implements Parcelable { return "PACKAGE UPDATE"; case SUBREASON_UNDELIVERED_BROADCAST: return "UNDELIVERED BROADCAST"; + case SUBREASON_OOM_KILL: + return "OOM KILL"; default: return "UNKNOWN"; } diff --git a/core/java/android/hardware/input/IInputManager.aidl b/core/java/android/hardware/input/IInputManager.aidl index c3fae55fd00c..059e99f372e7 100644 --- a/core/java/android/hardware/input/IInputManager.aidl +++ b/core/java/android/hardware/input/IInputManager.aidl @@ -63,6 +63,9 @@ interface IInputManager { // active keyboard layout. int getKeyCodeForKeyLocation(int deviceId, in int locationKeyCode); + // Returns the mouse pointer speed. + int getMousePointerSpeed(); + // Temporarily changes the pointer speed. void tryPointerSpeed(int speed); diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index a0cceae98ba9..08fc5c2cf209 100644 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -24,6 +24,7 @@ import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SdkConstant; import android.annotation.SdkConstant.SdkConstantType; +import android.annotation.SuppressLint; import android.annotation.SystemService; import android.annotation.TestApi; import android.annotation.UserIdInt; @@ -835,6 +836,28 @@ public final class InputManager { } /** + * Returns the mouse pointer speed. + * + * <p>The pointer speed is a value between {@link InputSettings#MIN_POINTER_SPEED} and + * {@link InputSettings#MAX_POINTER_SPEED}, the default value being + * {@link InputSettings#DEFAULT_POINTER_SPEED}. + * + * <p> Note that while setting the mouse pointer speed, it's possible that the input reader has + * only received this value and has not yet completed reconfiguring itself with this value. + * + * @hide + */ + @SuppressLint("UnflaggedApi") // TestApi without associated feature. + @TestApi + public int getMousePointerSpeed() { + try { + return mIm.getMousePointerSpeed(); + } catch (RemoteException ex) { + throw ex.rethrowFromSystemServer(); + } + } + + /** * Changes the mouse pointer speed temporarily, but does not save the setting. * <p> * Requires {@link android.Manifest.permission#SET_POINTER_SPEED}. diff --git a/core/java/android/hardware/input/InputSettings.java b/core/java/android/hardware/input/InputSettings.java index 33960c058baa..042b0b776562 100644 --- a/core/java/android/hardware/input/InputSettings.java +++ b/core/java/android/hardware/input/InputSettings.java @@ -48,8 +48,8 @@ public class InputSettings { /** * Pointer Speed: The default pointer speed (0). - * @hide */ + @SuppressLint("UnflaggedApi") // TestApi without associated feature. public static final int DEFAULT_POINTER_SPEED = 0; /** diff --git a/core/java/android/os/OomKillRecord.java b/core/java/android/os/OomKillRecord.java new file mode 100644 index 000000000000..151a65fdfaf5 --- /dev/null +++ b/core/java/android/os/OomKillRecord.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.os; + + +/** + * Expected data to get back from the OOM event's file. + * Note that this should be equivalent to the struct <b>OomKill</b> inside + * <pre> + * system/memory/libmeminfo/libmemevents/include/memevents.h + * </pre> + * + * @hide + */ +public final class OomKillRecord { + private long mTimeStampInMillis; + private int mPid; + private int mUid; + private String mProcessName; + private short mOomScoreAdj; + + public OomKillRecord(long timeStampInMillis, int pid, int uid, + String processName, short oomScoreAdj) { + this.mTimeStampInMillis = timeStampInMillis; + this.mPid = pid; + this.mUid = uid; + this.mProcessName = processName; + this.mOomScoreAdj = oomScoreAdj; + } + + public long getTimestampMilli() { + return mTimeStampInMillis; + } + + public int getPid() { + return mPid; + } + + public int getUid() { + return mUid; + } + + public String getProcessName() { + return mProcessName; + } + + public short getOomScoreAdj() { + return mOomScoreAdj; + } +} diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 7bad9c561f8a..82d33a94a1ef 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5651,8 +5651,10 @@ public final class Settings { * +7 = fastest * @hide */ + @SuppressLint({"NoSettingsProvider", "UnflaggedApi"}) // TestApi without associated feature. @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @Readable + @TestApi public static final String POINTER_SPEED = "pointer_speed"; /** diff --git a/core/java/android/service/voice/OWNERS b/core/java/android/service/voice/OWNERS index ec4410086edf..763c79e20846 100644 --- a/core/java/android/service/voice/OWNERS +++ b/core/java/android/service/voice/OWNERS @@ -4,4 +4,4 @@ include /core/java/android/app/assist/OWNERS # The owner here should not be assist owner liangyuchen@google.com -tuanng@google.com +adudani@google.com diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 9c40a28dfd81..2a2e9038c27a 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -665,8 +665,9 @@ static void EnableKeepCapabilities(fail_fn_t fail_fn) { } } -static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) { +static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn, jlong bounding_capabilities) { for (int i = 0; prctl(PR_CAPBSET_READ, i, 0, 0, 0) >= 0; i++) {; + if ((1LL << i) & bounding_capabilities) continue; if (prctl(PR_CAPBSET_DROP, i, 0, 0, 0) == -1) { if (errno == EINVAL) { ALOGE("prctl(PR_CAPBSET_DROP) failed with EINVAL. Please verify " @@ -678,6 +679,27 @@ static void DropCapabilitiesBoundingSet(fail_fn_t fail_fn) { } } +static bool MatchGid(JNIEnv* env, jintArray gids, jint gid, jint gid_to_find) { + if (gid == gid_to_find) return true; + + if (gids == nullptr) return false; + + jsize gids_num = env->GetArrayLength(gids); + ScopedIntArrayRO native_gid_proxy(env, gids); + + if (native_gid_proxy.get() == nullptr) { + RuntimeAbort(env, __LINE__, "Bad gids array"); + } + + for (int gids_index = 0; gids_index < gids_num; ++gids_index) { + if (native_gid_proxy[gids_index] == gid_to_find) { + return true; + } + } + + return false; +} + static void SetInheritable(uint64_t inheritable, fail_fn_t fail_fn) { __user_cap_header_struct capheader; memset(&capheader, 0, sizeof(capheader)); @@ -1742,9 +1764,9 @@ static void BindMountStorageDirs(JNIEnv* env, jobjectArray pkg_data_info_list, // Utility routine to specialize a zygote child process. static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities, - jlong effective_capabilities, jint mount_external, - jstring managed_se_info, jstring managed_nice_name, - bool is_system_server, bool is_child_zygote, + jlong effective_capabilities, jlong bounding_capabilities, + jint mount_external, jstring managed_se_info, + jstring managed_nice_name, bool is_system_server, bool is_child_zygote, jstring managed_instruction_set, jstring managed_app_data_dir, bool is_top_app, jobjectArray pkg_data_info_list, jobjectArray allowlisted_data_info_list, bool mount_data_dirs, @@ -1758,6 +1780,9 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, auto instruction_set = extract_fn(managed_instruction_set); auto app_data_dir = extract_fn(managed_app_data_dir); + // Permit bounding capabilities + permitted_capabilities |= bounding_capabilities; + // Keep capabilities across UID change, unless we're staying root. if (uid != 0) { EnableKeepCapabilities(fail_fn); @@ -1765,7 +1790,7 @@ static void SpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArray gids, SetInheritable(permitted_capabilities, fail_fn); - DropCapabilitiesBoundingSet(fail_fn); + DropCapabilitiesBoundingSet(fail_fn, bounding_capabilities); bool need_pre_initialize_native_bridge = !is_system_server && instruction_set.has_value() && android::NativeBridgeAvailable() && @@ -2028,6 +2053,23 @@ static uint64_t GetEffectiveCapabilityMask(JNIEnv* env) { return capdata[0].effective | (static_cast<uint64_t>(capdata[1].effective) << 32); } +static jlong CalculateBoundingCapabilities(JNIEnv* env, jint uid, jint gid, jintArray gids) { + jlong capabilities = 0; + + /* + * Grant CAP_SYS_NICE to CapInh/CapPrm/CapBnd for processes that can spawn + * VMs. This enables processes to execve on binaries with elevated + * capabilities if its file capability bits are set. This does not grant + * capability to the parent process(that spawns the VM) as the effective + * bits are not set. + */ + if (MatchGid(env, gids, gid, AID_VIRTUALMACHINE)) { + capabilities |= (1LL << CAP_SYS_NICE); + } + + return capabilities; +} + static jlong CalculateCapabilities(JNIEnv* env, jint uid, jint gid, jintArray gids, bool is_child_zygote) { jlong capabilities = 0; @@ -2061,26 +2103,7 @@ static jlong CalculateCapabilities(JNIEnv* env, jint uid, jint gid, jintArray gi * Grant CAP_BLOCK_SUSPEND to processes that belong to GID "wakelock" */ - bool gid_wakelock_found = false; - if (gid == AID_WAKELOCK) { - gid_wakelock_found = true; - } else if (gids != nullptr) { - jsize gids_num = env->GetArrayLength(gids); - ScopedIntArrayRO native_gid_proxy(env, gids); - - if (native_gid_proxy.get() == nullptr) { - RuntimeAbort(env, __LINE__, "Bad gids array"); - } - - for (int gids_index = 0; gids_index < gids_num; ++gids_index) { - if (native_gid_proxy[gids_index] == AID_WAKELOCK) { - gid_wakelock_found = true; - break; - } - } - } - - if (gid_wakelock_found) { + if (MatchGid(env, gids, gid, AID_WAKELOCK)) { capabilities |= (1LL << CAP_BLOCK_SUSPEND); } @@ -2256,6 +2279,11 @@ pid_t zygote::ForkCommon(JNIEnv* env, bool is_system_server, const std::vector<int>& fds_to_ignore, bool is_priority_fork, bool purge) { + ATRACE_CALL(); + if (is_priority_fork) { + setpriority(PRIO_PROCESS, 0, PROCESS_PRIORITY_MAX); + } + SetSignalHandlers(); // Curry a failure function. @@ -2341,6 +2369,10 @@ pid_t zygote::ForkCommon(JNIEnv* env, bool is_system_server, // We blocked SIGCHLD prior to a fork, we unblock it here. UnblockSignal(SIGCHLD, fail_fn); + if (is_priority_fork && pid != 0) { + setpriority(PRIO_PROCESS, 0, PROCESS_PRIORITY_DEFAULT); + } + return pid; } @@ -2357,6 +2389,7 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize( jobjectArray pkg_data_info_list, jobjectArray allowlisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) { jlong capabilities = CalculateCapabilities(env, uid, gid, gids, is_child_zygote); + jlong bounding_capabilities = CalculateBoundingCapabilities(env, uid, gid, gids); if (UNLIKELY(managed_fds_to_close == nullptr)) { zygote::ZygoteFailure(env, "zygote", nice_name, @@ -2395,10 +2428,10 @@ static jint com_android_internal_os_Zygote_nativeForkAndSpecialize( if (pid == 0) { SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits, capabilities, capabilities, - mount_external, se_info, nice_name, false, is_child_zygote == JNI_TRUE, - instruction_set, app_data_dir, is_top_app == JNI_TRUE, pkg_data_info_list, - allowlisted_data_info_list, mount_data_dirs == JNI_TRUE, - mount_storage_dirs == JNI_TRUE); + bounding_capabilities, mount_external, se_info, nice_name, false, + is_child_zygote == JNI_TRUE, instruction_set, app_data_dir, + is_top_app == JNI_TRUE, pkg_data_info_list, allowlisted_data_info_list, + mount_data_dirs == JNI_TRUE, mount_storage_dirs == JNI_TRUE); } return pid; } @@ -2408,6 +2441,7 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer( JNIEnv* env, jclass, uid_t uid, gid_t gid, jintArray gids, jint runtime_flags, jobjectArray rlimits, jlong permitted_capabilities, jlong effective_capabilities) { + ATRACE_CALL(); std::vector<int> fds_to_close(MakeUsapPipeReadFDVector()), fds_to_ignore(fds_to_close); @@ -2431,7 +2465,7 @@ static jint com_android_internal_os_Zygote_nativeForkSystemServer( // System server prcoess does not need data isolation so no need to // know pkg_data_info_list. SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits, permitted_capabilities, - effective_capabilities, MOUNT_EXTERNAL_DEFAULT, nullptr, nullptr, true, + effective_capabilities, 0, MOUNT_EXTERNAL_DEFAULT, nullptr, nullptr, true, false, nullptr, nullptr, /* is_top_app= */ false, /* pkg_data_info_list */ nullptr, /* allowlisted_data_info_list */ nullptr, false, false); @@ -2483,6 +2517,7 @@ static jint com_android_internal_os_Zygote_nativeForkApp(JNIEnv* env, jintArray managed_session_socket_fds, jboolean args_known, jboolean is_priority_fork) { + ATRACE_CALL(); std::vector<int> session_socket_fds = ExtractJIntArray(env, "USAP", nullptr, managed_session_socket_fds) .value_or(std::vector<int>()); @@ -2498,6 +2533,7 @@ int zygote::forkApp(JNIEnv* env, bool args_known, bool is_priority_fork, bool purge) { + ATRACE_CALL(); std::vector<int> fds_to_close(MakeUsapPipeReadFDVector()), fds_to_ignore(fds_to_close); @@ -2588,12 +2624,13 @@ static void com_android_internal_os_Zygote_nativeSpecializeAppProcess( jobjectArray allowlisted_data_info_list, jboolean mount_data_dirs, jboolean mount_storage_dirs) { jlong capabilities = CalculateCapabilities(env, uid, gid, gids, is_child_zygote); + jlong bounding_capabilities = CalculateBoundingCapabilities(env, uid, gid, gids); SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits, capabilities, capabilities, - mount_external, se_info, nice_name, false, is_child_zygote == JNI_TRUE, - instruction_set, app_data_dir, is_top_app == JNI_TRUE, pkg_data_info_list, - allowlisted_data_info_list, mount_data_dirs == JNI_TRUE, - mount_storage_dirs == JNI_TRUE); + bounding_capabilities, mount_external, se_info, nice_name, false, + is_child_zygote == JNI_TRUE, instruction_set, app_data_dir, + is_top_app == JNI_TRUE, pkg_data_info_list, allowlisted_data_info_list, + mount_data_dirs == JNI_TRUE, mount_storage_dirs == JNI_TRUE); } /** diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml index 9bb249999d99..61e6a36839ff 100644 --- a/core/res/res/xml/sms_short_codes.xml +++ b/core/res/res/xml/sms_short_codes.xml @@ -127,7 +127,7 @@ <!-- France: 5 digits, free: 3xxxx, premium [4-8]xxxx, plus EU: http://clients.txtnation.com/entries/161972-france-premium-sms-short-code-requirements, visual voicemail code for Orange: 21101 --> - <shortcode country="fr" premium="[4-8]\\d{4}" free="3\\d{4}|116\\d{3}|21101|20366|555|2051" /> + <shortcode country="fr" premium="[4-8]\\d{4}" free="3\\d{4}|116\\d{3}|21101|20366|555|2051|33033" /> <!-- United Kingdom (Great Britain): 4-6 digits, common codes [5-8]xxxx, plus EU: http://www.short-codes.com/media/Co-regulatoryCodeofPracticeforcommonshortcodes170206.pdf, @@ -150,6 +150,9 @@ http://clients.txtnation.com/entries/209633-hungary-premium-sms-short-code-regulations --> <shortcode country="hu" pattern="[01](?:\\d{3}|\\d{9})" premium="0691227910|1784" free="116\\d{3}" /> + <!-- Honduras --> + <shortcode country="hn" pattern="\\d{4,6}" free="466453" /> + <!-- India: 1-5 digits (standard system default, not country specific) --> <shortcode country="in" pattern="\\d{1,5}" free="59336|53969" /> @@ -171,7 +174,7 @@ <shortcode country="jp" pattern="\\d{1,5}" free="8083" /> <!-- Kenya: 5 digits, known premium codes listed --> - <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520|23342|40023" /> + <shortcode country="ke" pattern="\\d{5}" free="21725|21562|40520|23342|40023|24088|23054" /> <!-- Kyrgyzstan: 4 digits, known premium codes listed --> <shortcode country="kg" pattern="\\d{4}" premium="415[2367]|444[69]" /> @@ -183,7 +186,7 @@ <shortcode country="kz" pattern="\\d{4}" premium="335[02]|4161|444[469]|77[2359]0|8444|919[3-5]|968[2-5]" /> <!-- Kuwait: 1-5 digits (standard system default, not country specific) --> - <shortcode country="kw" pattern="\\d{1,5}" free="1378|50420|94006|55991" /> + <shortcode country="kw" pattern="\\d{1,5}" free="1378|50420|94006|55991|50976" /> <!-- Lithuania: 3-5 digits, known premium codes listed, plus EU --> <shortcode country="lt" pattern="\\d{3,5}" premium="13[89]1|1394|16[34]5" free="116\\d{3}|1399|1324" /> @@ -195,9 +198,18 @@ <!-- Latvia: 4 digits, known premium codes listed, plus EU --> <shortcode country="lv" pattern="\\d{4}" premium="18(?:19|63|7[1-4])" free="116\\d{3}|1399" /> + <!-- Morocco: 1-5 digits (standard system default, not country specific) --> + <shortcode country="ma" pattern="\\d{1,5}" free="53819" /> + <!-- Macedonia: 1-6 digits (not confirmed), known premium codes listed --> <shortcode country="mk" pattern="\\d{1,6}" free="129005|122" /> + <!-- Malawi: 1-5 digits (standard system default, not country specific) --> + <shortcode country="mw" pattern="\\d{1,5}" free="4276" /> + + <!-- Mozambique: 1-5 digits (standard system default, not country specific) --> + <shortcode country="mz" pattern="\\d{1,5}" free="1714" /> + <!-- Mexico: 4-5 digits (not confirmed), known premium codes listed --> <shortcode country="mx" pattern="\\d{4,6}" premium="53035|7766" free="26259|46645|50025|50052|5050|76551|88778|9963|91101|45453|550346" /> @@ -207,6 +219,9 @@ <!-- Namibia: 1-5 digits (standard system default, not country specific) --> <shortcode country="na" pattern="\\d{1,5}" free="40005" /> + <!-- Nicaragua --> + <shortcode country="ni" pattern="\\d{4,6}" free="466453" /> + <!-- The Netherlands, 4 digits, known premium codes listed, plus EU --> <shortcode country="nl" pattern="\\d{4}" premium="4466|5040" free="116\\d{3}|2223|6225|2223|1662" /> @@ -219,8 +234,8 @@ <!-- New Zealand: 3-4 digits, known premium codes listed --> <shortcode country="nz" pattern="\\d{3,4}" premium="3903|8995|4679" free="1737|176|2141|3067|3068|3110|3876|4006|4053|4061|4062|4202|4300|4334|4412|4575|5626|8006|8681" /> - <!-- Peru: 4-5 digits (not confirmed), known premium codes listed --> - <shortcode country="pe" pattern="\\d{4,5}" free="9963|40778" /> + <!-- Peru: 4-6 digits (not confirmed), known premium codes listed --> + <shortcode country="pe" pattern="\\d{4,6}" free="9963|40778|301303" /> <!-- Philippines --> <shortcode country="ph" pattern="\\d{1,5}" free="2147|5495|5496" /> @@ -269,6 +284,12 @@ <!-- Slovakia: 4 digits (premium), plus EU: http://www.cmtelecom.com/premium-sms/slovakia --> <shortcode country="sk" premium="\\d{4}" free="116\\d{3}|8000" /> + <!-- Senegal(SN): 1-5 digits (standard system default, not country specific) --> + <shortcode country="sn" pattern="\\d{1,5}" free="21215" /> + + <!-- El Salvador(SV): 1-5 digits (standard system default, not country specific) --> + <shortcode country="sv" pattern="\\d{4,6}" free="466453" /> + <!-- Taiwan --> <shortcode country="tw" pattern="\\d{4}" free="1922" /> @@ -278,15 +299,21 @@ <!-- Tajikistan: 4 digits, known premium codes listed --> <shortcode country="tj" pattern="\\d{4}" premium="11[3-7]1|4161|4333|444[689]" /> + <!-- Tanzania: 1-5 digits (standard system default, not country specific) --> + <shortcode country="tz" pattern="\\d{1,5}" free="15046|15234" /> + <!-- Turkey --> <shortcode country="tr" pattern="\\d{1,5}" free="7529|5528|6493|3193" /> <!-- Ukraine: 4 digits, known premium codes listed --> <shortcode country="ua" pattern="\\d{4}" premium="444[3-9]|70[579]4|7540" /> + <!-- Uganda(UG): 4 digits (standard system default, not country specific) --> + <shortcode country="ug" pattern="\\d{4}" free="8000" /> + <!-- USA: 5-6 digits (premium codes from https://www.premiumsmsrefunds.com/ShortCodes.htm), visual voicemail code for T-Mobile: 122 --> - <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" standard="44567|244444" free="122|87902|21696|24614|28003|30356|33669|40196|41064|41270|43753|44034|46645|52413|56139|57969|61785|66975|75136|76227|81398|83952|85140|86566|86799|95737|96684|99245|611611" /> + <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" standard="44567|244444" free="122|87902|21696|24614|28003|30356|33669|40196|41064|41270|43753|44034|46645|52413|56139|57969|61785|66975|75136|76227|81398|83952|85140|86566|86799|95737|96684|99245|611611|96831" /> <!-- Vietnam: 1-5 digits (standard system default, not country specific) --> <shortcode country="vn" pattern="\\d{1,5}" free="5001|9055" /> diff --git a/data/etc/platform.xml b/data/etc/platform.xml index c4530f64a82d..cb803f7babfa 100644 --- a/data/etc/platform.xml +++ b/data/etc/platform.xml @@ -124,6 +124,10 @@ <group gid="security_log_writer" /> </permission> + <permission name="android.permission.MANAGE_VIRTUAL_MACHINE"> + <group gid="virtualmachine" /> + </permission> + <!-- These are permissions that were mapped to gids but we need to keep them here until an upgrade from L to the current version is to be supported. These permissions are built-in diff --git a/keystore/java/android/security/AndroidKeyStoreMaintenance.java b/keystore/java/android/security/AndroidKeyStoreMaintenance.java index 2beb434566e5..2430e8d8e662 100644 --- a/keystore/java/android/security/AndroidKeyStoreMaintenance.java +++ b/keystore/java/android/security/AndroidKeyStoreMaintenance.java @@ -18,6 +18,7 @@ package android.security; import android.annotation.NonNull; import android.annotation.Nullable; +import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; import android.os.StrictMode; @@ -218,4 +219,28 @@ public class AndroidKeyStoreMaintenance { return SYSTEM_ERROR; } } + + /** + * Returns the list of Application UIDs that have auth-bound keys that are bound to + * the given SID. This enables warning the user when they are about to invalidate + * a SID (for example, removing the LSKF). + * + * @param userId - The ID of the user the SID is associated with. + * @param userSecureId - The SID in question. + * + * @return A list of app UIDs. + */ + public static long[] getAllAppUidsAffectedBySid(int userId, long userSecureId) + throws KeyStoreException { + StrictMode.noteDiskWrite(); + try { + return getService().getAppUidsAffectedBySid(userId, userSecureId); + } catch (RemoteException | NullPointerException e) { + throw new KeyStoreException(SYSTEM_ERROR, + "Failure to connect to Keystore while trying to get apps affected by SID."); + } catch (ServiceSpecificException e) { + throw new KeyStoreException(e.errorCode, + "Keystore error while trying to get apps affected by SID."); + } + } } diff --git a/services/core/java/com/android/server/adb/AdbDebuggingManager.java b/services/core/java/com/android/server/adb/AdbDebuggingManager.java index 627a62ee0496..34c3d7ec8433 100644 --- a/services/core/java/com/android/server/adb/AdbDebuggingManager.java +++ b/services/core/java/com/android/server/adb/AdbDebuggingManager.java @@ -246,16 +246,6 @@ public class AdbDebuggingManager { @Override public void run() { - if (mGuid.isEmpty()) { - Slog.e(TAG, "adbwifi guid was not set"); - return; - } - mPort = native_pairing_start(mGuid, mPairingCode); - if (mPort <= 0 || mPort > 65535) { - Slog.e(TAG, "Unable to start pairing server"); - return; - } - // Register the mdns service NsdServiceInfo serviceInfo = new NsdServiceInfo(); serviceInfo.setServiceName(mServiceName); @@ -288,6 +278,28 @@ public class AdbDebuggingManager { mHandler.sendMessage(message); } + @Override + public void start() { + /* + * If a user is fast enough to click cancel, native_pairing_cancel can be invoked + * while native_pairing_start is running which run the destruction of the object + * while it is being constructed. Here we start the pairing server on foreground + * Thread so native_pairing_cancel can never be called concurrently. Then we let + * the pairing server run on a background Thread. + */ + if (mGuid.isEmpty()) { + Slog.e(TAG, "adbwifi guid was not set"); + return; + } + mPort = native_pairing_start(mGuid, mPairingCode); + if (mPort <= 0) { + Slog.e(TAG, "Unable to start pairing server"); + return; + } + + super.start(); + } + public void cancelPairing() { native_pairing_cancel(); } diff --git a/services/core/java/com/android/server/am/OomConnection.java b/services/core/java/com/android/server/am/OomConnection.java new file mode 100644 index 000000000000..17a4ce5b921c --- /dev/null +++ b/services/core/java/com/android/server/am/OomConnection.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.am; + +import android.os.OomKillRecord; +import android.util.Slog; + +/** Connection to the out-of-memory (OOM) events' file */ +public final class OomConnection { + private static final String TAG = "OomConnection"; + + /** Connection listener interface */ + public interface OomConnectionListener { + + /** + * Callback function to handle the newest OOM kills. + * + * @param oomKills List of oom kills received from `waitOom()` + */ + void handleOomEvent(OomKillRecord[] oomKills); + } + + private final OomConnectionListener mOomListener; + + private final OomConnectionThread mOomConnectionThread; + + private static native OomKillRecord[] waitOom(); + + public OomConnection(OomConnectionListener listener) { + mOomListener = listener; + mOomConnectionThread = new OomConnectionThread(); + mOomConnectionThread.start(); + } + + private final class OomConnectionThread extends Thread { + public void run() { + while (true) { + OomKillRecord[] oom_kills = null; + try { + oom_kills = waitOom(); + mOomListener.handleOomEvent(oom_kills); + } catch (RuntimeException e) { + Slog.e(TAG, "failed waiting for OOM events: " + e); + break; + } + } + } + } +} diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index b8d2284275ea..1ad85426d30c 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -97,6 +97,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.Looper; import android.os.Message; +import android.os.OomKillRecord; import android.os.PowerManager; import android.os.Process; import android.os.RemoteCallbackList; @@ -412,6 +413,8 @@ public final class ProcessList { private static LmkdConnection sLmkdConnection = null; + private static OomConnection sOomConnection = null; + private boolean mOomLevelsSet = false; private boolean mAppDataIsolationEnabled = false; @@ -855,6 +858,21 @@ public final class ProcessList { THREAD_PRIORITY_BACKGROUND, true /* allowIo */); sKillThread.start(); sKillHandler = new KillHandler(sKillThread.getLooper()); + sOomConnection = new OomConnection(new OomConnection.OomConnectionListener() { + @Override + public void handleOomEvent(OomKillRecord[] oomKills) { + for (OomKillRecord oomKill: oomKills) { + synchronized (mProcLock) { + noteAppKill( + oomKill.getPid(), + oomKill.getUid(), + ApplicationExitInfo.REASON_LOW_MEMORY, + ApplicationExitInfo.SUBREASON_OOM_KILL, + "oom"); + } + } + } + }); sLmkdConnection = new LmkdConnection(sKillThread.getLooper().getQueue(), new LmkdConnection.LmkdConnectionListener() { @Override diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 2f9149a20204..dea5f82fd291 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -1336,6 +1336,11 @@ public class InputManagerService extends IInputManager.Stub } @Override // Binder call + public int getMousePointerSpeed() { + return mNative.getMousePointerSpeed(); + } + + @Override // Binder call public void tryPointerSpeed(int speed) { if (!checkCallingPermission(android.Manifest.permission.SET_POINTER_SPEED, "tryPointerSpeed()")) { diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 363bc94b49bd..79c042d7760c 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -117,6 +117,8 @@ interface NativeInputManagerService { */ boolean transferTouch(IBinder destChannelToken, int displayId); + int getMousePointerSpeed(); + void setPointerSpeed(int speed); void setPointerAcceleration(float acceleration); @@ -343,6 +345,9 @@ interface NativeInputManagerService { public native boolean transferTouch(IBinder destChannelToken, int displayId); @Override + public native int getMousePointerSpeed(); + + @Override public native void setPointerSpeed(int speed); @Override diff --git a/services/core/java/com/android/server/wm/WindowList.java b/services/core/java/com/android/server/wm/WindowList.java index dfeba40fa45e..1e888f5823a1 100644 --- a/services/core/java/com/android/server/wm/WindowList.java +++ b/services/core/java/com/android/server/wm/WindowList.java @@ -24,7 +24,7 @@ import java.util.ArrayList; */ class WindowList<E> extends ArrayList<E> { - void addFirst(E e) { + public void addFirst(E e) { add(0, e); } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 8cd55c7dd506..1f6f4f3620c3 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -77,6 +77,7 @@ cc_library_static { "onload.cpp", ":lib_cachedAppOptimizer_native", ":lib_gameManagerService_native", + ":lib_oomConnection_native", ], include_dirs: [ @@ -118,6 +119,7 @@ cc_defaults { "libhardware_legacy", "libhidlbase", "libmeminfo", + "libmemevents", "libmemtrackproxy", "libmtp", "libnativehelper", @@ -235,3 +237,8 @@ filegroup { "com_android_server_app_GameManagerService.cpp", ], } + +filegroup { + name: "lib_oomConnection_native", + srcs: ["com_android_server_am_OomConnection.cpp"], +} diff --git a/services/core/jni/com_android_server_am_OomConnection.cpp b/services/core/jni/com_android_server_am_OomConnection.cpp new file mode 100644 index 000000000000..49a3ad35649b --- /dev/null +++ b/services/core/jni/com_android_server_am_OomConnection.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "OomConnection" + +#include <core_jni_helpers.h> +#include <jni.h> +#include <memevents/memevents.h> + +namespace android { + +using namespace ::android::bpf::memevents; + +// Used to cache the results of the JNI name lookup +static struct { + jclass clazz; + jmethodID ctor; +} sOomKillRecordInfo; + +static MemEventListener memevent_listener(MemEventClient::AMS); + +/** + * Initialize listening and waiting for new out-of-memory (OOM) events to occur. + * Once a OOM event is detected, we then fetch the list of OOM kills, and return + * a corresponding java array with the information gathered. + * + * In the case that we encounter an error, we make sure to close the epfd, and + * the OOM file descriptor, by calling `deregisterAllEvents()`. + * + * @return list of `android.os.OomKillRecord` + * @throws java.lang.RuntimeException + */ +static jobjectArray android_server_am_OomConnection_waitOom(JNIEnv* env, jobject) { + if (!memevent_listener.registerEvent(MEM_EVENT_OOM_KILL)) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "listener failed to register to OOM events"); + return nullptr; + } + + if (!memevent_listener.listen()) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "listener failed waiting for OOM event"); + return nullptr; + } + + std::vector<mem_event_t> oom_events; + if (!memevent_listener.getMemEvents(oom_events)) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "Failed to get OOM events"); + return nullptr; + } + + jobjectArray java_oom_array = + env->NewObjectArray(oom_events.size(), sOomKillRecordInfo.clazz, nullptr); + if (java_oom_array == NULL) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "Failed to create OomKillRecord array"); + return nullptr; + } + + for (int i = 0; i < oom_events.size(); i++) { + const mem_event_t mem_event = oom_events[i]; + if (mem_event.type != MEM_EVENT_OOM_KILL) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "Received invalid memory event"); + return java_oom_array; + } + + const auto oom_kill = mem_event.event_data.oom_kill; + + jstring process_name = env->NewStringUTF(oom_kill.process_name); + if (process_name == NULL) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "Failed creating java string for process name"); + } + jobject java_oom_kill = env->NewObject(sOomKillRecordInfo.clazz, sOomKillRecordInfo.ctor, + oom_kill.timestamp_ms, oom_kill.pid, oom_kill.uid, + process_name, oom_kill.oom_score_adj); + if (java_oom_kill == NULL) { + memevent_listener.deregisterAllEvents(); + jniThrowRuntimeException(env, "Failed to create OomKillRecord object"); + return java_oom_array; + } + env->SetObjectArrayElement(java_oom_array, i, java_oom_kill); + } + return java_oom_array; +} + +static const JNINativeMethod sOomConnectionMethods[] = { + /* name, signature, funcPtr */ + {"waitOom", "()[Landroid/os/OomKillRecord;", + (void*)android_server_am_OomConnection_waitOom}, +}; + +int register_android_server_am_OomConnection(JNIEnv* env) { + sOomKillRecordInfo.clazz = FindClassOrDie(env, "android/os/OomKillRecord"); + sOomKillRecordInfo.clazz = MakeGlobalRefOrDie(env, sOomKillRecordInfo.clazz); + + sOomKillRecordInfo.ctor = + GetMethodIDOrDie(env, sOomKillRecordInfo.clazz, "<init>", "(JIILjava/lang/String;S)V"); + + return RegisterMethodsOrDie(env, "com/android/server/am/OomConnection", sOomConnectionMethods, + NELEM(sOomConnectionMethods)); +} +} // namespace android
\ No newline at end of file diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 9d391654063c..0af8169defc3 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -290,6 +290,7 @@ public: void setInputDispatchMode(bool enabled, bool frozen); void setSystemUiLightsOut(bool lightsOut); void setPointerDisplayId(int32_t displayId); + int32_t getMousePointerSpeed(); void setPointerSpeed(int32_t speed); void setPointerAcceleration(float acceleration); void setTouchpadPointerSpeed(int32_t speed); @@ -1096,6 +1097,11 @@ void NativeInputManager::setPointerDisplayId(int32_t displayId) { InputReaderConfiguration::Change::DISPLAY_INFO); } +int32_t NativeInputManager::getMousePointerSpeed() { + std::scoped_lock _l(mLock); + return mLocked.pointerSpeed; +} + void NativeInputManager::setPointerSpeed(int32_t speed) { { // acquire lock std::scoped_lock _l(mLock); @@ -2037,6 +2043,12 @@ static jboolean nativeTransferTouch(JNIEnv* env, jobject nativeImplObj, jobject } } +static jint nativeGetMousePointerSpeed(JNIEnv* env, jobject nativeImplObj) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + + return static_cast<jint>(im->getMousePointerSpeed()); +} + static void nativeSetPointerSpeed(JNIEnv* env, jobject nativeImplObj, jint speed) { NativeInputManager* im = getNativeInputManager(env, nativeImplObj); @@ -2633,6 +2645,7 @@ static const JNINativeMethod gInputManagerMethods[] = { {"transferTouchFocus", "(Landroid/os/IBinder;Landroid/os/IBinder;Z)Z", (void*)nativeTransferTouchFocus}, {"transferTouch", "(Landroid/os/IBinder;I)Z", (void*)nativeTransferTouch}, + {"getMousePointerSpeed", "()I", (void*)nativeGetMousePointerSpeed}, {"setPointerSpeed", "(I)V", (void*)nativeSetPointerSpeed}, {"setPointerAcceleration", "(F)V", (void*)nativeSetPointerAcceleration}, {"setTouchpadPointerSpeed", "(I)V", (void*)nativeSetTouchpadPointerSpeed}, diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index a87902fe03c5..cf0c55dd520f 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -51,6 +51,7 @@ int register_android_server_Watchdog(JNIEnv* env); int register_android_server_HardwarePropertiesManagerService(JNIEnv* env); int register_android_server_SyntheticPasswordManager(JNIEnv* env); int register_android_hardware_display_DisplayViewport(JNIEnv* env); +int register_android_server_am_OomConnection(JNIEnv* env); int register_android_server_am_CachedAppOptimizer(JNIEnv* env); int register_android_server_am_LowMemDetector(JNIEnv* env); int register_com_android_server_soundtrigger_middleware_AudioSessionProviderImpl(JNIEnv* env); @@ -110,6 +111,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_storage_AppFuse(env); register_android_server_SyntheticPasswordManager(env); register_android_hardware_display_DisplayViewport(env); + register_android_server_am_OomConnection(env); register_android_server_am_CachedAppOptimizer(env); register_android_server_am_LowMemDetector(env); register_com_android_server_soundtrigger_middleware_AudioSessionProviderImpl(env); diff --git a/services/tests/mockingservicestests/jni/Android.bp b/services/tests/mockingservicestests/jni/Android.bp index f1dc1fa1a108..1eb9888489cb 100644 --- a/services/tests/mockingservicestests/jni/Android.bp +++ b/services/tests/mockingservicestests/jni/Android.bp @@ -22,6 +22,7 @@ cc_library_shared { srcs: [ ":lib_cachedAppOptimizer_native", ":lib_gameManagerService_native", + ":lib_oomConnection_native", "onload.cpp", ], @@ -42,6 +43,7 @@ cc_library_shared { "libgui", "libhidlbase", "liblog", + "libmemevents", "libmeminfo", "libnativehelper", "libprocessgroup", diff --git a/services/tests/mockingservicestests/jni/onload.cpp b/services/tests/mockingservicestests/jni/onload.cpp index 23ccb22321b2..fb910513adda 100644 --- a/services/tests/mockingservicestests/jni/onload.cpp +++ b/services/tests/mockingservicestests/jni/onload.cpp @@ -26,6 +26,7 @@ namespace android { int register_android_server_am_CachedAppOptimizer(JNIEnv* env); int register_android_server_app_GameManagerService(JNIEnv* env); +int register_android_server_am_OomConnection(JNIEnv* env); }; using namespace android; @@ -42,6 +43,7 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) ALOG_ASSERT(env, "Could not retrieve the env!"); register_android_server_am_CachedAppOptimizer(env); register_android_server_app_GameManagerService(env); + register_android_server_am_OomConnection(env); return JNI_VERSION_1_4; } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerInternalTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerInternalTest.java index 64cc3979f181..9ba4f5b4fe30 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerInternalTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerInternalTest.java @@ -218,4 +218,9 @@ public class ActivityManagerInternalTest { assertEquals(errMsg, Thread.State.TERMINATED, getState()); } } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java index 2bc66ace454b..40b5458b06b9 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ActivityManagerServiceTest.java @@ -1210,4 +1210,9 @@ public class ActivityManagerServiceTest { return returnValueForstartUserOnSecondaryDisplay; } } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java index 1c0989c4fb65..9391d5bfeed4 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/AppChildProcessTest.java @@ -338,4 +338,8 @@ public class AppChildProcessTest { } } + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationExitInfoTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationExitInfoTest.java index d56229c9681f..e15942bb8f9a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ApplicationExitInfoTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ApplicationExitInfoTest.java @@ -1126,4 +1126,9 @@ public class ApplicationExitInfoTest { }; } } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java index 1fd7c4ac711a..fa5bfd6f6359 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/AsyncProcessStartTest.java @@ -284,4 +284,9 @@ public class AsyncProcessStartTest { return app; } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java index 434d20035369..dfb8fda56edf 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CacheOomRankerTest.java @@ -803,4 +803,9 @@ public class CacheOomRankerTest { return mHandler; } } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/ServiceTimeoutTest.java b/services/tests/mockingservicestests/src/com/android/server/am/ServiceTimeoutTest.java index fd1b06830a89..7ec27be0bfc3 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/ServiceTimeoutTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/ServiceTimeoutTest.java @@ -201,4 +201,9 @@ public final class ServiceTimeoutTest { return mActiveServices; } } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("mockingservicestestjni"); + } } diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 5cce1c2f6234..92628f44f6bc 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -2,6 +2,13 @@ // Build FrameworksServicesTests package //######################################################################## +java_defaults { + name: "FrameworksServicesTests-jni-defaults", + jni_libs: [ + "libservicestestjni", + ], +} + package { // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import @@ -13,6 +20,9 @@ package { android_test { name: "FrameworksServicesTests", + defaults: [ + "FrameworksServicesTests-jni-defaults", + ], // Include all test java files. srcs: [ diff --git a/services/tests/servicestests/jni/Android.bp b/services/tests/servicestests/jni/Android.bp new file mode 100644 index 000000000000..174beb81d3eb --- /dev/null +++ b/services/tests/servicestests/jni/Android.bp @@ -0,0 +1,58 @@ +package { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_base_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_base_license"], +} + +cc_library_shared { + name: "libservicestestjni", + + defaults: ["android.hardware.graphics.common-ndk_shared"], + + cflags: [ + "-Wall", + "-Werror", + "-Wno-unused-parameter", + "-Wthread-safety", + ], + + srcs: [ + ":lib_cachedAppOptimizer_native", + ":lib_gameManagerService_native", + ":lib_oomConnection_native", + "onload.cpp", + ], + + include_dirs: [ + "frameworks/base/libs", + "frameworks/native/services", + "frameworks/native/libs/math/include", + "frameworks/native/libs/ui/include", + "system/memory/libmeminfo/include", + ], + + shared_libs: [ + "libandroid", + "libandroid_runtime", + "libbase", + "libbinder", + "libgralloctypes", + "libgui", + "libhidlbase", + "liblog", + "libmeminfo", + "libmemevents", + "libnativehelper", + "libprocessgroup", + "libutils", + "libcutils", + "android.hardware.graphics.bufferqueue@1.0", + "android.hardware.graphics.bufferqueue@2.0", + "android.hardware.graphics.common@1.2", + "android.hardware.graphics.mapper@4.0", + "android.hidl.token@1.0-utils", + ], +}
\ No newline at end of file diff --git a/services/tests/servicestests/jni/onload.cpp b/services/tests/servicestests/jni/onload.cpp new file mode 100644 index 000000000000..f160b3d97367 --- /dev/null +++ b/services/tests/servicestests/jni/onload.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* + * this is a mini native libaray for cached app optimizer tests to run properly. It + * loads all the native methods necessary. + */ +#include <nativehelper/JNIHelp.h> +#include "jni.h" +#include "utils/Log.h" +#include "utils/misc.h" + +namespace android { +int register_android_server_am_CachedAppOptimizer(JNIEnv* env); +int register_android_server_app_GameManagerService(JNIEnv* env); +int register_android_server_am_OomConnection(JNIEnv* env); +}; + +using namespace android; + +extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) +{ + JNIEnv* env = NULL; + jint result = -1; + + if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { + ALOGE("GetEnv failed!"); + return result; + } + ALOG_ASSERT(env, "Could not retrieve the env!"); + register_android_server_am_CachedAppOptimizer(env); + register_android_server_app_GameManagerService(env); + register_android_server_am_OomConnection(env); + return JNI_VERSION_1_4; +} diff --git a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java index acdfee9af557..c0051c6c9e17 100644 --- a/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/am/AnrHelperTest.java @@ -172,4 +172,9 @@ public class AnrHelperTest { anyString(), any(), any(), any(), anyBoolean(), any(), eq(mAuxExecutorService), anyBoolean(), anyBoolean(), any()); } + + // TODO: [b/302724778] Remove manual JNI load + static { + System.loadLibrary("servicestestjni"); + } } |