diff options
117 files changed, 3085 insertions, 1854 deletions
diff --git a/Android.mk b/Android.mk index d33307425968..ba153ee76b0a 100644 --- a/Android.mk +++ b/Android.mk @@ -87,6 +87,7 @@ $(INTERNAL_PLATFORM_HIDDENAPI_WHITELIST): \ frameworks/base/tools/hiddenapi/generate_hiddenapi_lists.py \ frameworks/base/config/hiddenapi-light-greylist.txt \ frameworks/base/config/hiddenapi-vendor-list.txt \ + frameworks/base/config/hiddenapi-max-sdk-p-blacklist.txt \ frameworks/base/config/hiddenapi-force-blacklist.txt \ $(INTERNAL_PLATFORM_HIDDENAPI_PUBLIC_LIST) \ $(INTERNAL_PLATFORM_HIDDENAPI_PRIVATE_LIST) \ @@ -98,6 +99,7 @@ $(INTERNAL_PLATFORM_HIDDENAPI_WHITELIST): \ --input-greylists \ frameworks/base/config/hiddenapi-light-greylist.txt \ frameworks/base/config/hiddenapi-vendor-list.txt \ + frameworks/base/config/hiddenapi-max-sdk-p-blacklist.txt \ <(comm -12 <(sort $(INTERNAL_PLATFORM_REMOVED_DEX_API_FILE)) \ $(INTERNAL_PLATFORM_HIDDENAPI_PRIVATE_LIST)) \ $(PRIVATE_GREYLIST_INPUTS) \ diff --git a/api/current.txt b/api/current.txt index 205c322e1c57..da7414c038e7 100755 --- a/api/current.txt +++ b/api/current.txt @@ -43032,6 +43032,8 @@ package android.telephony { method public static int getDefaultSmsSubscriptionId(); method public static int getDefaultSubscriptionId(); method public static int getDefaultVoiceSubscriptionId(); + method public static int getSlotIndex(int); + method public static int[] getSubscriptionIds(int); method public java.util.List<android.telephony.SubscriptionInfo> getOpportunisticSubscriptions(int); method public static int[] getSubscriptionIds(int); method public java.util.List<android.telephony.SubscriptionPlan> getSubscriptionPlans(int); @@ -43053,6 +43055,7 @@ package android.telephony { field public static final int DATA_ROAMING_ENABLE = 1; // 0x1 field public static final int DEFAULT_SUBSCRIPTION_ID = 2147483647; // 0x7fffffff field public static final java.lang.String EXTRA_SUBSCRIPTION_INDEX = "android.telephony.extra.SUBSCRIPTION_INDEX"; + field public static final int INVALID_SIM_SLOT_INDEX = -1; // 0xffffffff field public static final int INVALID_SUBSCRIPTION_ID = -1; // 0xffffffff } @@ -44384,6 +44387,7 @@ package android.text { method public static int lastIndexOf(java.lang.CharSequence, char, int); method public static int lastIndexOf(java.lang.CharSequence, char, int, int); method public static java.lang.CharSequence listEllipsize(android.content.Context, java.util.List<java.lang.CharSequence>, java.lang.String, android.text.TextPaint, float, int); + method public static java.lang.CharSequence makeSafeForPresentation(java.lang.String, int, float, int); method public static boolean regionMatches(java.lang.CharSequence, int, java.lang.CharSequence, int, int); method public static java.lang.CharSequence replace(java.lang.CharSequence, java.lang.String[], java.lang.CharSequence[]); method public static java.lang.String[] split(java.lang.String, java.lang.String); @@ -44395,6 +44399,9 @@ package android.text { field public static final int CAP_MODE_SENTENCES = 16384; // 0x4000 field public static final int CAP_MODE_WORDS = 8192; // 0x2000 field public static final android.os.Parcelable.Creator<java.lang.CharSequence> CHAR_SEQUENCE_CREATOR; + field public static final int SAFE_STRING_FLAG_FIRST_LINE = 4; // 0x4 + field public static final int SAFE_STRING_FLAG_SINGLE_LINE = 2; // 0x2 + field public static final int SAFE_STRING_FLAG_TRIM = 1; // 0x1 } public static abstract interface TextUtils.EllipsizeCallback { diff --git a/api/system-current.txt b/api/system-current.txt index 0a89ffb055b7..87a44ced026e 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1012,7 +1012,6 @@ package android.content { field public static final java.lang.String EXTRA_REMOTE_CALLBACK = "android.intent.extra.REMOTE_CALLBACK"; field public static final java.lang.String EXTRA_RESULT_NEEDED = "android.intent.extra.RESULT_NEEDED"; field public static final java.lang.String EXTRA_UNKNOWN_INSTANT_APP = "android.intent.extra.UNKNOWN_INSTANT_APP"; - field public static final java.lang.String EXTRA_USER_ID = "android.intent.extra.USER_ID"; field public static final java.lang.String EXTRA_VERIFICATION_BUNDLE = "android.intent.extra.VERIFICATION_BUNDLE"; } @@ -1122,9 +1121,9 @@ package android.content.pm { method public static void forceSafeLabels(); method public deprecated java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager); method public java.lang.CharSequence loadSafeLabel(android.content.pm.PackageManager, float, int); - field public static final int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4 - field public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2 - field public static final int SAFE_LABEL_FLAG_TRIM = 1; // 0x1 + field public static final deprecated int SAFE_LABEL_FLAG_FIRST_LINE = 4; // 0x4 + field public static final deprecated int SAFE_LABEL_FLAG_SINGLE_LINE = 2; // 0x2 + field public static final deprecated int SAFE_LABEL_FLAG_TRIM = 1; // 0x1 } public abstract class PackageManager { @@ -5340,6 +5339,11 @@ package android.telephony { field public static final int RESULT_SUCCESS = 0; // 0x0 } + public class PhoneStateListener { + method public void onRadioPowerStateChanged(int); + field public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 8388608; // 0x800000 + } + public class ServiceState implements android.os.Parcelable { method public android.telephony.NetworkRegistrationState getNetworkRegistrationState(int, int); method public java.util.List<android.telephony.NetworkRegistrationState> getNetworkRegistrationStates(); @@ -5467,6 +5471,7 @@ package android.telephony { method public boolean getEmergencyCallbackMode(); method public java.lang.String getIsimDomain(); method public int getPreferredNetworkType(int); + method public int getRadioPowerState(); method public int getSimApplicationState(); method public int getSimCardState(); method public java.util.List<android.telephony.TelephonyHistogram> getTelephonyHistograms(); @@ -5530,6 +5535,9 @@ package android.telephony { field public static final int NETWORK_MODE_TDSCDMA_WCDMA = 14; // 0xe field public static final int NETWORK_MODE_WCDMA_ONLY = 2; // 0x2 field public static final int NETWORK_MODE_WCDMA_PREF = 0; // 0x0 + field public static final int RADIO_POWER_OFF = 0; // 0x0 + field public static final int RADIO_POWER_ON = 1; // 0x1 + field public static final int RADIO_POWER_UNAVAILABLE = 2; // 0x2 field public static final int SIM_ACTIVATION_STATE_ACTIVATED = 2; // 0x2 field public static final int SIM_ACTIVATION_STATE_ACTIVATING = 1; // 0x1 field public static final int SIM_ACTIVATION_STATE_DEACTIVATED = 3; // 0x3 diff --git a/api/system-removed.txt b/api/system-removed.txt index 22465621e693..4e7a11444548 100644 --- a/api/system-removed.txt +++ b/api/system-removed.txt @@ -91,38 +91,6 @@ package android.os { } -package android.security.keystore.recovery { - - public final class KeyChainSnapshot implements android.os.Parcelable { - method public deprecated byte[] getTrustedHardwarePublicKey(); - } - - public class RecoveryController { - method public deprecated byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException; - method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException; - method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException; - method public deprecated void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; - method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException; - } - - public class RecoverySession implements java.lang.AutoCloseable { - method public deprecated java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException; - method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; - method public deprecated byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException; - } - - public final class WrappedApplicationKey implements android.os.Parcelable { - method public deprecated byte[] getAccount(); - } - - public static class WrappedApplicationKey.Builder { - method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]); - } - -} - package android.service.notification { public abstract class NotificationListenerService extends android.app.Service { diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk index f6b0db80f3ad..c396cd130f93 100644 --- a/cmds/statsd/Android.mk +++ b/cmds/statsd/Android.mk @@ -189,6 +189,7 @@ LOCAL_SRC_FILES := \ src/atom_field_options.proto \ src/atoms.proto \ src/stats_log.proto \ + src/shell/shell_data.proto \ tests/AlarmMonitor_test.cpp \ tests/anomaly/AlarmTracker_test.cpp \ tests/anomaly/AnomalyTracker_test.cpp \ diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index fb6f8c8d4590..ce2877731882 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -319,7 +319,7 @@ status_t StatsService::command(int in, int out, int err, Vector<String8>& args, } if (!args[0].compare(String8("data-subscribe"))) { if (mShellSubscriber == nullptr) { - mShellSubscriber = new ShellSubscriber(mUidMap); + mShellSubscriber = new ShellSubscriber(mUidMap, mPullerManager); } mShellSubscriber->startNewSubscription(in, out, resultReceiver); return NO_ERROR; diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 46045101f168..404599636aec 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -183,6 +183,7 @@ message Atom { DiskIo disk_io = 10032; PowerProfile power_profile = 10033; ProcStats proc_stats_pkg_proc = 10034; + ProcessCpuTime process_cpu_time = 10035; } // DO NOT USE field numbers above 100,000 in AOSP. @@ -3006,3 +3007,19 @@ message PowerProfileProto { message PowerProfile { optional PowerProfileProto power_profile = 1; } + +/** + * Pulls process user time and system time. Puller takes a snapshot of all pids + * in the system and returns cpu stats for those that are working at the time. + * Dead pids will be dropped. Kernel processes are excluded. + * Min cool-down is 5 sec. + */ +message ProcessCpuTime { + optional int32 uid = 1 [(is_uid) = true]; + + optional string process_name = 2; + // Process cpu time in user space, cumulative from boot/process start + optional int64 user_time_millis = 3; + // Process cpu time in system space, cumulative from boot/process start + optional int64 system_time_millis = 4; +}
\ No newline at end of file diff --git a/cmds/statsd/src/external/StatsPullerManager.cpp b/cmds/statsd/src/external/StatsPullerManager.cpp index dab64cacb679..4c74c1701f3e 100644 --- a/cmds/statsd/src/external/StatsPullerManager.cpp +++ b/cmds/statsd/src/external/StatsPullerManager.cpp @@ -223,6 +223,9 @@ const std::map<int, PullAtomInfo> StatsPullerManager::kAllPullAtomInfo = { // PowerProfile constants for power model calculations. {android::util::POWER_PROFILE, {{}, {}, 1 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::POWER_PROFILE)}}, + // Process cpu stats. Min cool-down is 5 sec, inline with what AcitivityManagerService uses. + {android::util::PROCESS_CPU_TIME, + {{}, {}, 5 * NS_PER_SEC, new StatsCompanionServicePuller(android::util::PROCESS_CPU_TIME)}}, }; StatsPullerManager::StatsPullerManager() : mNextPullTimeNs(NO_ALARM_UPDATE) { diff --git a/cmds/statsd/src/shell/ShellSubscriber.cpp b/cmds/statsd/src/shell/ShellSubscriber.cpp index 1306a467e5c4..dffff7a96269 100644 --- a/cmds/statsd/src/shell/ShellSubscriber.cpp +++ b/cmds/statsd/src/shell/ShellSubscriber.cpp @@ -18,9 +18,9 @@ #include "ShellSubscriber.h" -#include "matchers/matcher_util.h" - #include <android-base/file.h> +#include "matchers/matcher_util.h" +#include "stats_log_util.h" using android::util::ProtoOutputStream; @@ -28,6 +28,8 @@ namespace android { namespace os { namespace statsd { +const static int FIELD_ID_ATOM = 1; + void ShellSubscriber::startNewSubscription(int in, int out, sp<IResultReceiver> resultReceiver) { VLOG("start new shell subscription"); { @@ -42,25 +44,106 @@ void ShellSubscriber::startNewSubscription(int in, int out, sp<IResultReceiver> IInterface::asBinder(mResultReceiver)->linkToDeath(this); } - // Spawn another thread to read the config updates from the input file descriptor - std::thread reader([in, this] { readConfig(in); }); - reader.detach(); + // Note that the following is blocking, and it's intended as we cannot return until the shell + // cmd exits, otherwise all resources & FDs will be automatically closed. - std::unique_lock<std::mutex> lk(mMutex); + // Read config forever until EOF is reached. Clients may send multiple configs -- each new + // config replace the previous one. + readConfig(in); + // Now we have read an EOF we now wait for the semaphore until the client exits. + VLOG("Now wait for client to exit"); + std::unique_lock<std::mutex> lk(mMutex); mShellDied.wait(lk, [this, resultReceiver] { return mResultReceiver != resultReceiver; }); - if (reader.joinable()) { - reader.join(); - } } void ShellSubscriber::updateConfig(const ShellSubscription& config) { std::lock_guard<std::mutex> lock(mMutex); mPushedMatchers.clear(); + mPulledInfo.clear(); + for (const auto& pushed : config.pushed()) { mPushedMatchers.push_back(pushed); VLOG("adding matcher for atom %d", pushed.atom_id()); } + + int64_t token = getElapsedRealtimeNs(); + mPullToken = token; + + int64_t minInterval = -1; + for (const auto& pulled : config.pulled()) { + // All intervals need to be multiples of the min interval. + if (minInterval < 0 || pulled.freq_millis() < minInterval) { + minInterval = pulled.freq_millis(); + } + + mPulledInfo.emplace_back(pulled.matcher(), pulled.freq_millis()); + VLOG("adding matcher for pulled atom %d", pulled.matcher().atom_id()); + } + + if (mPulledInfo.size() > 0 && minInterval > 0) { + // This thread is guaranteed to terminate after it detects the token is different or + // cleaned up. + std::thread puller([token, minInterval, this] { startPull(token, minInterval); }); + puller.detach(); + } +} + +void ShellSubscriber::writeToOutputLocked(const vector<std::shared_ptr<LogEvent>>& data, + const SimpleAtomMatcher& matcher) { + if (mOutput == 0) return; + int count = 0; + mProto.clear(); + for (const auto& event : data) { + VLOG("%s", event->ToString().c_str()); + if (matchesSimple(*mUidMap, matcher, *event)) { + VLOG("matched"); + count++; + uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE | + util::FIELD_COUNT_REPEATED | FIELD_ID_ATOM); + event->ToProto(mProto); + mProto.end(atomToken); + } + } + + if (count > 0) { + // First write the payload size. + size_t bufferSize = mProto.size(); + write(mOutput, &bufferSize, sizeof(bufferSize)); + VLOG("%d atoms, proto size: %zu", count, bufferSize); + // Then write the payload. + mProto.flush(mOutput); + } + mProto.clear(); +} + +void ShellSubscriber::startPull(int64_t token, int64_t intervalMillis) { + while (1) { + int64_t nowMillis = getElapsedRealtimeMillis(); + { + std::lock_guard<std::mutex> lock(mMutex); + if (mPulledInfo.size() == 0 || mPullToken != token) { + VLOG("Pulling thread %lld done!", (long long)token); + return; + } + for (auto& pullInfo : mPulledInfo) { + if (pullInfo.mPrevPullElapsedRealtimeMs + pullInfo.mInterval < nowMillis) { + VLOG("pull atom %d now", pullInfo.mPullerMatcher.atom_id()); + + vector<std::shared_ptr<LogEvent>> data; + mPullerMgr->Pull(pullInfo.mPullerMatcher.atom_id(), nowMillis * 1000000L, + &data); + VLOG("pulled %zu atoms", data.size()); + if (data.size() > 0) { + writeToOutputLocked(data, pullInfo.mPullerMatcher); + } + pullInfo.mPrevPullElapsedRealtimeMs = nowMillis; + } + } + } + VLOG("Pulling thread %lld sleep....", (long long)token); + std::this_thread::sleep_for(std::chrono::milliseconds(intervalMillis)); + } } void ShellSubscriber::readConfig(int in) { @@ -101,6 +184,8 @@ void ShellSubscriber::cleanUpLocked() { mOutput = 0; mResultReceiver = nullptr; mPushedMatchers.clear(); + mPulledInfo.clear(); + mPullToken = 0; VLOG("done clean up"); } @@ -110,10 +195,13 @@ void ShellSubscriber::onLogEvent(const LogEvent& event) { if (mOutput <= 0) { return; } - for (const auto& matcher : mPushedMatchers) { if (matchesSimple(*mUidMap, matcher, event)) { + VLOG("%s", event.ToString().c_str()); + uint64_t atomToken = mProto.start(util::FIELD_TYPE_MESSAGE | + util::FIELD_COUNT_REPEATED | FIELD_ID_ATOM); event.ToProto(mProto); + mProto.end(atomToken); // First write the payload size. size_t bufferSize = mProto.size(); write(mOutput, &bufferSize, sizeof(bufferSize)); diff --git a/cmds/statsd/src/shell/ShellSubscriber.h b/cmds/statsd/src/shell/ShellSubscriber.h index 0ace35fab850..5401f31ce68c 100644 --- a/cmds/statsd/src/shell/ShellSubscriber.h +++ b/cmds/statsd/src/shell/ShellSubscriber.h @@ -24,6 +24,7 @@ #include <mutex> #include <string> #include <thread> +#include "external/StatsPullerManager.h" #include "frameworks/base/cmds/statsd/src/shell/shell_config.pb.h" #include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" #include "packages/UidMap.h" @@ -51,14 +52,15 @@ namespace statsd { * with sizeof(size_t) bytes indicating the size of the proto message payload. * * The stream would be in the following format: - * |size_t|atom1 proto|size_t|atom2 proto|.... + * |size_t|shellData proto|size_t|shellData proto|.... * * Only one shell subscriber allowed at a time, because each shell subscriber blocks one thread * until it exits. */ class ShellSubscriber : public virtual IBinder::DeathRecipient { public: - ShellSubscriber(sp<UidMap> uidMap) : mUidMap(uidMap){}; + ShellSubscriber(sp<UidMap> uidMap, sp<StatsPullerManager> pullerMgr) + : mUidMap(uidMap), mPullerMgr(pullerMgr){}; /** * Start a new subscription. @@ -70,15 +72,28 @@ public: void onLogEvent(const LogEvent& event); private: + struct PullInfo { + PullInfo(const SimpleAtomMatcher& matcher, int64_t interval) + : mPullerMatcher(matcher), mInterval(interval), mPrevPullElapsedRealtimeMs(0) { + } + SimpleAtomMatcher mPullerMatcher; + int64_t mInterval; + int64_t mPrevPullElapsedRealtimeMs; + }; void readConfig(int in); void updateConfig(const ShellSubscription& config); + void startPull(int64_t token, int64_t intervalMillis); + void cleanUpLocked(); + void writeToOutputLocked(const vector<std::shared_ptr<LogEvent>>& data, + const SimpleAtomMatcher& matcher); + sp<UidMap> mUidMap; - // bool mWritten = false; + sp<StatsPullerManager> mPullerMgr; android::util::ProtoOutputStream mProto; @@ -93,6 +108,10 @@ private: sp<IResultReceiver> mResultReceiver; std::vector<SimpleAtomMatcher> mPushedMatchers; + + std::vector<PullInfo> mPulledInfo; + + int64_t mPullToken = 0; // A unique token to identify a puller thread. }; } // namespace statsd diff --git a/cmds/statsd/src/shell/shell_config.proto b/cmds/statsd/src/shell/shell_config.proto index 516693d4e7f7..73cb49a61821 100644 --- a/cmds/statsd/src/shell/shell_config.proto +++ b/cmds/statsd/src/shell/shell_config.proto @@ -24,7 +24,7 @@ option java_outer_classname = "ShellConfig"; import "frameworks/base/cmds/statsd/src/statsd_config.proto"; message PulledAtomSubscription { - optional int32 atom_id = 1; + optional SimpleAtomMatcher matcher = 1; /* gap between two pulls in milliseconds */ optional int32 freq_millis = 2; diff --git a/cmds/statsd/src/shell/shell_data.proto b/cmds/statsd/src/shell/shell_data.proto new file mode 100644 index 000000000000..236bdbdd31f6 --- /dev/null +++ b/cmds/statsd/src/shell/shell_data.proto @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2018 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. + */ + +syntax = "proto2"; + +package android.os.statsd; + +option java_package = "com.android.os.statsd"; +option java_outer_classname = "ShellDataProto"; + +import "frameworks/base/cmds/statsd/src/atoms.proto"; + +// The output of shell subscription, including both pulled and pushed subscriptions. +message ShellData { + repeated Atom atom = 1; +} diff --git a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp index b380b03e28d0..dd00561854fb 100644 --- a/cmds/statsd/tests/shell/ShellSubscriber_test.cpp +++ b/cmds/statsd/tests/shell/ShellSubscriber_test.cpp @@ -17,6 +17,7 @@ #include <unistd.h> #include "frameworks/base/cmds/statsd/src/atoms.pb.h" #include "frameworks/base/cmds/statsd/src/shell/shell_config.pb.h" +#include "frameworks/base/cmds/statsd/src/shell/shell_data.pb.h" #include "src/shell/ShellSubscriber.h" #include "tests/metrics/metrics_test_helper.h" @@ -26,7 +27,10 @@ using namespace android::os::statsd; using android::sp; using std::vector; +using testing::_; +using testing::Invoke; using testing::NaggyMock; +using testing::StrictMock; #ifdef __ANDROID__ @@ -51,7 +55,10 @@ public: } }; -TEST(ShellSubscriberTest, testPushedSubscription) { +void runShellTest(ShellSubscription config, sp<MockUidMap> uidMap, + sp<MockStatsPullerManager> pullerManager, + const vector<std::shared_ptr<LogEvent>>& pushedEvents, + const ShellData& expectedData) { // set up 2 pipes for read/write config and data int fds_config[2]; ASSERT_EQ(0, pipe(fds_config)); @@ -59,10 +66,6 @@ TEST(ShellSubscriberTest, testPushedSubscription) { int fds_data[2]; ASSERT_EQ(0, pipe(fds_data)); - // create a simple config to get screen events - ShellSubscription config; - config.add_pushed()->set_atom_id(29); - size_t bufferSize = config.ByteSize(); // write the config to pipe, first write size of the config @@ -75,15 +78,9 @@ TEST(ShellSubscriberTest, testPushedSubscription) { write(fds_config[1], buffer.data(), bufferSize); close(fds_config[1]); - // create a shell subscriber. - sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>(); - sp<ShellSubscriber> shellClient = new ShellSubscriber(uidMap); + sp<ShellSubscriber> shellClient = new ShellSubscriber(uidMap, pullerManager); sp<MyResultReceiver> resultReceiver = new MyResultReceiver(); - LogEvent event1(29, 1000); - event1.write(2); - event1.init(); - // mimic a binder thread that a shell subscriber runs on. it would block. std::thread reader([&resultReceiver, &fds_config, &fds_data, &shellClient] { shellClient->startNewSubscription(fds_config[0], fds_data[1], resultReceiver); @@ -93,44 +90,127 @@ TEST(ShellSubscriberTest, testPushedSubscription) { // let the shell subscriber to receive the config from pipe. std::this_thread::sleep_for(100ms); - // send a log event that matches the config. - std::thread log_reader([&shellClient, &event1] { shellClient->onLogEvent(event1); }); - log_reader.detach(); + if (pushedEvents.size() > 0) { + // send a log event that matches the config. + std::thread log_reader([&shellClient, &pushedEvents] { + for (const auto& event : pushedEvents) { + shellClient->onLogEvent(*event); + } + }); + + log_reader.detach(); - if (log_reader.joinable()) { - log_reader.join(); + if (log_reader.joinable()) { + log_reader.join(); + } } // wait for the data to be written. std::this_thread::sleep_for(100ms); - // this is the expected screen event atom. - Atom atom; - atom.mutable_screen_state_changed()->set_state( - ::android::view::DisplayStateEnum::DISPLAY_STATE_ON); - - int atom_size = atom.ByteSize(); + int expected_data_size = expectedData.ByteSize(); // now read from the pipe. firstly read the atom size. size_t dataSize = 0; EXPECT_EQ((int)sizeof(dataSize), read(fds_data[0], &dataSize, sizeof(dataSize))); - EXPECT_EQ(atom_size, (int)dataSize); + EXPECT_EQ(expected_data_size, (int)dataSize); // then read that much data which is the atom in proto binary format vector<uint8_t> dataBuffer(dataSize); EXPECT_EQ((int)dataSize, read(fds_data[0], dataBuffer.data(), dataSize)); // make sure the received bytes can be parsed to an atom - Atom receivedAtom; + ShellData receivedAtom; EXPECT_TRUE(receivedAtom.ParseFromArray(dataBuffer.data(), dataSize) != 0); // serialze the expected atom to bytes. and compare. to make sure they are the same. - vector<uint8_t> atomBuffer(atom_size); - atom.SerializeToArray(&atomBuffer[0], atom_size); + vector<uint8_t> atomBuffer(expected_data_size); + expectedData.SerializeToArray(&atomBuffer[0], expected_data_size); EXPECT_EQ(atomBuffer, dataBuffer); close(fds_data[0]); } +TEST(ShellSubscriberTest, testPushedSubscription) { + sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + vector<std::shared_ptr<LogEvent>> pushedList; + + std::shared_ptr<LogEvent> event1 = + std::make_shared<LogEvent>(29 /*screen_state_atom_id*/, 1000 /*timestamp*/); + event1->write(::android::view::DisplayStateEnum::DISPLAY_STATE_ON); + event1->init(); + pushedList.push_back(event1); + + // create a simple config to get screen events + ShellSubscription config; + config.add_pushed()->set_atom_id(29); + + // this is the expected screen event atom. + ShellData shellData; + shellData.add_atom()->mutable_screen_state_changed()->set_state( + ::android::view::DisplayStateEnum::DISPLAY_STATE_ON); + + runShellTest(config, uidMap, pullerManager, pushedList, shellData); +} + +namespace { + +int kUid1 = 1000; +int kUid2 = 2000; + +int kCpuTime1 = 100; +int kCpuTime2 = 200; + +ShellData getExpectedShellData() { + ShellData shellData; + auto* atom1 = shellData.add_atom()->mutable_cpu_active_time(); + atom1->set_uid(kUid1); + atom1->set_time_millis(kCpuTime1); + + auto* atom2 = shellData.add_atom()->mutable_cpu_active_time(); + atom2->set_uid(kUid2); + atom2->set_time_millis(kCpuTime2); + + return shellData; +} + +ShellSubscription getPulledConfig() { + ShellSubscription config; + auto* pull_config = config.add_pulled(); + pull_config->mutable_matcher()->set_atom_id(10016); + pull_config->set_freq_millis(2000); + return config; +} + +} // namespace + +TEST(ShellSubscriberTest, testPulledSubscription) { + sp<MockUidMap> uidMap = new NaggyMock<MockUidMap>(); + + sp<MockStatsPullerManager> pullerManager = new StrictMock<MockStatsPullerManager>(); + EXPECT_CALL(*pullerManager, Pull(10016, _, _)) + .WillRepeatedly( + Invoke([](int tagId, int64_t timeNs, vector<std::shared_ptr<LogEvent>>* data) { + data->clear(); + shared_ptr<LogEvent> event = make_shared<LogEvent>(tagId, timeNs); + event->write(kUid1); + event->write(kCpuTime1); + event->init(); + data->push_back(event); + // another event + event = make_shared<LogEvent>(tagId, timeNs); + event->write(kUid2); + event->write(kCpuTime2); + event->init(); + data->push_back(event); + return true; + })); + + runShellTest(getPulledConfig(), uidMap, pullerManager, vector<std::shared_ptr<LogEvent>>(), + getExpectedShellData()); +} + #else GTEST_LOG_(INFO) << "This test does nothing.\n"; #endif diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt index b71274cf5dc2..857c39045085 100644 --- a/config/hiddenapi-light-greylist.txt +++ b/config/hiddenapi-light-greylist.txt @@ -2791,16 +2791,6 @@ Ljavax/net/ssl/SSLServerSocketFactory;->defaultServerSocketFactory:Ljavax/net/ss Ljavax/net/ssl/SSLSocketFactory;->createSocket(Ljava/net/Socket;Ljava/io/InputStream;Z)Ljava/net/Socket; Ljavax/net/ssl/SSLSocketFactory;->defaultSocketFactory:Ljavax/net/ssl/SSLSocketFactory; Llibcore/icu/ICU;->addLikelySubtags(Ljava/util/Locale;)Ljava/util/Locale; -Llibcore/io/Libcore;->os:Llibcore/io/Os; -Llibcore/io/Memory;->peekByte(J)B -Llibcore/io/Memory;->peekByteArray(J[BII)V -Llibcore/io/Memory;->peekInt(JZ)I -Llibcore/io/Memory;->peekLong(JZ)J -Llibcore/io/Memory;->pokeByte(JB)V -Llibcore/io/Memory;->pokeByteArray(J[BII)V -Llibcore/io/Memory;->pokeInt(JIZ)V -Llibcore/io/Memory;->pokeLong(JJZ)V -Llibcore/io/Streams;->copy(Ljava/io/InputStream;Ljava/io/OutputStream;)I Llibcore/util/BasicLruCache;->map:Ljava/util/LinkedHashMap; Llibcore/util/ZoneInfo;->mTransitions:[J Lorg/ccil/cowan/tagsoup/AttributesImpl;->data:[Ljava/lang/String; diff --git a/config/hiddenapi-max-sdk-p-blacklist.txt b/config/hiddenapi-max-sdk-p-blacklist.txt new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/config/hiddenapi-max-sdk-p-blacklist.txt diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 784ce04908fe..296c063f5379 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -22,6 +22,7 @@ import android.content.ComponentName; import android.content.IIntentReceiver; import android.content.IIntentSender; import android.content.Intent; +import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.UserInfo; import android.os.Bundle; @@ -242,4 +243,10 @@ public abstract class ActivityManagerInternal { throws TransactionTooLargeException; public abstract void disconnectActivityFromServices(Object connectionHolder); + public abstract void cleanUpServices(int userId, ComponentName component, Intent baseIntent); + public abstract ActivityInfo getActivityInfoForUser(ActivityInfo aInfo, int userId); + public abstract void ensureBootCompleted(); + public abstract void updateOomLevelsForDisplay(int displayId); + public abstract boolean isActivityStartsLoggingEnabled(); + public abstract void reportCurKeyguardUsageEvent(boolean keyguardShowing); } diff --git a/core/java/android/app/ActivityTaskManager.java b/core/java/android/app/ActivityTaskManager.java index af8aa4e7c3b4..b8fe2f13d328 100644 --- a/core/java/android/app/ActivityTaskManager.java +++ b/core/java/android/app/ActivityTaskManager.java @@ -45,6 +45,12 @@ public class ActivityTaskManager { public static final int INVALID_STACK_ID = -1; /** + * Invalid task ID. + * @hide + */ + public static final int INVALID_TASK_ID = -1; + + /** * Parameter to {@link IActivityTaskManager#setTaskWindowingModeSplitScreenPrimary} which * specifies the position of the created docked stack at the top half of the screen if * in portrait mode or at the left half of the screen if in landscape mode. diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 8913748e0c48..c0463e9ae7af 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -4453,7 +4453,6 @@ public class Intent implements Parcelable, Cloneable { * * @hide */ - @SystemApi public static final String EXTRA_USER_ID = "android.intent.extra.USER_ID"; /** @@ -5009,8 +5008,7 @@ public class Intent implements Parcelable, Cloneable { "android.intent.extra.user_handle"; /** - * The UserHandle carried with broadcasts intents related to addition and removal of managed - * profiles - {@link #ACTION_MANAGED_PROFILE_ADDED} and {@link #ACTION_MANAGED_PROFILE_REMOVED}. + * The UserHandle carried with intents. */ public static final String EXTRA_USER = "android.intent.extra.USER"; diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index 00aa5c291154..cdb781438909 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -16,10 +16,12 @@ package android.content.pm; -import static java.lang.annotation.RetentionPolicy.SOURCE; +import static android.text.TextUtils.SAFE_STRING_FLAG_FIRST_LINE; +import static android.text.TextUtils.SAFE_STRING_FLAG_SINGLE_LINE; +import static android.text.TextUtils.SAFE_STRING_FLAG_TRIM; +import static android.text.TextUtils.makeSafeForPresentation; import android.annotation.FloatRange; -import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.SystemApi; import android.content.res.XmlResourceParser; @@ -27,17 +29,13 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Parcel; import android.os.UserHandle; -import android.text.Html; -import android.text.TextPaint; import android.text.TextUtils; import android.util.Printer; import android.util.proto.ProtoOutputStream; import com.android.internal.util.Preconditions; -import java.lang.annotation.Retention; import java.text.Collator; -import java.util.BitSet; import java.util.Comparator; /** @@ -50,9 +48,6 @@ import java.util.Comparator; * in the implementation of Parcelable in subclasses. */ public class PackageItemInfo { - private static final int LINE_FEED_CODE_POINT = 10; - private static final int NBSP_CODE_POINT = 160; - /** The maximum length of a safe label, in characters */ private static final int MAX_SAFE_LABEL_LENGTH = 50000; @@ -60,45 +55,43 @@ public class PackageItemInfo { public static final float DEFAULT_MAX_LABEL_SIZE_PX = 500f; /** - * Flags for {@link #loadSafeLabel(PackageManager, float, int)} - * - * @hide - */ - @Retention(SOURCE) - @IntDef(flag = true, prefix = "SAFE_LABEL_FLAG_", - value = {SAFE_LABEL_FLAG_TRIM, SAFE_LABEL_FLAG_SINGLE_LINE, - SAFE_LABEL_FLAG_FIRST_LINE}) - public @interface SafeLabelFlags {} - - /** * Remove {@link Character#isWhitespace(int) whitespace} and non-breaking spaces from the edges * of the label. * * @see #loadSafeLabel(PackageManager, float, int) + * + * @deprecated Use {@link TextUtils#SAFE_STRING_FLAG_TRIM} instead * @hide */ + @Deprecated @SystemApi - public static final int SAFE_LABEL_FLAG_TRIM = 0x1; + public static final int SAFE_LABEL_FLAG_TRIM = SAFE_STRING_FLAG_TRIM; /** * Force entire string into single line of text (no newlines). Cannot be set at the same time as * {@link #SAFE_LABEL_FLAG_FIRST_LINE}. * * @see #loadSafeLabel(PackageManager, float, int) + * + * @deprecated Use {@link TextUtils#SAFE_STRING_FLAG_SINGLE_LINE} instead * @hide */ + @Deprecated @SystemApi - public static final int SAFE_LABEL_FLAG_SINGLE_LINE = 0x2; + public static final int SAFE_LABEL_FLAG_SINGLE_LINE = SAFE_STRING_FLAG_SINGLE_LINE; /** * Return only first line of text (truncate at first newline). Cannot be set at the same time as * {@link #SAFE_LABEL_FLAG_SINGLE_LINE}. * * @see #loadSafeLabel(PackageManager, float, int) + * + * @deprecated Use {@link TextUtils#SAFE_STRING_FLAG_FIRST_LINE} instead * @hide */ + @Deprecated @SystemApi - public static final int SAFE_LABEL_FLAG_FIRST_LINE = 0x4; + public static final int SAFE_LABEL_FLAG_FIRST_LINE = SAFE_STRING_FLAG_FIRST_LINE; private static volatile boolean sForceSafeLabels = false; @@ -199,8 +192,8 @@ public class PackageItemInfo { */ public @NonNull CharSequence loadLabel(@NonNull PackageManager pm) { if (sForceSafeLabels) { - return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_LABEL_FLAG_TRIM - | SAFE_LABEL_FLAG_FIRST_LINE); + return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_STRING_FLAG_TRIM + | SAFE_STRING_FLAG_FIRST_LINE); } else { return loadUnsafeLabel(pm); } @@ -223,16 +216,6 @@ public class PackageItemInfo { return packageName; } - private static boolean isNewline(int codePoint) { - int type = Character.getType(codePoint); - return type == Character.PARAGRAPH_SEPARATOR || type == Character.LINE_SEPARATOR - || codePoint == LINE_FEED_CODE_POINT; - } - - private static boolean isWhiteSpace(int codePoint) { - return Character.isWhitespace(codePoint) || codePoint == NBSP_CODE_POINT; - } - /** * @hide * @deprecated use loadSafeLabel(PackageManager, float, int) instead @@ -240,209 +223,24 @@ public class PackageItemInfo { @SystemApi @Deprecated public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm) { - return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_LABEL_FLAG_TRIM - | SAFE_LABEL_FLAG_FIRST_LINE); - } - - /** - * A special string manipulation class. Just records removals and executes the when onString() - * is called. - */ - private static class StringWithRemovedChars { - /** The original string */ - private final String mOriginal; - - /** - * One bit per char in string. If bit is set, character needs to be removed. If whole - * bit field is not initialized nothing needs to be removed. - */ - private BitSet mRemovedChars; - - StringWithRemovedChars(@NonNull String original) { - mOriginal = original; - } - - /** - * Mark all chars in a range {@code [firstRemoved - firstNonRemoved[} (not including - * firstNonRemoved) as removed. - */ - void removeRange(int firstRemoved, int firstNonRemoved) { - if (mRemovedChars == null) { - mRemovedChars = new BitSet(mOriginal.length()); - } - - mRemovedChars.set(firstRemoved, firstNonRemoved); - } - - /** - * Remove all characters before {@code firstNonRemoved}. - */ - void removeAllCharBefore(int firstNonRemoved) { - if (mRemovedChars == null) { - mRemovedChars = new BitSet(mOriginal.length()); - } - - mRemovedChars.set(0, firstNonRemoved); - } - - /** - * Remove all characters after and including {@code firstRemoved}. - */ - void removeAllCharAfter(int firstRemoved) { - if (mRemovedChars == null) { - mRemovedChars = new BitSet(mOriginal.length()); - } - - mRemovedChars.set(firstRemoved, mOriginal.length()); - } - - @Override - public String toString() { - // Common case, no chars removed - if (mRemovedChars == null) { - return mOriginal; - } - - StringBuilder sb = new StringBuilder(mOriginal.length()); - for (int i = 0; i < mOriginal.length(); i++) { - if (!mRemovedChars.get(i)) { - sb.append(mOriginal.charAt(i)); - } - } - - return sb.toString(); - } - - /** - * Return length or the original string - */ - int length() { - return mOriginal.length(); - } - - /** - * Return if a certain {@code offset} of the original string is removed - */ - boolean isRemoved(int offset) { - return mRemovedChars != null && mRemovedChars.get(offset); - } - - /** - * Return codePoint of original string at a certain {@code offset} - */ - int codePointAt(int offset) { - return mOriginal.codePointAt(offset); - } + return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_STRING_FLAG_TRIM + | SAFE_STRING_FLAG_FIRST_LINE); } /** - * Load, clean up and truncate label before use. - * - * <p>This method is meant to remove common mistakes and nefarious formatting from strings that - * are used in sensitive parts of the UI. - * - * <p>This method first treats the string like HTML and then ... - * <ul> - * <li>Removes new lines or truncates at first new line - * <li>Trims the white-space off the end - * <li>Truncates the string to a given length - * </ul> - * ... if specified. - * - * @param ellipsizeDip Assuming maximum length of the string (in dip), assuming font size 42. - * This is roughly 50 characters for {@code ellipsizeDip == 1000}.<br /> - * Usually ellipsizing should be left to the view showing the string. If a - * string is used as an input to another string, it might be useful to - * control the length of the input string though. {@code 0} disables this - * feature. - * @return The safe label + * Calls {@link TextUtils#makeSafeForPresentation} for the label of this item. + * + * <p>For parameters see {@link TextUtils#makeSafeForPresentation}. + * * @hide - */ + */ @SystemApi public @NonNull CharSequence loadSafeLabel(@NonNull PackageManager pm, - @FloatRange(from = 0) float ellipsizeDip, @SafeLabelFlags int flags) { - boolean onlyKeepFirstLine = ((flags & SAFE_LABEL_FLAG_FIRST_LINE) != 0); - boolean forceSingleLine = ((flags & SAFE_LABEL_FLAG_SINGLE_LINE) != 0); - boolean trim = ((flags & SAFE_LABEL_FLAG_TRIM) != 0); - + @FloatRange(from = 0) float ellipsizeDip, @TextUtils.SafeStringFlags int flags) { Preconditions.checkNotNull(pm); - Preconditions.checkArgument(ellipsizeDip >= 0); - Preconditions.checkFlagsArgument(flags, SAFE_LABEL_FLAG_TRIM | SAFE_LABEL_FLAG_SINGLE_LINE - | SAFE_LABEL_FLAG_FIRST_LINE); - Preconditions.checkArgument(!(onlyKeepFirstLine && forceSingleLine), - "Cannot set SAFE_LABEL_FLAG_SINGLE_LINE and SAFE_LABEL_FLAG_FIRST_LINE at the same " - + "time"); - - // loadLabel() always returns non-null - String label = loadUnsafeLabel(pm).toString(); - - // Treat string as HTML. This - // - converts HTML symbols: e.g. ß -> ß - // - applies some HTML tags: e.g. <br> -> \n - // - removes invalid characters such as \b - // - removes html styling, such as <b> - // - applies html formatting: e.g. a<p>b</p>c -> a\n\nb\n\nc - // - replaces some html tags by "object replacement" markers: <img> -> \ufffc - // - Removes leading white space - // - Removes all trailing white space beside a single space - // - Collapses double white space - StringWithRemovedChars labelStr = new StringWithRemovedChars( - Html.fromHtml(label).toString()); - - int firstNonWhiteSpace = -1; - int firstTrailingWhiteSpace = -1; - - // Remove new lines (if requested) and control characters. - int labelLength = labelStr.length(); - for (int offset = 0; offset < labelLength; ) { - int codePoint = labelStr.codePointAt(offset); - int type = Character.getType(codePoint); - int codePointLen = Character.charCount(codePoint); - boolean isNewline = isNewline(codePoint); - - if (offset > MAX_SAFE_LABEL_LENGTH || onlyKeepFirstLine && isNewline) { - labelStr.removeAllCharAfter(offset); - break; - } else if (forceSingleLine && isNewline) { - labelStr.removeRange(offset, offset + codePointLen); - } else if (type == Character.CONTROL && !isNewline) { - labelStr.removeRange(offset, offset + codePointLen); - } else if (trim && !isWhiteSpace(codePoint)) { - // This is only executed if the code point is not removed - if (firstNonWhiteSpace == -1) { - firstNonWhiteSpace = offset; - } - firstTrailingWhiteSpace = offset + codePointLen; - } - - offset += codePointLen; - } - - if (trim) { - // Remove leading and trailing white space - if (firstNonWhiteSpace == -1) { - // No non whitespace found, remove all - labelStr.removeAllCharAfter(0); - } else { - if (firstNonWhiteSpace > 0) { - labelStr.removeAllCharBefore(firstNonWhiteSpace); - } - if (firstTrailingWhiteSpace < labelLength) { - labelStr.removeAllCharAfter(firstTrailingWhiteSpace); - } - } - } - if (ellipsizeDip == 0) { - return labelStr.toString(); - } else { - // Truncate - final TextPaint paint = new TextPaint(); - paint.setTextSize(42); - - return TextUtils.ellipsize(labelStr.toString(), paint, ellipsizeDip, - TextUtils.TruncateAt.END); - } + return makeSafeForPresentation(loadUnsafeLabel(pm).toString(), MAX_SAFE_LABEL_LENGTH, + ellipsizeDip, flags); } /** diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java index 5f656207255a..384115b2d8f1 100644 --- a/core/java/android/os/GraphicsEnvironment.java +++ b/core/java/android/os/GraphicsEnvironment.java @@ -19,6 +19,7 @@ package android.os; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.res.AssetManager; import android.opengl.EGL14; import android.os.Build; import android.os.SystemProperties; @@ -27,7 +28,13 @@ import android.util.Log; import dalvik.system.VMRuntime; +import java.io.BufferedReader; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashSet; +import java.util.Set; /** @hide */ public class GraphicsEnvironment { @@ -44,6 +51,7 @@ public class GraphicsEnvironment { private static final boolean DEBUG = false; private static final String TAG = "GraphicsEnvironment"; private static final String PROPERTY_GFX_DRIVER = "ro.gfx.driver.0"; + private static final String PROPERTY_GFX_DRIVER_WHITELIST = "ro.gfx.driver.whitelist.0"; private static final String ANGLE_PACKAGE_NAME = "com.android.angle"; private static final String GLES_MODE_METADATA_KEY = "com.android.angle.GLES_MODE"; @@ -55,7 +63,7 @@ public class GraphicsEnvironment { * Set up GraphicsEnvironment */ public void setup(Context context, Bundle coreSettings) { - setupGpuLayers(context); + setupGpuLayers(context, coreSettings); setupAngle(context, coreSettings); chooseDriver(context); } @@ -81,27 +89,54 @@ public class GraphicsEnvironment { } /** + * Return the debug layer app's on-disk and in-APK lib directories + */ + private static String getDebugLayerAppPaths(Context context, String app) { + ApplicationInfo appInfo; + try { + appInfo = context.getPackageManager().getApplicationInfo( + app, PackageManager.MATCH_ALL); + } catch (PackageManager.NameNotFoundException e) { + Log.w(TAG, "Debug layer app '" + app + "' not installed"); + + return null; + } + + String abi = chooseAbi(appInfo); + + StringBuilder sb = new StringBuilder(); + sb.append(appInfo.nativeLibraryDir) + .append(File.pathSeparator); + sb.append(appInfo.sourceDir) + .append("!/lib/") + .append(abi); + String paths = sb.toString(); + + if (DEBUG) Log.v(TAG, "Debug layer app libs: " + paths); + + return paths; + } + + /** * Set up layer search paths for all apps * If debuggable, check for additional debug settings */ - private void setupGpuLayers(Context context) { + private void setupGpuLayers(Context context, Bundle coreSettings) { String layerPaths = ""; // Only enable additional debug functionality if the following conditions are met: - // 1. App is debuggable + // 1. App is debuggable or device is rooted // 2. ENABLE_GPU_DEBUG_LAYERS is true // 3. Package name is equal to GPU_DEBUG_APP - if (isDebuggable(context)) { + if (isDebuggable(context) || (getCanLoadSystemLibraries() == 1)) { - int enable = Settings.Global.getInt(context.getContentResolver(), - Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); + int enable = coreSettings.getInt(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, 0); if (enable != 0) { - String gpuDebugApp = Settings.Global.getString(context.getContentResolver(), - Settings.Global.GPU_DEBUG_APP); + String gpuDebugApp = coreSettings.getString(Settings.Global.GPU_DEBUG_APP); String packageName = context.getPackageName(); @@ -115,8 +150,22 @@ public class GraphicsEnvironment { // the layers specified by the app. layerPaths = mDebugLayerPath + ":"; - String layers = Settings.Global.getString(context.getContentResolver(), - Settings.Global.GPU_DEBUG_LAYERS); + + // If there is a debug layer app specified, add its path. + String gpuDebugLayerApp = + coreSettings.getString(Settings.Global.GPU_DEBUG_LAYER_APP); + + if (gpuDebugLayerApp != null && !gpuDebugLayerApp.isEmpty()) { + Log.i(TAG, "GPU debug layer app: " + gpuDebugLayerApp); + String paths = getDebugLayerAppPaths(context, gpuDebugLayerApp); + if (paths != null) { + // Append the path so files placed in the app's base directory will + // override the external path + layerPaths += paths + ":"; + } + } + + String layers = coreSettings.getString(Settings.Global.GPU_DEBUG_LAYERS); Log.i(TAG, "Debug layer list: " + layers); if (layers != null && !layers.isEmpty()) { @@ -221,6 +270,15 @@ public class GraphicsEnvironment { if (DEBUG) Log.v(TAG, "ignoring driver package for privileged/non-updated system app"); return; } + Set<String> whitelist = loadWhitelist(context, driverPackageName); + + // Empty whitelist implies no updatable graphics driver. Typically, the pre-installed + // updatable graphics driver is supposed to be a place holder and contains no graphics + // driver and whitelist. + if (whitelist == null || whitelist.isEmpty()) { + return; + } + ApplicationInfo driverInfo; try { driverInfo = context.getPackageManager().getApplicationInfo(driverPackageName, @@ -229,6 +287,22 @@ public class GraphicsEnvironment { Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); return; } + if (!whitelist.contains(context.getPackageName())) { + if (DEBUG) { + Log.w(TAG, context.getPackageName() + " is not on the whitelist."); + } + return; + } + + // O drivers are restricted to the sphal linker namespace, so don't try to use + // packages unless they declare they're compatible with that restriction. + if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) { + if (DEBUG) { + Log.w(TAG, "updated driver package is not known to be compatible with O"); + } + return; + } + String abi = chooseAbi(driverInfo); if (abi == null) { if (DEBUG) { @@ -239,12 +313,6 @@ public class GraphicsEnvironment { } return; } - if (driverInfo.targetSdkVersion < Build.VERSION_CODES.O) { - // O drivers are restricted to the sphal linker namespace, so don't try to use - // packages unless they declare they're compatible with that restriction. - Log.w(TAG, "updated driver package is not known to be compatible with O"); - return; - } StringBuilder sb = new StringBuilder(); sb.append(driverInfo.nativeLibraryDir) @@ -290,6 +358,35 @@ public class GraphicsEnvironment { return null; } + private static Set<String> loadWhitelist(Context context, String driverPackageName) { + String whitelistName = SystemProperties.get(PROPERTY_GFX_DRIVER_WHITELIST); + if (whitelistName == null || whitelistName.isEmpty()) { + return null; + } + try { + Context driverContext = context.createPackageContext(driverPackageName, + Context.CONTEXT_RESTRICTED); + AssetManager assets = driverContext.getAssets(); + InputStream stream = assets.open(whitelistName); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + Set<String> whitelist = new HashSet<>(); + for (String line; (line = reader.readLine()) != null; ) { + whitelist.add(line); + } + return whitelist; + } catch (PackageManager.NameNotFoundException e) { + if (DEBUG) { + Log.w(TAG, "driver package '" + driverPackageName + "' not installed"); + } + } catch (IOException e) { + if (DEBUG) { + Log.w(TAG, "Failed to load whitelist driver package, abort."); + } + } + return null; + } + + private static native int getCanLoadSystemLibraries(); private static native void setLayerPaths(ClassLoader classLoader, String layerPaths); private static native void setDebugLayers(String layers); private static native void setDriverPath(String path); diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl index 20ca19bc04aa..c9c42058bad0 100644 --- a/core/java/android/os/INetworkManagementService.aidl +++ b/core/java/android/os/INetworkManagementService.aidl @@ -388,10 +388,10 @@ interface INetworkManagementService /** * Setup a new physical network. - * @param permission null if no permissions required to access this network. PERMISSION_NETWORK - * or PERMISSION_SYSTEM to set respective permission. + * @param permission PERMISSION_NONE if no permissions required to access this network. + * PERMISSION_NETWORK or PERMISSION_SYSTEM to set respective permission. */ - void createPhysicalNetwork(int netId, String permission); + void createPhysicalNetwork(int netId, int permission); /** * Setup a new VPN. @@ -420,10 +420,10 @@ interface INetworkManagementService /** * Set permission for a network. - * @param permission null to clear permissions. PERMISSION_NETWORK or PERMISSION_SYSTEM to set - * permission. + * @param permission PERMISSION_NONE to clear permissions. + * PERMISSION_NETWORK or PERMISSION_SYSTEM to set permission. */ - void setNetworkPermission(int netId, String permission); + void setNetworkPermission(int netId, int permission); void setPermission(String permission, in int[] uids); void clearPermission(in int[] uids); diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index acb75778e08e..9caec12e7844 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -1473,12 +1473,13 @@ public final class Settings { * <p> If an user action is disabled by policy, this dialog can be triggered to let * the user know about this. * <p> - * Input: Nothing. + * Input: {@link Intent#EXTRA_USER}: The user of the admin. * <p> * Output: Nothing. * * @hide */ + // Intent#EXTRA_USER_ID can also be used @SystemApi @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) public static final String ACTION_SHOW_ADMIN_SUPPORT_DETAILS @@ -11631,6 +11632,12 @@ public final class Settings { public static final String GPU_DEBUG_LAYERS = "gpu_debug_layers"; /** + * Addition app for GPU layer discovery + * @hide + */ + public static final String GPU_DEBUG_LAYER_APP = "gpu_debug_layer_app"; + + /** * Control whether the process CPU usage meter should be shown. * * @deprecated This functionality is no longer available as of diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java index c748c87e0805..035b226fc724 100644 --- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java +++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java @@ -113,19 +113,6 @@ public final class KeyChainSnapshot implements Parcelable { } /** - * Public key used to encrypt {@code encryptedRecoveryKeyBlob}. - * - * See implementation for binary key format. - * - * @deprecated Use {@link #getTrustedHardwareCertPath} instead. - * @removed - */ - @Deprecated - public @NonNull byte[] getTrustedHardwarePublicKey() { - throw new UnsupportedOperationException(); - } - - /** * CertPath containing the public key used to encrypt {@code encryptedRecoveryKeyBlob}. */ public @NonNull CertPath getTrustedHardwareCertPath() { @@ -223,18 +210,6 @@ public final class KeyChainSnapshot implements Parcelable { } /** - * Sets public key used to encrypt recovery blob. - * - * @param publicKey The public key - * @return This builder. - * @removed Use {@link #setTrustedHardwareCertPath} instead. - */ - @Deprecated - public Builder setTrustedHardwarePublicKey(byte[] publicKey) { - throw new UnsupportedOperationException(); - } - - /** * Sets CertPath used to validate the trusted hardware public key. The CertPath should * contain a certificate of the trusted hardware public key and any necessary intermediate * certificates. diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java index 70054fc2d71e..31a5962c7e9a 100644 --- a/core/java/android/security/keystore/recovery/RecoveryController.java +++ b/core/java/android/security/keystore/recovery/RecoveryController.java @@ -23,7 +23,6 @@ import android.annotation.SystemApi; import android.app.KeyguardManager; import android.app.PendingIntent; import android.content.Context; -import android.content.pm.PackageManager.NameNotFoundException; import android.os.RemoteException; import android.os.ServiceManager; import android.os.ServiceSpecificException; @@ -301,18 +300,6 @@ public class RecoveryController { } /** - * @deprecated Use {@link #initRecoveryService(String, byte[], byte[])} instead. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public void initRecoveryService( - @NonNull String rootCertificateAlias, @NonNull byte[] signedPublicKeyList) - throws CertificateException, InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Initializes the recovery service for the calling application. The detailed steps should be: * <ol> * <li>Parse {@code signatureFile} to get relevant information. @@ -363,16 +350,6 @@ public class RecoveryController { } /** - * @deprecated Use {@link #getKeyChainSnapshot()} - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public @Nullable KeyChainSnapshot getRecoveryData() throws InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Returns data necessary to store all recoverable keys. Key material is * encrypted with user secret and recovery public key. * @@ -440,17 +417,6 @@ public class RecoveryController { } /** - * @deprecated Use {@link #getAliases()}. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public List<String> getAliases(@Nullable String packageName) - throws InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Returns a list of aliases of keys belonging to the application. */ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) @@ -466,18 +432,6 @@ public class RecoveryController { } /** - * @deprecated Use {@link #setRecoveryStatus(String, int)} - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public void setRecoveryStatus( - @NonNull String packageName, String alias, int status) - throws NameNotFoundException, InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Sets the recovery status for given key. It is used to notify the keystore that the key was * successfully stored on the server or that there was an error. An application can check this * value using {@link #getRecoveryStatus(String, String)}. @@ -501,17 +455,6 @@ public class RecoveryController { } /** - * @deprecated Use {@link #getRecoveryStatus(String)}. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public int getRecoveryStatus(String packageName, String alias) - throws InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Returns the recovery status for the key with the given {@code alias}. * * <ul> @@ -584,39 +527,6 @@ public class RecoveryController { } /** - * Deprecated. - * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable - * key store. Returns the raw material of the key. - * - * @param alias The key alias. - * @param account The account associated with the key - * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery - * service. - * @throws LockScreenRequiredException if the user has not set a lock screen. This is required - * to generate recoverable keys, as the snapshots are encrypted using a key derived from the - * lock screen. - * @deprecated Use {@link #generateKey(String)} - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public byte[] generateAndStoreKey(@NonNull String alias, byte[] account) - throws InternalRecoveryServiceException, LockScreenRequiredException { - throw new UnsupportedOperationException("Operation is not supported, use generateKey"); - } - - /** - * @deprecated Use {@link #generateKey(String)}. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public Key generateKey(@NonNull String alias, byte[] account) - throws InternalRecoveryServiceException, LockScreenRequiredException { - throw new UnsupportedOperationException(); - } - - /** * Generates a recoverable key with the given {@code alias}. * * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java index 3bb64219cdca..42e718268d2d 100644 --- a/core/java/android/security/keystore/recovery/RecoverySession.java +++ b/core/java/android/security/keystore/recovery/RecoverySession.java @@ -78,36 +78,6 @@ public class RecoverySession implements AutoCloseable { } /** - * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - @NonNull public byte[] start( - @NonNull byte[] verifierPublicKey, - @NonNull byte[] vaultParams, - @NonNull byte[] vaultChallenge, - @NonNull List<KeyChainProtectionParams> secrets) - throws CertificateException, InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** - * @deprecated Use {@link #start(String, CertPath, byte[], byte[], List)} instead. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - @NonNull public byte[] start( - @NonNull CertPath verifierCertPath, - @NonNull byte[] vaultParams, - @NonNull byte[] vaultChallenge, - @NonNull List<KeyChainProtectionParams> secrets) - throws CertificateException, InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Starts a recovery session and returns a blob with proof of recovery secret possession. * The method generates a symmetric key for a session, which trusted remote device can use to * return recovery key. @@ -162,20 +132,6 @@ public class RecoverySession implements AutoCloseable { } /** - * @deprecated Use {@link #recoverKeyChainSnapshot(byte[], List)} instead. - * @removed - */ - @Deprecated - @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE) - public Map<String, byte[]> recoverKeys( - @NonNull byte[] recoveryKeyBlob, - @NonNull List<WrappedApplicationKey> applicationKeys) - throws SessionExpiredException, DecryptionFailedException, - InternalRecoveryServiceException { - throw new UnsupportedOperationException(); - } - - /** * Imports key chain snapshot recovered from a remote vault. * * @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session. diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java index 187a671c57cb..ae4448f9c908 100644 --- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java +++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java @@ -75,15 +75,6 @@ public final class WrappedApplicationKey implements Parcelable { } /** - * @deprecated AOSP does not associate keys with accounts. This may be done by system app. - * @removed - */ - @Deprecated - public Builder setAccount(@NonNull byte[] account) { - throw new UnsupportedOperationException(); - } - - /** * Sets key material encrypted by recovery key. * * @param encryptedKeyMaterial The key material @@ -133,15 +124,6 @@ public final class WrappedApplicationKey implements Parcelable { return mEncryptedKeyMaterial; } - /** - * @deprecated AOSP does not associate keys with accounts. This may be done by system app. - * @removed - */ - @Deprecated - public @NonNull byte[] getAccount() { - throw new UnsupportedOperationException(); - } - public static final Parcelable.Creator<WrappedApplicationKey> CREATOR = new Parcelable.Creator<WrappedApplicationKey>() { public WrappedApplicationKey createFromParcel(Parcel in) { diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index ac7e57400f38..2cf0262a1d28 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -777,7 +777,7 @@ public class StaticLayout extends Layout { width += lineWidths[i]; } else { for (int j = (i == 0 ? 0 : breaks[i - 1]); j < breaks[i]; j++) { - width += measuredPara.getCharWidthAt(j - paraStart); + width += measuredPara.getCharWidthAt(j); } } hasTab |= hasTabs[i]; diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java index 439c2200b7cf..195de07d8595 100644 --- a/core/java/android/text/TextUtils.java +++ b/core/java/android/text/TextUtils.java @@ -16,7 +16,10 @@ package android.text; +import static java.lang.annotation.RetentionPolicy.SOURCE; + import android.annotation.FloatRange; +import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.Nullable; @@ -70,7 +73,9 @@ import com.android.internal.R; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Preconditions; +import java.lang.annotation.Retention; import java.lang.reflect.Array; +import java.util.BitSet; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -88,6 +93,44 @@ public class TextUtils { private static final String ELLIPSIS_NORMAL = "\u2026"; // HORIZONTAL ELLIPSIS (…) private static final String ELLIPSIS_TWO_DOTS = "\u2025"; // TWO DOT LEADER (‥) + private static final int LINE_FEED_CODE_POINT = 10; + private static final int NBSP_CODE_POINT = 160; + + /** + * Flags for {@link #makeSafeForPresentation(String, int, float, int)} + * + * @hide + */ + @Retention(SOURCE) + @IntDef(flag = true, prefix = "CLEAN_STRING_FLAG_", + value = {SAFE_STRING_FLAG_TRIM, SAFE_STRING_FLAG_SINGLE_LINE, + SAFE_STRING_FLAG_FIRST_LINE}) + public @interface SafeStringFlags {} + + /** + * Remove {@link Character#isWhitespace(int) whitespace} and non-breaking spaces from the edges + * of the label. + * + * @see #makeSafeForPresentation(String, int, float, int) + */ + public static final int SAFE_STRING_FLAG_TRIM = 0x1; + + /** + * Force entire string into single line of text (no newlines). Cannot be set at the same time as + * {@link #SAFE_STRING_FLAG_FIRST_LINE}. + * + * @see #makeSafeForPresentation(String, int, float, int) + */ + public static final int SAFE_STRING_FLAG_SINGLE_LINE = 0x2; + + /** + * Return only first line of text (truncate at first newline). Cannot be set at the same time as + * {@link #SAFE_STRING_FLAG_SINGLE_LINE}. + * + * @see #makeSafeForPresentation(String, int, float, int) + */ + public static final int SAFE_STRING_FLAG_FIRST_LINE = 0x4; + /** {@hide} */ @NonNull public static String getEllipsisString(@NonNull TextUtils.TruncateAt method) { @@ -2123,6 +2166,222 @@ public class TextUtils { return trimmed; } + private static boolean isNewline(int codePoint) { + int type = Character.getType(codePoint); + return type == Character.PARAGRAPH_SEPARATOR || type == Character.LINE_SEPARATOR + || codePoint == LINE_FEED_CODE_POINT; + } + + private static boolean isWhiteSpace(int codePoint) { + return Character.isWhitespace(codePoint) || codePoint == NBSP_CODE_POINT; + } + + /** + * Remove html, remove bad characters, and truncate string. + * + * <p>This method is meant to remove common mistakes and nefarious formatting from strings that + * were loaded from untrusted sources (such as other packages). + * + * <p>This method first {@link Html#fromHtml treats the string like HTML} and then ... + * <ul> + * <li>Removes new lines or truncates at first new line + * <li>Trims the white-space off the end + * <li>Truncates the string + * </ul> + * ... if specified. + * + * @param unclean The input string + * @param maxCharactersToConsider The maximum number of characters of {@code unclean} to + * consider from the input string. {@code 0} disables this + * feature. + * @param ellipsizeDip Assuming maximum length of the string (in dip), assuming font size 42. + * This is roughly 50 characters for {@code ellipsizeDip == 1000}.<br /> + * Usually ellipsizing should be left to the view showing the string. If a + * string is used as an input to another string, it might be useful to + * control the length of the input string though. {@code 0} disables this + * feature. + * @param flags Flags controlling cleaning behavior (Can be {@link #SAFE_STRING_FLAG_TRIM}, + * {@link #SAFE_STRING_FLAG_SINGLE_LINE}, + * and {@link #SAFE_STRING_FLAG_FIRST_LINE}) + * + * @return The cleaned string + */ + public static @NonNull CharSequence makeSafeForPresentation(@NonNull String unclean, + @IntRange(from = 0) int maxCharactersToConsider, + @FloatRange(from = 0) float ellipsizeDip, @SafeStringFlags int flags) { + boolean onlyKeepFirstLine = ((flags & SAFE_STRING_FLAG_FIRST_LINE) != 0); + boolean forceSingleLine = ((flags & SAFE_STRING_FLAG_SINGLE_LINE) != 0); + boolean trim = ((flags & SAFE_STRING_FLAG_TRIM) != 0); + + Preconditions.checkNotNull(unclean); + Preconditions.checkArgumentNonnegative(maxCharactersToConsider); + Preconditions.checkArgumentNonNegative(ellipsizeDip, "ellipsizeDip"); + Preconditions.checkFlagsArgument(flags, SAFE_STRING_FLAG_TRIM + | SAFE_STRING_FLAG_SINGLE_LINE | SAFE_STRING_FLAG_FIRST_LINE); + Preconditions.checkArgument(!(onlyKeepFirstLine && forceSingleLine), + "Cannot set SAFE_STRING_FLAG_SINGLE_LINE and SAFE_STRING_FLAG_FIRST_LINE at the" + + "same time"); + + String shortString; + if (maxCharactersToConsider > 0) { + shortString = unclean.substring(0, Math.min(unclean.length(), maxCharactersToConsider)); + } else { + shortString = unclean; + } + + // Treat string as HTML. This + // - converts HTML symbols: e.g. ß -> ß + // - applies some HTML tags: e.g. <br> -> \n + // - removes invalid characters such as \b + // - removes html styling, such as <b> + // - applies html formatting: e.g. a<p>b</p>c -> a\n\nb\n\nc + // - replaces some html tags by "object replacement" markers: <img> -> \ufffc + // - Removes leading white space + // - Removes all trailing white space beside a single space + // - Collapses double white space + StringWithRemovedChars gettingCleaned = new StringWithRemovedChars( + Html.fromHtml(shortString).toString()); + + int firstNonWhiteSpace = -1; + int firstTrailingWhiteSpace = -1; + + // Remove new lines (if requested) and control characters. + int uncleanLength = gettingCleaned.length(); + for (int offset = 0; offset < uncleanLength; ) { + int codePoint = gettingCleaned.codePointAt(offset); + int type = Character.getType(codePoint); + int codePointLen = Character.charCount(codePoint); + boolean isNewline = isNewline(codePoint); + + if (onlyKeepFirstLine && isNewline) { + gettingCleaned.removeAllCharAfter(offset); + break; + } else if (forceSingleLine && isNewline) { + gettingCleaned.removeRange(offset, offset + codePointLen); + } else if (type == Character.CONTROL && !isNewline) { + gettingCleaned.removeRange(offset, offset + codePointLen); + } else if (trim && !isWhiteSpace(codePoint)) { + // This is only executed if the code point is not removed + if (firstNonWhiteSpace == -1) { + firstNonWhiteSpace = offset; + } + firstTrailingWhiteSpace = offset + codePointLen; + } + + offset += codePointLen; + } + + if (trim) { + // Remove leading and trailing white space + if (firstNonWhiteSpace == -1) { + // No non whitespace found, remove all + gettingCleaned.removeAllCharAfter(0); + } else { + if (firstNonWhiteSpace > 0) { + gettingCleaned.removeAllCharBefore(firstNonWhiteSpace); + } + if (firstTrailingWhiteSpace < uncleanLength) { + gettingCleaned.removeAllCharAfter(firstTrailingWhiteSpace); + } + } + } + + if (ellipsizeDip == 0) { + return gettingCleaned.toString(); + } else { + // Truncate + final TextPaint paint = new TextPaint(); + paint.setTextSize(42); + + return TextUtils.ellipsize(gettingCleaned.toString(), paint, ellipsizeDip, + TextUtils.TruncateAt.END); + } + } + + /** + * A special string manipulation class. Just records removals and executes the when onString() + * is called. + */ + private static class StringWithRemovedChars { + /** The original string */ + private final String mOriginal; + + /** + * One bit per char in string. If bit is set, character needs to be removed. If whole + * bit field is not initialized nothing needs to be removed. + */ + private BitSet mRemovedChars; + + StringWithRemovedChars(@NonNull String original) { + mOriginal = original; + } + + /** + * Mark all chars in a range {@code [firstRemoved - firstNonRemoved[} (not including + * firstNonRemoved) as removed. + */ + void removeRange(int firstRemoved, int firstNonRemoved) { + if (mRemovedChars == null) { + mRemovedChars = new BitSet(mOriginal.length()); + } + + mRemovedChars.set(firstRemoved, firstNonRemoved); + } + + /** + * Remove all characters before {@code firstNonRemoved}. + */ + void removeAllCharBefore(int firstNonRemoved) { + if (mRemovedChars == null) { + mRemovedChars = new BitSet(mOriginal.length()); + } + + mRemovedChars.set(0, firstNonRemoved); + } + + /** + * Remove all characters after and including {@code firstRemoved}. + */ + void removeAllCharAfter(int firstRemoved) { + if (mRemovedChars == null) { + mRemovedChars = new BitSet(mOriginal.length()); + } + + mRemovedChars.set(firstRemoved, mOriginal.length()); + } + + @Override + public String toString() { + // Common case, no chars removed + if (mRemovedChars == null) { + return mOriginal; + } + + StringBuilder sb = new StringBuilder(mOriginal.length()); + for (int i = 0; i < mOriginal.length(); i++) { + if (!mRemovedChars.get(i)) { + sb.append(mOriginal.charAt(i)); + } + } + + return sb.toString(); + } + + /** + * Return length or the original string + */ + int length() { + return mOriginal.length(); + } + + /** + * Return codePoint of original string at a certain {@code offset} + */ + int codePointAt(int offset) { + return mOriginal.codePointAt(offset); + } + } + private static Object sLock = new Object(); private static char[] sTemp = null; diff --git a/core/java/android/util/proto/ProtoInputStream.java b/core/java/android/util/proto/ProtoInputStream.java index 209451bcfe6a..cd2b6ce3dc67 100644 --- a/core/java/android/util/proto/ProtoInputStream.java +++ b/core/java/android/util/proto/ProtoInputStream.java @@ -737,8 +737,7 @@ public final class ProtoInputStream extends ProtoStream { fillBuffer(); if (mOffset + n <= mEnd) { // fast path read. String is well within the current buffer - String value = StringFactory.newStringFromBytes(mBuffer, mOffset, n, - StandardCharsets.UTF_8); + String value = new String(mBuffer, mOffset, n, StandardCharsets.UTF_8); incOffset(n); return value; } else if (n <= mBufferSize) { @@ -752,14 +751,13 @@ public final class ProtoInputStream extends ProtoStream { mDiscardedBytes += mOffset; mOffset = 0; - String value = StringFactory.newStringFromBytes(mBuffer, mOffset, n, - StandardCharsets.UTF_8); + String value = new String(mBuffer, mOffset, n, StandardCharsets.UTF_8); incOffset(n); return value; } // Otherwise, the string is too large to use the buffer. Create the string from a // separate byte array. - return StringFactory.newStringFromBytes(readRawBytes(n), 0, n, StandardCharsets.UTF_8); + return new String(readRawBytes(n), 0, n, StandardCharsets.UTF_8); } /** diff --git a/core/java/com/android/internal/app/AssistUtils.java b/core/java/com/android/internal/app/AssistUtils.java index 0f8295ac5868..7c371cb18878 100644 --- a/core/java/com/android/internal/app/AssistUtils.java +++ b/core/java/com/android/internal/app/AssistUtils.java @@ -31,6 +31,8 @@ import android.os.ServiceManager; import android.provider.Settings; import android.util.Log; +import com.android.internal.R; + import java.util.ArrayList; import java.util.Set; @@ -42,6 +44,14 @@ public class AssistUtils { private static final String TAG = "AssistUtils"; + /** + * Sentinel value for "no default assistant specified." + * + * Empty string is already used to represent an explicit setting of No Assistant. null cannot + * be used because we can't represent a null value in XML. + */ + private static final String UNSET = "#+UNSET"; + private final Context mContext; private final IVoiceInteractionManagerService mVoiceInteractionManagerService; @@ -178,10 +188,21 @@ public class AssistUtils { return ComponentName.unflattenFromString(setting); } + final String defaultSetting = mContext.getResources().getString( + R.string.config_defaultAssistantComponentName); + if (defaultSetting != null && !defaultSetting.equals(UNSET)) { + return ComponentName.unflattenFromString(defaultSetting); + } + // Fallback to keep backward compatible behavior when there is no user setting. if (activeServiceSupportsAssistGesture()) { return getActiveServiceComponentName(); } + + if (UNSET.equals(defaultSetting)) { + return null; + } + final SearchManager searchManager = (SearchManager) mContext.getSystemService(Context.SEARCH_SERVICE); if (searchManager == null) { diff --git a/core/jni/android_os_GraphicsEnvironment.cpp b/core/jni/android_os_GraphicsEnvironment.cpp index b70485d9a0ea..92235ad494a7 100644 --- a/core/jni/android_os_GraphicsEnvironment.cpp +++ b/core/jni/android_os_GraphicsEnvironment.cpp @@ -23,6 +23,10 @@ namespace { +int getCanLoadSystemLibraries_native() { + return android::GraphicsEnv::getInstance().getCanLoadSystemLibraries(); +} + void setDriverPath(JNIEnv* env, jobject clazz, jstring path) { ScopedUtfChars pathChars(env, path); android::GraphicsEnv::getInstance().setDriverPath(pathChars.c_str()); @@ -51,6 +55,7 @@ void setDebugLayers_native(JNIEnv* env, jobject clazz, jstring layers) { } const JNINativeMethod g_methods[] = { + { "getCanLoadSystemLibraries", "()I", reinterpret_cast<void*>(getCanLoadSystemLibraries_native) }, { "setDriverPath", "(Ljava/lang/String;)V", reinterpret_cast<void*>(setDriverPath) }, { "setAngleInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V", reinterpret_cast<void*>(setAngleInfo_native) }, { "setLayerPaths", "(Ljava/lang/ClassLoader;Ljava/lang/String;)V", reinterpret_cast<void*>(setLayerPaths_native) }, diff --git a/core/proto/android/os/system_properties.proto b/core/proto/android/os/system_properties.proto index a41edf30f913..1f63be93fb94 100644 --- a/core/proto/android/os/system_properties.proto +++ b/core/proto/android/os/system_properties.proto @@ -512,7 +512,9 @@ message SystemPropertiesProto { optional int32 vts_coverage = 43; optional string zygote = 44; - // Next Tag: 45 + optional string gfx_driver_whitelist_0 = 45; + + // Next Tag: 46 } optional Ro ro = 21; diff --git a/core/proto/android/providers/settings/global.proto b/core/proto/android/providers/settings/global.proto index a02602ee5d99..47dbc0716c94 100644 --- a/core/proto/android/providers/settings/global.proto +++ b/core/proto/android/providers/settings/global.proto @@ -397,9 +397,10 @@ message GlobalSettingsProto { // Ordered GPU debug layer list // i.e. <layer1>:<layer2>:...:<layerN> optional SettingProto debug_layers = 2 [ (android.privacy).dest = DEST_AUTOMATIC ]; - // App will load ANGLE instead of native GLES drivers. optional SettingProto angle_enabled_app = 3; + // App that can provide layer libraries. + optional SettingProto debug_layer_app = 4; } optional Gpu gpu = 59; diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index cb97a2a7d7cd..e257a5cdae34 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -378,8 +378,8 @@ Values must be from NetworkCapabilities#NET_CAPABILITIES_* constants. [IP config] Optional. If empty or not specified - DHCP will be used, otherwise use the following format to specify static IP configuration: - ip=<ip-address/mask> gateway=<ip-address> dns=<comma-sep-ip-addresses> - domains=<comma-sep-domains> + ip=<ip-address/mask> gateway=<ip-address> dns=<comma-sep-ip-addresses> + domains=<comma-sep-domains> --> <string-array translatable="false" name="config_ethernet_interfaces"> <!-- @@ -697,6 +697,10 @@ <!-- Wifi driver supports IEEE80211AC for softap --> <bool translatable="false" name="config_wifi_softap_ieee80211ac_supported">false</bool> + <!-- Indicates that local-only hotspot should be brought up at 5GHz. This option is + for automotive builds only (the one that have PackageManager#FEATURE_AUTOMOTIVE) --> + <bool translatable="false" name="config_wifi_local_only_hotspot_5ghz">false</bool> + <!-- Flag indicating whether we should enable the automatic brightness. Software implementation will be used if config_hardware_auto_brightness_available is not set --> <bool name="config_automatic_brightness_available">false</bool> @@ -3553,4 +3557,8 @@ <!-- Whether or not the "SMS app service" feature is enabled --> <bool name="config_useSmsAppService">true</bool> + + <!-- Component name for default assistant on this device --> + <string name="config_defaultAssistantComponentName">#+UNSET</string> + </resources> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 09da4fcd3f4e..81a1bf874a14 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -1875,6 +1875,7 @@ <java-symbol type="bool" name="config_wifi_background_scan_support" /> <java-symbol type="bool" name="config_wifi_dual_band_support" /> <java-symbol type="bool" name="config_wifi_convert_apband_5ghz_to_any" /> + <java-symbol type="bool" name="config_wifi_local_only_hotspot_5ghz" /> <java-symbol type="bool" name="config_wifi_fast_bss_transition_enabled" /> <java-symbol type="bool" name="config_wimaxEnabled" /> <java-symbol type="bool" name="show_ongoing_ime_switcher" /> @@ -3480,4 +3481,6 @@ <java-symbol type="fraction" name="config_prescaleAbsoluteVolume_index3" /> <java-symbol type="bool" name="config_useSmsAppService" /> + + <java-symbol type="string" name="config_defaultAssistantComponentName" /> </resources> diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java index 60abd9468179..632c37fd54d2 100644 --- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java +++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java @@ -450,6 +450,7 @@ public class SettingsBackupTest { Settings.Global.GPU_DEBUG_APP, Settings.Global.GPU_DEBUG_LAYERS, Settings.Global.ANGLE_ENABLED_APP, + Settings.Global.GPU_DEBUG_LAYER_APP, Settings.Global.ENABLE_GNSS_RAW_MEAS_FULL_TRACKING, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT, Settings.Global.INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS, diff --git a/graphics/java/android/graphics/ColorSpace.java b/graphics/java/android/graphics/ColorSpace.java index b65fb9cd24ec..2e1d81a294e9 100644 --- a/graphics/java/android/graphics/ColorSpace.java +++ b/graphics/java/android/graphics/ColorSpace.java @@ -472,8 +472,8 @@ public abstract class ColorSpace { * <tr> * <td>Electro-optical transfer function (EOTF)</td> * <td colspan="4">\(\begin{equation} - * C_{linear} = \begin{cases}\frac{C_{DisplayP3}}{12.92} & C_{sRGB} \lt 0.039 \\\ - * \left( \frac{C_{DisplayP3} + 0.055}{1.055} \right) ^{2.4} & C_{sRGB} \ge 0.039 \end{cases} + * C_{linear} = \begin{cases}\frac{C_{DisplayP3}}{12.92} & C_{sRGB} \lt 0.04045 \\\ + * \left( \frac{C_{DisplayP3} + 0.055}{1.055} \right) ^{2.4} & C_{sRGB} \ge 0.04045 \end{cases} * \end{equation}\) * </td> * </tr> @@ -1484,7 +1484,7 @@ public abstract class ColorSpace { "Display P3", new float[] { 0.680f, 0.320f, 0.265f, 0.690f, 0.150f, 0.060f }, ILLUMINANT_D65, - new Rgb.TransferParameters(1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.039, 2.4), + new Rgb.TransferParameters(1 / 1.055, 0.055 / 1.055, 1 / 12.92, 0.04045, 2.4), Named.DISPLAY_P3.ordinal() ); sNamedColorSpaces[Named.NTSC_1953.ordinal()] = new ColorSpace.Rgb( diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java index 36e7028915f3..852e66e174ca 100644 --- a/graphics/java/android/graphics/text/MeasuredText.java +++ b/graphics/java/android/graphics/text/MeasuredText.java @@ -232,9 +232,7 @@ public class MeasuredText { * @throws IllegalStateException if this Builder is reused. */ public MeasuredText build() { - if (mNativePtr == 0) { - throw new IllegalStateException("Builder can not be reused."); - } + ensureNativePtrNoReuse(); try { long ptr = nBuildMeasuredText(mNativePtr, mText, mComputeHyphenation, mComputeLayout); @@ -247,6 +245,18 @@ public class MeasuredText { } } + /** + * Ensures {@link #mNativePtr} is not reused. + * + * <p/> This is a method by itself to help increase testability - eg. Robolectric might want + * to override the validation behavior in test environment. + */ + private void ensureNativePtrNoReuse() { + if (mNativePtr == 0) { + throw new IllegalStateException("Builder can not be reused."); + } + } + private static native /* Non Zero */ long nInitBuilder(); /** diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java index db6da8c590c3..e94413cd90fc 100644 --- a/media/java/android/media/MediaPlayer2.java +++ b/media/java/android/media/MediaPlayer2.java @@ -37,7 +37,6 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.concurrent.Executor; @@ -1025,50 +1024,6 @@ public abstract class MediaPlayer2 implements AutoCloseable public abstract MediaTimestamp getTimestamp(); /** - * Gets the media metadata. - * - * @param update_only controls whether the full set of available - * metadata is returned or just the set that changed since the - * last call. See {@see #METADATA_UPDATE_ONLY} and {@see - * #METADATA_ALL}. - * - * @param apply_filter if true only metadata that matches the - * filter is returned. See {@see #APPLY_METADATA_FILTER} and {@see - * #BYPASS_METADATA_FILTER}. - * - * @return The metadata, possibly empty. null if an error occured. - // FIXME: unhide. - * {@hide} - */ - public Metadata getMetadata(final boolean update_only, - final boolean apply_filter) { - return null; - } - - /** - * Set a filter for the metadata update notification and update - * retrieval. The caller provides 2 set of metadata keys, allowed - * and blocked. The blocked set always takes precedence over the - * allowed one. - * Metadata.MATCH_ALL and Metadata.MATCH_NONE are 2 sets available as - * shorthands to allow/block all or no metadata. - * - * By default, there is no filter set. - * - * @param allow Is the set of metadata the client is interested - * in receiving new notifications for. - * @param block Is the set of metadata the client is not interested - * in receiving new notifications for. - * @return The call status code. - * - // FIXME: unhide. - * {@hide} - */ - public int setMetadataFilter(Set<Integer> allow, Set<Integer> block) { - return 0; - } - - /** * Resets the MediaPlayer2 to its uninitialized state. After calling * this method, you will have to initialize it again by setting the * data source and calling prepare(). @@ -2266,38 +2221,4 @@ public abstract class MediaPlayer2 implements AutoCloseable public static final String ERROR_CODE = "android.media.mediaplayer.errcode"; } - - /** - Constant to retrieve only the new metadata since the last - call. - // FIXME: unhide. - // FIXME: add link to getMetadata(boolean, boolean) - {@hide} - */ - public static final boolean METADATA_UPDATE_ONLY = true; - - /** - Constant to retrieve all the metadata. - // FIXME: unhide. - // FIXME: add link to getMetadata(boolean, boolean) - {@hide} - */ - public static final boolean METADATA_ALL = false; - - /** - Constant to enable the metadata filter during retrieval. - // FIXME: unhide. - // FIXME: add link to getMetadata(boolean, boolean) - {@hide} - */ - public static final boolean APPLY_METADATA_FILTER = true; - - /** - Constant to disable the metadata filter during retrieval. - // FIXME: unhide. - // FIXME: add link to getMetadata(boolean, boolean) - {@hide} - */ - public static final boolean BYPASS_METADATA_FILTER = false; - } diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java index 5604ffd83deb..084b2049e30b 100644 --- a/media/java/android/media/MediaPlayer2Impl.java +++ b/media/java/android/media/MediaPlayer2Impl.java @@ -461,12 +461,12 @@ public final class MediaPlayer2Impl extends MediaPlayer2 { @Override void process() { mVolume = volume; - _setVolume(volume, volume); + _setVolume(volume); } }); } - private native void _setVolume(float leftVolume, float rightVolume); + private native void _setVolume(float volume); /** * Returns the current volume of this player to this player. diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp index b52da362beff..352df811d42f 100644 --- a/media/jni/android_media_MediaPlayer2.cpp +++ b/media/jni/android_media_MediaPlayer2.cpp @@ -974,15 +974,15 @@ android_media_MediaPlayer2_isLooping(JNIEnv *env, jobject thiz) } static void -android_media_MediaPlayer2_setVolume(JNIEnv *env, jobject thiz, jfloat leftVolume, jfloat rightVolume) +android_media_MediaPlayer2_setVolume(JNIEnv *env, jobject thiz, jfloat volume) { - ALOGV("setVolume: left %f right %f", (float) leftVolume, (float) rightVolume); + ALOGV("setVolume: volume %f", (float) volume); sp<MediaPlayer2> mp = getMediaPlayer(env, thiz); if (mp == NULL ) { jniThrowException(env, "java/lang/IllegalStateException", NULL); return; } - process_media_player_call( env, thiz, mp->setVolume((float) leftVolume, (float) rightVolume), NULL, NULL ); + process_media_player_call( env, thiz, mp->setVolume((float) volume), NULL, NULL ); } static jbyteArray @@ -1481,7 +1481,7 @@ static const JNINativeMethod gMethods[] = { {"getParameter", "(I)Ljava/lang/Object;", (void *)android_media_MediaPlayer2_getParameter}, {"setLooping", "(Z)V", (void *)android_media_MediaPlayer2_setLooping}, {"isLooping", "()Z", (void *)android_media_MediaPlayer2_isLooping}, - {"_setVolume", "(FF)V", (void *)android_media_MediaPlayer2_setVolume}, + {"_setVolume", "(F)V", (void *)android_media_MediaPlayer2_setVolume}, {"_invoke", "([B)[B", (void *)android_media_MediaPlayer2_invoke}, {"native_init", "()V", (void *)android_media_MediaPlayer2_native_init}, {"native_setup", "(Ljava/lang/Object;)V", (void *)android_media_MediaPlayer2_native_setup}, diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index 8fed367f3773..f2de9ecd8f5d 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -54,9 +54,14 @@ public class InstallStart extends Activity { Intent intent = getIntent(); String callingPackage = getCallingPackage(); + final boolean isSessionInstall = + PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction()); + // If the activity was started via a PackageInstaller session, we retrieve the calling // package from that session - int sessionId = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1); + final int sessionId = (isSessionInstall + ? intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1) + : -1); if (callingPackage == null && sessionId != -1) { PackageInstaller packageInstaller = getPackageManager().getPackageInstaller(); PackageInstaller.SessionInfo sessionInfo = packageInstaller.getSessionInfo(sessionId); @@ -99,7 +104,7 @@ public class InstallStart extends Activity { nextActivity.putExtra(PackageInstallerActivity.EXTRA_ORIGINAL_SOURCE_INFO, sourceInfo); nextActivity.putExtra(Intent.EXTRA_ORIGINATING_UID, originatingUid); - if (PackageInstaller.ACTION_CONFIRM_INSTALL.equals(intent.getAction())) { + if (isSessionInstall) { nextActivity.setClass(this, PackageInstallerActivity.class); } else { Uri packageUri = intent.getData(); diff --git a/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java b/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java index e278c10a2c59..8529e3ef8420 100644 --- a/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java +++ b/packages/SettingsLib/RestrictedLockUtils/src/com/android/settingslib/RestrictedLockUtils.java @@ -80,11 +80,10 @@ public class RestrictedLockUtils { if (admin.component != null) { intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, admin.component); } - int adminUserId = UserHandle.myUserId(); - if (admin.user != null) { - adminUserId = admin.user.getIdentifier(); - } - intent.putExtra(Intent.EXTRA_USER_ID, adminUserId); + final UserHandle adminUser = admin.user != null + ? admin.user + : UserHandle.of(UserHandle.myUserId()); + intent.putExtra(Intent.EXTRA_USER, adminUser); } return intent; } diff --git a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml index af30425a511c..cbebbb32dc89 100644 --- a/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml +++ b/packages/SettingsLib/SettingsSpinner/res/drawable/settings_spinner_background.xml @@ -18,11 +18,14 @@ <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:paddingMode="stack"> <item> - <shape> + <shape + android:tint="?android:attr/colorForeground"> <corners android:radius="20dp"/> + <solid + android:color="@android:color/transparent"/> <stroke - android:color="?android:attr/textColorSecondary" + android:color="#1f000000" android:width="1dp"/> <size android:height="32dp"/> diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java index 8745a330311a..da1354be63d2 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java @@ -662,6 +662,9 @@ class SettingsProtoDumpUtil { dumpSetting(s, p, Settings.Global.ANGLE_ENABLED_APP, GlobalSettingsProto.Gpu.ANGLE_ENABLED_APP); + dumpSetting(s, p, + Settings.Global.GPU_DEBUG_LAYER_APP, + GlobalSettingsProto.Gpu.DEBUG_LAYER_APP); p.end(gpuToken); final long hdmiToken = p.start(GlobalSettingsProto.HDMI); diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java index 95569dc6d1b7..572a92452291 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderTest.java @@ -645,7 +645,7 @@ public class SettingsProviderTest extends BaseSettingsProviderTest { return; } final long elapsedTimeMillis = SystemClock.uptimeMillis() - startTimeMillis; - if (elapsedTimeMillis > WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS) { + if (elapsedTimeMillis >= WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS) { fail("Could not change setting for " + WAIT_FOR_SETTING_URI_CHANGE_TIMEOUT_MILLIS + " ms"); } diff --git a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java index d351c4f3e3e6..1bf87506ab0c 100644 --- a/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java +++ b/packages/SystemUI/src/com/android/systemui/OverviewProxyService.java @@ -259,6 +259,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis @Override public void onServiceConnected(ComponentName name, IBinder service) { mHandler.removeCallbacks(mDeferredConnectionCallback); + mCurrentBoundedUserId = mDeviceProvisionedController.getCurrentUser(); mConnectionBackoffAttempts = 0; mOverviewProxy = IOverviewProxy.Stub.asInterface(service); // Listen for launcher's death @@ -269,7 +270,6 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis } try { mOverviewProxy.onBind(mSysUiProxy); - mCurrentBoundedUserId = mDeviceProvisionedController.getCurrentUser(); } catch (RemoteException e) { mCurrentBoundedUserId = -1; Log.e(TAG_OPS, "Failed to call onBind()", e); diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java index 774567ef8bb1..95029c013ab6 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java @@ -26,6 +26,10 @@ import com.android.systemui.shared.plugins.PluginManagerImpl; public class PluginInitializerImpl implements PluginInitializer { + /** + * True if WTFs should lead to crashes + */ + private static final boolean WTFS_SHOULD_CRASH = false; private boolean mWtfsSet; @Override @@ -52,7 +56,7 @@ public class PluginInitializerImpl implements PluginInitializer { @Override public void handleWtfs() { - if (!mWtfsSet) { + if (WTFS_SHOULD_CRASH && !mWtfsSet) { mWtfsSet = true; Log.setWtfHandler(new Log.TerribleFailureHandler() { @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 4810b0b91c10..7abac0054e5d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -556,14 +556,15 @@ public class VolumeDialogImpl implements VolumeDialog { mHandler.removeMessages(H.SHOW); mHandler.removeMessages(H.DISMISS); rescheduleTimeoutH(); - mShowing = true; if (mConfigChanged) { - initDialog(); + initDialog(); // resets mShowing to false mConfigurableTexts.update(); mConfigChanged = false; } + initSettingsH(); + mShowing = true; mDialog.show(); Events.writeEvent(mContext, Events.EVENT_SHOW_DIALOG, reason, mKeyguard.isKeyguardLocked()); mController.notifyVisible(true); diff --git a/services/art-profile b/services/art-profile index 328f8f7a37a7..4168a3f4b28c 100644 --- a/services/art-profile +++ b/services/art-profile @@ -207,7 +207,7 @@ HPLandroid/hardware/weaver/V1_0/IWeaver;->read(ILjava/util/ArrayList;Landroid/ha HPLandroid/hardware/weaver/V1_0/IWeaver;->setHALInstrumentation()V HPLandroid/hardware/weaver/V1_0/IWeaver;->unlinkToDeath(Landroid/os/IHwBinder$DeathRecipient;)Z HPLandroid/hardware/weaver/V1_0/IWeaver;->write(ILjava/util/ArrayList;Ljava/util/ArrayList;)I -HPLandroid/media/IMediaExtractorUpdateService;->loadPlugins(Ljava/lang/String;)V +HPLandroid/media/IMediaUpdateService;->loadPlugins(Ljava/lang/String;)V HPLandroid/net/apf/ApfGenerator$Instruction;-><init>(Landroid/net/apf/ApfGenerator;Landroid/net/apf/ApfGenerator$Opcodes;Landroid/net/apf/ApfGenerator$Register;)V HPLandroid/net/apf/ApfGenerator$Instruction;->calculateImmSize(IZ)B HPLandroid/net/apf/ApfGenerator$Instruction;->calculateTargetLabelOffset()I @@ -3977,9 +3977,9 @@ PLandroid/hardware/weaver/V1_0/WeaverConfig;->readFromParcel(Landroid/os/HwParce PLandroid/hardware/weaver/V1_0/WeaverReadResponse;-><init>()V PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readEmbeddedFromParcel(Landroid/os/HwParcel;Landroid/os/HwBlob;J)V PLandroid/hardware/weaver/V1_0/WeaverReadResponse;->readFromParcel(Landroid/os/HwParcel;)V -PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V -PLandroid/media/IMediaExtractorUpdateService$Stub$Proxy;->loadPlugins(Ljava/lang/String;)V -PLandroid/media/IMediaExtractorUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaExtractorUpdateService; +PLandroid/media/IMediaUpdateService$Stub$Proxy;-><init>(Landroid/os/IBinder;)V +PLandroid/media/IMediaUpdateService$Stub$Proxy;->loadPlugins(Ljava/lang/String;)V +PLandroid/media/IMediaUpdateService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/media/IMediaExtractorUpdateService; PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;-><init>()V PLandroid/net/apf/-$$Lambda$ApfFilter$UV1wDVoVlbcxpr8zevj_aMFtUGw;->applyAsInt(Ljava/lang/Object;)I PLandroid/net/apf/ApfCapabilities;-><init>(III)V diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java index af33bd02c745..d3842b74990c 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java @@ -182,9 +182,7 @@ public final class AutofillManagerService extends SystemService { final int userId = users.get(i).id; final boolean disabled = umi.getUserRestriction(userId, UserManager.DISALLOW_AUTOFILL); if (disabled) { - if (disabled) { - Slog.i(TAG, "Disabling Autofill for user " + userId); - } + Slog.i(TAG, "Disabling Autofill for user " + userId); mDisabledUsers.put(userId, disabled); } } diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java index 78facf84b03c..14d68cb853d6 100644 --- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java +++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java @@ -185,23 +185,6 @@ final class AutofillManagerServiceImpl { updateLocked(disabled); } - @Nullable - CharSequence getServiceName() { - final String packageName = getServicePackageName(); - if (packageName == null) { - return null; - } - - try { - final PackageManager pm = mContext.getPackageManager(); - final ApplicationInfo info = pm.getApplicationInfo(packageName, 0); - return pm.getApplicationLabel(info); - } catch (Exception e) { - Slog.e(TAG, "Could not get label for " + packageName + ": " + e); - return packageName; - } - } - @GuardedBy("mLock") private int getServiceUidLocked() { if (mInfo == null) { @@ -226,6 +209,7 @@ final class AutofillManagerServiceImpl { return null; } + @Nullable ComponentName getServiceComponentName() { synchronized (mLock) { if (mInfo == null) { @@ -706,17 +690,27 @@ final class AutofillManagerServiceImpl { } } - @NonNull - CharSequence getServiceLabel() { - final CharSequence label = mInfo.getServiceInfo().loadSafeLabel( + /** + * Gets the user-visibile name of the service this service binds to, or {@code null} if the + * service is disabled. + */ + @Nullable + @GuardedBy("mLock") + public CharSequence getServiceLabelLocked() { + return mInfo == null ? null : mInfo.getServiceInfo().loadSafeLabel( mContext.getPackageManager(), 0 /* do not ellipsize */, PackageItemInfo.SAFE_LABEL_FLAG_FIRST_LINE | PackageItemInfo.SAFE_LABEL_FLAG_TRIM); - return label; } + /** + * Gets the icon of the service this service binds to, or {@code null} if the service is + * disabled. + */ @NonNull - Drawable getServiceIcon() { - return mInfo.getServiceInfo().loadIcon(mContext.getPackageManager()); + @Nullable + @GuardedBy("mLock") + Drawable getServiceIconLocked() { + return mInfo == null ? null : mInfo.getServiceInfo().loadIcon(mContext.getPackageManager()); } /** @@ -959,7 +953,7 @@ final class AutofillManagerServiceImpl { } else { pw.println(); mInfo.dump(prefix2, pw); - pw.print(prefix); pw.print("Service Label: "); pw.println(getServiceLabel()); + pw.print(prefix); pw.print("Service Label: "); pw.println(getServiceLabelLocked()); pw.print(prefix); pw.print("Target SDK: "); pw.println(getTargedSdkLocked()); } pw.print(prefix); pw.print("Component from settings: "); diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index c1b620c657b3..30d14e689ddd 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -48,6 +48,7 @@ import android.content.Intent; import android.content.IntentSender; import android.graphics.Bitmap; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.metrics.LogMaker; import android.os.Binder; import android.os.Build; @@ -1749,7 +1750,18 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState final IAutoFillManagerClient client = getClient(); mPendingSaveUi = new PendingUi(mActivityToken, id, client); - getUiForShowing().showSaveUi(mService.getServiceLabel(), mService.getServiceIcon(), + + final CharSequence serviceLabel; + final Drawable serviceIcon; + synchronized (mLock) { + serviceLabel = mService.getServiceLabelLocked(); + serviceIcon = mService.getServiceIconLocked(); + } + if (serviceLabel == null || serviceIcon == null) { + wtf(null, "showSaveLocked(): no service label or icon"); + return true; + } + getUiForShowing().showSaveUi(serviceLabel, serviceIcon, mService.getServicePackageName(), saveInfo, this, mComponentName, this, mPendingSaveUi, isUpdate, mCompatMode); if (client != null) { @@ -2318,9 +2330,19 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState filterText = value.getTextValue().toString(); } + final CharSequence serviceLabel; + final Drawable serviceIcon; + synchronized (mLock) { + serviceLabel = mService.getServiceLabelLocked(); + serviceIcon = mService.getServiceIconLocked(); + } + if (serviceLabel == null || serviceIcon == null) { + wtf(null, "onFillReady(): no service label or icon"); + return; + } getUiForShowing().showFillUi(filledId, response, filterText, mService.getServicePackageName(), mComponentName, - mService.getServiceLabel(), mService.getServiceIcon(), this, id, mCompatMode); + serviceLabel, serviceIcon, this, id, mCompatMode); synchronized (mLock) { if (mUiShownTime == 0) { @@ -2655,12 +2677,6 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } - CharSequence getServiceName() { - synchronized (mLock) { - return mService.getServiceName(); - } - } - // TODO: this should never be null, but we got at least one occurrence, probably due to a race. @GuardedBy("mLock") @Nullable diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java index a8dae03e4c12..49778f5d19f3 100644 --- a/services/autofill/java/com/android/server/autofill/ViewState.java +++ b/services/autofill/java/com/android/server/autofill/ViewState.java @@ -141,10 +141,6 @@ final class ViewState { mResponse = response; } - CharSequence getServiceName() { - return mSession.getServiceName(); - } - int getState() { return mState; } diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java index 1b97926d39fb..eb31e782eb33 100644 --- a/services/backup/java/com/android/server/backup/BackupManagerService.java +++ b/services/backup/java/com/android/server/backup/BackupManagerService.java @@ -159,7 +159,7 @@ import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicInteger; -public class BackupManagerService implements BackupManagerServiceInterface { +public class BackupManagerService { public static final String TAG = "BackupManagerService"; public static final boolean DEBUG = true; @@ -701,7 +701,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Utility: build a new random integer token. The low bits are the ordinal of the // operation for near-time uniqueness, and the upper bits are random for app- // side unpredictability. - @Override public int generateRandomIntegerToken() { int token = mTokenGenerator.nextInt(); if (token < 0) token = -token; @@ -1108,12 +1107,10 @@ public class BackupManagerService implements BackupManagerServiceInterface { return array; } - @Override public boolean setBackupPassword(String currentPw, String newPw) { return mBackupPasswordManager.setBackupPassword(currentPw, newPw); } - @Override public boolean hasBackupPassword() { return mBackupPasswordManager.hasBackupPassword(); } @@ -1590,7 +1587,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Get the restore-set token for the best-available restore set for this package: // the active set if possible, else the ancestral one. Returns zero if none available. - @Override public long getAvailableRestoreToken(String packageName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getAvailableRestoreToken"); @@ -1608,12 +1604,10 @@ public class BackupManagerService implements BackupManagerServiceInterface { return token; } - @Override public int requestBackup(String[] packages, IBackupObserver observer, int flags) { return requestBackup(packages, observer, null, flags); } - @Override public int requestBackup(String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "requestBackup"); @@ -1702,7 +1696,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Cancel all running backups. - @Override public void cancelBackups() { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "cancelBackups"); if (MORE_DEBUG) { @@ -1732,7 +1725,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public void prepareOperationTimeout(int token, long interval, BackupRestoreTask callback, int operationType) { if (operationType != OP_TYPE_BACKUP_WAIT && operationType != OP_TYPE_RESTORE_WAIT) { @@ -1790,7 +1782,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // synchronous waiter case - @Override public boolean waitUntilOperationComplete(int token) { if (MORE_DEBUG) { Slog.i(TAG, "Blocking until operation complete for " @@ -1895,7 +1886,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } - @Override public void tearDownAgentAndKill(ApplicationInfo app) { if (app == null) { // Null means the system package, so just quietly move on. :) @@ -2049,7 +2039,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { * @return Whether ongoing work will continue. The return value here will be passed * along as the return value to the scheduled job's onStartJob() callback. */ - @Override public boolean beginFullBackup(FullBackupJob scheduledJob) { final long now = System.currentTimeMillis(); final long fullBackupInterval; @@ -2224,7 +2213,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // The job scheduler says our constraints don't hold any more, // so tear down any ongoing backup task right away. - @Override public void endFullBackup() { // offload the mRunningFullBackupTask.handleCancel() call to another thread, // as we might have to wait for mCancelLock @@ -2331,7 +2319,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // ----- IBackupManager binder interface ----- - @Override public void dataChanged(final String packageName) { final int callingUserHandle = UserHandle.getCallingUserId(); if (callingUserHandle != UserHandle.USER_SYSTEM) { @@ -2362,7 +2349,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Run an initialize operation for the given transport - @Override public void initializeTransports(String[] transportNames, IBackupObserver observer) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "initializeTransport"); @@ -2382,7 +2368,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Clear the given package's backup data from the current transport - @Override public void clearBackupData(String transportName, String packageName) { if (DEBUG) Slog.v(TAG, "clearBackupData() of " + packageName + " on " + transportName); PackageInfo info; @@ -2438,7 +2423,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Run a backup pass immediately for any applications that have declared // that they have pending updates. - @Override public void backupNow() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "backupNow"); @@ -2480,7 +2464,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // // This is the variant used by 'adb backup'; it requires on-screen confirmation // by the user because it can be used to offload data over untrusted USB. - @Override public void adbBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeObbs, boolean includeShared, boolean doWidgets, boolean doAllApps, boolean includeSystem, boolean compress, boolean doKeyValue, String[] pkgList) { @@ -2558,7 +2541,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public void fullTransportBackup(String[] pkgNames) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "fullTransportBackup"); @@ -2618,7 +2600,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public void adbRestore(ParcelFileDescriptor fd) { mContext.enforceCallingPermission(android.Manifest.permission.BACKUP, "adbRestore"); @@ -2719,7 +2700,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Confirm that the previously-requested full backup/restore operation can proceed. This // is used to require a user-facing disclosure about the operation. - @Override public void acknowledgeAdbBackupOrRestore(int token, boolean allow, String curPassword, String encPpassword, IFullBackupRestoreObserver observer) { if (DEBUG) { @@ -2819,7 +2799,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Enable/disable backups - @Override public void setBackupEnabled(boolean enable) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupEnabled"); @@ -2887,7 +2866,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Enable/disable automatic restore of app data at install time - @Override public void setAutoRestore(boolean doAutoRestore) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setAutoRestore"); @@ -2907,7 +2885,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Mark the backup service as having been provisioned - @Override public void setBackupProvisioned(boolean available) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "setBackupProvisioned"); @@ -2917,7 +2894,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Report whether the backup mechanism is currently enabled - @Override public boolean isBackupEnabled() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "isBackupEnabled"); @@ -2925,7 +2901,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Report the name of the currently active transport - @Override public String getCurrentTransport() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getCurrentTransport"); @@ -2938,7 +2913,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { * Returns the {@link ComponentName} of the host service of the selected transport or {@code * null} if no transport selected or if the transport selected is not registered. */ - @Override @Nullable public ComponentName getCurrentTransportComponent() { mContext.enforceCallingOrSelfPermission( @@ -2954,7 +2928,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Report all known, available backup transports - @Override public String[] listAllTransports() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "listAllTransports"); @@ -2962,14 +2935,12 @@ public class BackupManagerService implements BackupManagerServiceInterface { return mTransportManager.getRegisteredTransportNames(); } - @Override public ComponentName[] listAllTransportComponents() { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "listAllTransportComponents"); return mTransportManager.getRegisteredTransportComponents(); } - @Override public String[] getTransportWhitelist() { // No permission check, intentionally. Set<ComponentName> whitelistedComponents = mTransportManager.getTransportWhitelist(); @@ -3006,7 +2977,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { * @throws SecurityException If the UID of the calling process differs from the package UID of * {@code transportComponent} or if the caller does NOT have BACKUP permission. */ - @Override public void updateTransportAttributes( ComponentName transportComponent, String name, @@ -3070,7 +3040,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } /** Selects transport {@code transportName} and returns previous selected transport. */ - @Override @Deprecated @Nullable public String selectBackupTransport(String transportName) { @@ -3089,7 +3058,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public void selectBackupTransportAsync( ComponentName transportComponent, ISelectBackupTransportCallback listener) { mContext.enforceCallingOrSelfPermission( @@ -3161,7 +3129,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Supply the configuration Intent for the given transport. If the name is not one // of the available transports, or if the transport does not supply any configuration // UI, the method returns null. - @Override public Intent getConfigurationIntent(String transportName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getConfigurationIntent"); @@ -3186,7 +3153,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { * @param transportName The name of the registered transport. * @return The current destination string or null if the transport is not registered. */ - @Override public String getDestinationString(String transportName) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "getDestinationString"); @@ -3204,7 +3170,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Supply the manage-data intent for the given transport. - @Override public Intent getDataManagementIntent(String transportName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getDataManagementIntent"); @@ -3223,7 +3188,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Supply the menu label for affordances that fire the manage-data intent // for the given transport. - @Override public String getDataManagementLabel(String transportName) { mContext.enforceCallingOrSelfPermission(android.Manifest.permission.BACKUP, "getDataManagementLabel"); @@ -3242,7 +3206,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Callback: a requested backup agent has been instantiated. This should only // be called from the Activity Manager. - @Override public void agentConnected(String packageName, IBinder agentBinder) { synchronized (mAgentConnectLock) { if (Binder.getCallingUid() == Process.SYSTEM_UID) { @@ -3261,7 +3224,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Callback: a backup agent has failed to come up, or has unexpectedly quit. // If the agent failed to come up in the first place, the agentBinder argument // will be null. This should only be called from the Activity Manager. - @Override public void agentDisconnected(String packageName) { // TODO: handle backup being interrupted synchronized (mAgentConnectLock) { @@ -3278,7 +3240,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // An application being installed will need a restore pass, then the Package Manager // will need to be told when the restore is finished. - @Override public void restoreAtInstall(String packageName, int token) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { Slog.w(TAG, "Non-system process uid=" + Binder.getCallingUid() @@ -3364,7 +3325,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } // Hand off a restore session - @Override public IRestoreSession beginRestoreSession(String packageName, String transport) { if (DEBUG) { Slog.v(TAG, "beginRestoreSession: pkg=" + packageName @@ -3430,7 +3390,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { // Note that a currently-active backup agent has notified us that it has // completed the given outstanding asynchronous backup/restore operation. - @Override public void opComplete(int token, long result) { if (MORE_DEBUG) { Slog.v(TAG, "opComplete: " + Integer.toHexString(token) + " result=" + result); @@ -3468,7 +3427,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public boolean isAppEligibleForBackup(String packageName) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "isAppEligibleForBackup"); @@ -3490,7 +3448,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public String[] filterAppsEligibleForBackup(String[] packages) { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BACKUP, "filterAppsEligibleForBackup"); @@ -3517,7 +3474,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } } - @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; @@ -3667,7 +3623,6 @@ public class BackupManagerService implements BackupManagerServiceInterface { } - @Override public IBackupManager getBackupManagerBinder() { return mBackupManagerBinder; } diff --git a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java b/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java deleted file mode 100644 index a38a0e9918d2..000000000000 --- a/services/backup/java/com/android/server/backup/BackupManagerServiceInterface.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2017 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.backup; - -import android.annotation.Nullable; -import android.app.IBackupAgent; -import android.app.backup.IBackupManager; -import android.app.backup.IBackupManagerMonitor; -import android.app.backup.IBackupObserver; -import android.app.backup.IFullBackupRestoreObserver; -import android.app.backup.IRestoreSession; -import android.app.backup.ISelectBackupTransportCallback; -import android.content.ComponentName; -import android.content.Intent; -import android.content.pm.ApplicationInfo; -import android.os.IBinder; -import android.os.ParcelFileDescriptor; -import java.io.FileDescriptor; -import java.io.PrintWriter; - -/** - * Interface for BackupManagerService. - * - * Current and future implementations of BackupManagerService should use this interface, so that - * Trampoline is able to switch between them. - */ -public interface BackupManagerServiceInterface { - - void unlockSystemUser(); - - // Utility: build a new random integer token - int generateRandomIntegerToken(); - - boolean setBackupPassword(String currentPw, String newPw); - - boolean hasBackupPassword(); - - // Get the restore-set token for the best-available restore set for this package: - // the active set if possible, else the ancestral one. Returns zero if none available. - long getAvailableRestoreToken(String packageName); - - int requestBackup(String[] packages, IBackupObserver observer, int flags); - - int requestBackup(String[] packages, IBackupObserver observer, - IBackupManagerMonitor monitor, int flags); - - // Cancel all running backups. - void cancelBackups(); - - void prepareOperationTimeout(int token, long interval, BackupRestoreTask callback, - int operationType); - - // synchronous waiter case - boolean waitUntilOperationComplete(int token); - - void tearDownAgentAndKill(ApplicationInfo app); - - boolean beginFullBackup(FullBackupJob scheduledJob); - - // The job scheduler says our constraints don't hold any more, - // so tear down any ongoing backup task right away. - void endFullBackup(); - - void dataChanged(String packageName); - - // Initialize the given transport - void initializeTransports(String[] transportName, IBackupObserver observer); - - // Clear the given package's backup data from the current transport - void clearBackupData(String transportName, String packageName); - - // Run a backup pass immediately for any applications that have declared - // that they have pending updates. - void backupNow(); - - // Run a backup pass for the given packages, writing the resulting data stream - // to the supplied file descriptor. This method is synchronous and does not return - // to the caller until the backup has been completed. - // - // This is the variant used by 'adb backup'; it requires on-screen confirmation - // by the user because it can be used to offload data over untrusted USB. - void adbBackup(ParcelFileDescriptor fd, boolean includeApks, boolean includeObbs, - boolean includeShared, boolean doWidgets, boolean doAllApps, boolean includeSystem, - boolean compress, boolean doKeyValue, String[] pkgList); - - void fullTransportBackup(String[] pkgNames); - - void adbRestore(ParcelFileDescriptor fd); - - // Confirm that the previously-requested full backup/restore operation can proceed. This - // is used to require a user-facing disclosure about the operation. - void acknowledgeAdbBackupOrRestore(int token, boolean allow, - String curPassword, String encPpassword, IFullBackupRestoreObserver observer); - - // Enable/disable backups - void setBackupEnabled(boolean enable); - - // Enable/disable automatic restore of app data at install time - void setAutoRestore(boolean doAutoRestore); - - // Mark the backup service as having been provisioned - void setBackupProvisioned(boolean available); - - // Report whether the backup mechanism is currently enabled - boolean isBackupEnabled(); - - // Update the transport attributes - void updateTransportAttributes( - ComponentName transportComponent, - String name, - Intent configurationIntent, - String currentDestinationString, - Intent dataManagementIntent, - String dataManagementLabel); - - // Report the name of the currently active transport - String getCurrentTransport(); - - // Report the component name of the host service of the currently active transport - @Nullable - ComponentName getCurrentTransportComponent(); - - // Report all known, available backup transports - String[] listAllTransports(); - - ComponentName[] listAllTransportComponents(); - - String[] getTransportWhitelist(); - - // Select which transport to use for the next backup operation. - String selectBackupTransport(String transport); - - void selectBackupTransportAsync(ComponentName transport, - ISelectBackupTransportCallback listener); - - // Supply the configuration Intent for the given transport. If the name is not one - // of the available transports, or if the transport does not supply any configuration - // UI, the method returns null. - Intent getConfigurationIntent(String transportName); - - // Supply the configuration summary string for the given transport. If the name is - // not one of the available transports, or if the transport does not supply any - // summary / destination string, the method can return null. - // - // This string is used VERBATIM as the summary text of the relevant Settings item! - String getDestinationString(String transportName); - - // Supply the manage-data intent for the given transport. - Intent getDataManagementIntent(String transportName); - - // Supply the menu label for affordances that fire the manage-data intent - // for the given transport. - String getDataManagementLabel(String transportName); - - // Callback: a requested backup agent has been instantiated. This should only - // be called from the Activity Manager. - void agentConnected(String packageName, IBinder agentBinder); - - // Callback: a backup agent has failed to come up, or has unexpectedly quit. - // If the agent failed to come up in the first place, the agentBinder argument - // will be null. This should only be called from the Activity Manager. - void agentDisconnected(String packageName); - - // An application being installed will need a restore pass, then the Package Manager - // will need to be told when the restore is finished. - void restoreAtInstall(String packageName, int token); - - // Hand off a restore session - IRestoreSession beginRestoreSession(String packageName, String transport); - - // Note that a currently-active backup agent has notified us that it has - // completed the given outstanding asynchronous backup/restore operation. - void opComplete(int token, long result); - - boolean isAppEligibleForBackup(String packageName); - - String[] filterAppsEligibleForBackup(String[] packages); - - void dump(FileDescriptor fd, PrintWriter pw, String[] args); - - IBackupManager getBackupManagerBinder(); - - // Gets access to the backup/restore agent timeout parameters. - BackupAgentTimeoutParameters getAgentTimeoutParameters(); -} diff --git a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java index fbec5cb22af2..bb145769fc8c 100644 --- a/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java +++ b/services/backup/java/com/android/server/backup/KeyValueAdbRestoreEngine.java @@ -39,7 +39,7 @@ public class KeyValueAdbRestoreEngine implements Runnable { private static final String TAG = "KeyValueAdbRestoreEngine"; private static final boolean DEBUG = false; - private final BackupManagerServiceInterface mBackupManagerService; + private final BackupManagerService mBackupManagerService; private final File mDataDir; FileMetadata mInfo; @@ -48,7 +48,7 @@ public class KeyValueAdbRestoreEngine implements Runnable { IBackupAgent mAgent; int mToken; - public KeyValueAdbRestoreEngine(BackupManagerServiceInterface backupManagerService, + public KeyValueAdbRestoreEngine(BackupManagerService backupManagerService, File dataDir, FileMetadata info, ParcelFileDescriptor inFD, IBackupAgent agent, int token) { mBackupManagerService = backupManagerService; diff --git a/services/backup/java/com/android/server/backup/Trampoline.java b/services/backup/java/com/android/server/backup/Trampoline.java index 787d667afe51..818154b283da 100644 --- a/services/backup/java/com/android/server/backup/Trampoline.java +++ b/services/backup/java/com/android/server/backup/Trampoline.java @@ -76,7 +76,7 @@ public class Trampoline extends IBackupManager.Stub { final Context mContext; final File mSuppressFile; // existence testing & creating synchronized on 'this' final boolean mGlobalDisable; - volatile BackupManagerServiceInterface mService; + volatile BackupManagerService mService; private HandlerThread mHandlerThread; @@ -100,7 +100,7 @@ public class Trampoline extends IBackupManager.Stub { BACKUP_SUPPRESS_FILENAME); } - protected BackupManagerServiceInterface createBackupManagerService() { + protected BackupManagerService createBackupManagerService() { return BackupManagerService.create(mContext, this, mHandlerThread); } @@ -135,7 +135,7 @@ public class Trampoline extends IBackupManager.Stub { initialize(UserHandle.USER_SYSTEM); Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; Slog.i(TAG, "Unlocking system user; mService=" + mService); if (svc != null) { svc.unlockSystemUser(); @@ -198,7 +198,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void dataChanged(String packageName) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.dataChanged(packageName); } @@ -207,7 +207,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void initializeTransports(String[] transportNames, IBackupObserver observer) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.initializeTransports(transportNames, observer); } @@ -216,7 +216,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void clearBackupData(String transportName, String packageName) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.clearBackupData(transportName, packageName); } @@ -224,7 +224,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void agentConnected(String packageName, IBinder agent) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.agentConnected(packageName, agent); } @@ -232,7 +232,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void agentDisconnected(String packageName) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.agentDisconnected(packageName); } @@ -240,7 +240,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void restoreAtInstall(String packageName, int token) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.restoreAtInstall(packageName, token); } @@ -248,7 +248,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void setBackupEnabled(boolean isEnabled) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.setBackupEnabled(isEnabled); } @@ -256,7 +256,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void setAutoRestore(boolean doAutoRestore) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.setAutoRestore(doAutoRestore); } @@ -264,7 +264,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void setBackupProvisioned(boolean isProvisioned) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.setBackupProvisioned(isProvisioned); } @@ -272,25 +272,25 @@ public class Trampoline extends IBackupManager.Stub { @Override public boolean isBackupEnabled() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.isBackupEnabled() : false; } @Override public boolean setBackupPassword(String currentPw, String newPw) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.setBackupPassword(currentPw, newPw) : false; } @Override public boolean hasBackupPassword() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.hasBackupPassword() : false; } @Override public void backupNow() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.backupNow(); } @@ -301,7 +301,7 @@ public class Trampoline extends IBackupManager.Stub { boolean includeShared, boolean doWidgets, boolean allApps, boolean allIncludesSystem, boolean doCompress, boolean doKeyValue, String[] packageNames) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.adbBackup(fd, includeApks, includeObbs, includeShared, doWidgets, allApps, allIncludesSystem, doCompress, doKeyValue, packageNames); @@ -310,7 +310,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void fullTransportBackup(String[] packageNames) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.fullTransportBackup(packageNames); } @@ -318,7 +318,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void adbRestore(ParcelFileDescriptor fd) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.adbRestore(fd); } @@ -328,7 +328,7 @@ public class Trampoline extends IBackupManager.Stub { public void acknowledgeFullBackupOrRestore(int token, boolean allow, String curPassword, String encryptionPassword, IFullBackupRestoreObserver observer) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.acknowledgeAdbBackupOrRestore(token, allow, curPassword, encryptionPassword, observer); @@ -337,7 +337,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public String getCurrentTransport() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getCurrentTransport() : null; } @@ -348,25 +348,25 @@ public class Trampoline extends IBackupManager.Stub { @Override @Nullable public ComponentName getCurrentTransportComponent() { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getCurrentTransportComponent() : null; } @Override public String[] listAllTransports() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.listAllTransports() : null; } @Override public ComponentName[] listAllTransportComponents() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.listAllTransportComponents() : null; } @Override public String[] getTransportWhitelist() { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getTransportWhitelist() : null; } @@ -378,7 +378,7 @@ public class Trampoline extends IBackupManager.Stub { String currentDestinationString, @Nullable Intent dataManagementIntent, String dataManagementLabel) { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.updateTransportAttributes( transportComponent, @@ -392,14 +392,14 @@ public class Trampoline extends IBackupManager.Stub { @Override public String selectBackupTransport(String transport) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.selectBackupTransport(transport) : null; } @Override public void selectBackupTransportAsync(ComponentName transport, ISelectBackupTransportCallback listener) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.selectBackupTransportAsync(transport, listener); } else { @@ -415,38 +415,38 @@ public class Trampoline extends IBackupManager.Stub { @Override public Intent getConfigurationIntent(String transport) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getConfigurationIntent(transport) : null; } @Override public String getDestinationString(String transport) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getDestinationString(transport) : null; } @Override public Intent getDataManagementIntent(String transport) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getDataManagementIntent(transport) : null; } @Override public String getDataManagementLabel(String transport) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getDataManagementLabel(transport) : null; } @Override public IRestoreSession beginRestoreSession(String packageName, String transportID) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.beginRestoreSession(packageName, transportID) : null; } @Override public void opComplete(int token, long result) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.opComplete(token, result); } @@ -454,26 +454,26 @@ public class Trampoline extends IBackupManager.Stub { @Override public long getAvailableRestoreToken(String packageName) { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.getAvailableRestoreToken(packageName) : 0; } @Override public boolean isAppEligibleForBackup(String packageName) { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.isAppEligibleForBackup(packageName) : false; } @Override public String[] filterAppsEligibleForBackup(String[] packages) { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.filterAppsEligibleForBackup(packages) : null; } @Override public int requestBackup(String[] packages, IBackupObserver observer, IBackupManagerMonitor monitor, int flags) throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc == null) { return BackupManager.ERROR_BACKUP_NOT_ALLOWED; } @@ -482,7 +482,7 @@ public class Trampoline extends IBackupManager.Stub { @Override public void cancelBackups() throws RemoteException { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.cancelBackups(); } @@ -492,7 +492,7 @@ public class Trampoline extends IBackupManager.Stub { public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return; - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.dump(fd, pw, args); } else { @@ -503,12 +503,12 @@ public class Trampoline extends IBackupManager.Stub { // Full backup/restore entry points - non-Binder; called directly // by the full-backup scheduled job /* package */ boolean beginFullBackup(FullBackupJob scheduledJob) { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; return (svc != null) ? svc.beginFullBackup(scheduledJob) : false; } /* package */ void endFullBackup() { - BackupManagerServiceInterface svc = mService; + BackupManagerService svc = mService; if (svc != null) { svc.endFullBackup(); } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index bc6254a76327..b750d7959167 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3495,7 +3495,7 @@ public class ConnectivityService extends IConnectivityManager.Stub ProxyInfo oldProxyInfo = oldLp == null ? null : oldLp.getHttpProxy(); if (!ProxyTracker.proxyInfoEqual(newProxyInfo, oldProxyInfo)) { - mProxyTracker.sendProxyBroadcast(mProxyTracker.getDefaultProxy()); + mProxyTracker.sendProxyBroadcast(); } } @@ -4782,15 +4782,14 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - private String getNetworkPermission(NetworkCapabilities nc) { - // TODO: make these permission strings AIDL constants instead. + private int getNetworkPermission(NetworkCapabilities nc) { if (!nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)) { - return NetworkManagementService.PERMISSION_SYSTEM; + return INetd.PERMISSION_SYSTEM; } if (!nc.hasCapability(NET_CAPABILITY_FOREGROUND)) { - return NetworkManagementService.PERMISSION_NETWORK; + return INetd.PERMISSION_NETWORK; } - return null; + return INetd.PERMISSION_NONE; } /** @@ -4863,9 +4862,9 @@ public class ConnectivityService extends IConnectivityManager.Stub if (Objects.equals(nai.networkCapabilities, newNc)) return; - final String oldPermission = getNetworkPermission(nai.networkCapabilities); - final String newPermission = getNetworkPermission(newNc); - if (!Objects.equals(oldPermission, newPermission) && nai.created && !nai.isVPN()) { + final int oldPermission = getNetworkPermission(nai.networkCapabilities); + final int newPermission = getNetworkPermission(newNc); + if (oldPermission != newPermission && nai.created && !nai.isVPN()) { try { mNMS.setNetworkPermission(nai.network.netId, newPermission); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/DeviceIdleController.java b/services/core/java/com/android/server/DeviceIdleController.java index 26421a2acb66..0b30ff5cc398 100644 --- a/services/core/java/com/android/server/DeviceIdleController.java +++ b/services/core/java/com/android/server/DeviceIdleController.java @@ -242,11 +242,9 @@ public class DeviceIdleController extends SystemService private ActivityTaskManagerInternal mLocalActivityTaskManager; private PowerManagerInternal mLocalPowerManager; private PowerManager mPowerManager; - private ConnectivityService mConnectivityService; private INetworkPolicyManager mNetworkPolicyManager; private SensorManager mSensorManager; private Sensor mMotionSensor; - private LocationManager mLocationManager; private LocationRequest mLocationRequest; private Intent mIdleIntent; private Intent mLightIdleIntent; @@ -1508,6 +1506,8 @@ public class DeviceIdleController extends SystemService static class Injector { private final Context mContext; + private ConnectivityService mConnectivityService; + private LocationManager mLocationManager; Injector(Context ctx) { mContext = ctx; @@ -1527,7 +1527,11 @@ public class DeviceIdleController extends SystemService } ConnectivityService getConnectivityService() { - return (ConnectivityService) ServiceManager.getService(Context.CONNECTIVITY_SERVICE); + if (mConnectivityService == null) { + mConnectivityService = (ConnectivityService) ServiceManager.getService( + Context.CONNECTIVITY_SERVICE); + } + return mConnectivityService; } Constants getConstants(DeviceIdleController controller, Handler handler, @@ -1536,7 +1540,10 @@ public class DeviceIdleController extends SystemService } LocationManager getLocationManager() { - return mContext.getSystemService(LocationManager.class); + if (mLocationManager == null) { + mLocationManager = mContext.getSystemService(LocationManager.class); + } + return mLocationManager; } MyHandler getHandler(DeviceIdleController controller) { @@ -1666,7 +1673,6 @@ public class DeviceIdleController extends SystemService mGoingIdleWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "deviceidle_going_idle"); mGoingIdleWakeLock.setReferenceCounted(true); - mConnectivityService = mInjector.getConnectivityService(); mNetworkPolicyManager = INetworkPolicyManager.Stub.asInterface( ServiceManager.getService(Context.NETWORK_POLICY_SERVICE)); mNetworkPolicyManagerInternal = getLocalService(NetworkPolicyManagerInternal.class); @@ -1689,7 +1695,6 @@ public class DeviceIdleController extends SystemService if (getContext().getResources().getBoolean( com.android.internal.R.bool.config_autoPowerModePrefetchLocation)) { - mLocationManager = mInjector.getLocationManager(); mLocationRequest = new LocationRequest() .setQuality(LocationRequest.ACCURACY_FINE) .setInterval(0) @@ -2160,10 +2165,17 @@ public class DeviceIdleController extends SystemService } } + @VisibleForTesting + boolean isNetworkConnected() { + synchronized (this) { + return mNetworkConnected; + } + } + void updateConnectivityState(Intent connIntent) { ConnectivityService cm; synchronized (this) { - cm = mConnectivityService; + cm = mInjector.getConnectivityService(); } if (cm == null) { return; @@ -2276,13 +2288,17 @@ public class DeviceIdleController extends SystemService /** Must only be used in tests. */ @VisibleForTesting void setDeepEnabledForTest(boolean enabled) { - mDeepEnabled = enabled; + synchronized (this) { + mDeepEnabled = enabled; + } } /** Must only be used in tests. */ @VisibleForTesting void setLightEnabledForTest(boolean enabled) { - mLightEnabled = enabled; + synchronized (this) { + mLightEnabled = enabled; + } } void becomeInactiveIfAppropriateLocked() { @@ -2338,7 +2354,9 @@ public class DeviceIdleController extends SystemService */ @VisibleForTesting void setLightStateForTest(int lightState) { - mLightState = lightState; + synchronized (this) { + mLightState = lightState; + } } @VisibleForTesting @@ -2429,12 +2447,6 @@ public class DeviceIdleController extends SystemService } } - /** Must only be used in tests. */ - @VisibleForTesting - void setLocationManagerForTest(LocationManager lm) { - mLocationManager = lm; - } - @VisibleForTesting int getState() { return mState; @@ -2486,18 +2498,19 @@ public class DeviceIdleController extends SystemService if (DEBUG) Slog.d(TAG, "Moved from STATE_SENSING to STATE_LOCATING."); EventLogTags.writeDeviceIdle(mState, reason); scheduleAlarmLocked(mConstants.LOCATING_TIMEOUT, false); - if (mLocationManager != null - && mLocationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) { - mLocationManager.requestLocationUpdates(mLocationRequest, + LocationManager locationManager = mInjector.getLocationManager(); + if (locationManager != null + && locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) { + locationManager.requestLocationUpdates(mLocationRequest, mGenericLocationListener, mHandler.getLooper()); mLocating = true; } else { mHasNetworkLocation = false; } - if (mLocationManager != null - && mLocationManager.getProvider(LocationManager.GPS_PROVIDER) != null) { + if (locationManager != null + && locationManager.getProvider(LocationManager.GPS_PROVIDER) != null) { mHasGps = true; - mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, + locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 5, mGpsLocationListener, mHandler.getLooper()); mLocating = true; } else { @@ -2575,7 +2588,9 @@ public class DeviceIdleController extends SystemService /** Must only be used in tests. */ @VisibleForTesting void setActiveIdleOpsForTest(int count) { - mActiveIdleOpCount = count; + synchronized (this) { + mActiveIdleOpCount = count; + } } void setJobsActive(boolean active) { @@ -2751,8 +2766,9 @@ public class DeviceIdleController extends SystemService void cancelLocatingLocked() { if (mLocating) { - mLocationManager.removeUpdates(mGenericLocationListener); - mLocationManager.removeUpdates(mGpsLocationListener); + LocationManager locationManager = mInjector.getLocationManager(); + locationManager.removeUpdates(mGenericLocationListener); + locationManager.removeUpdates(mGpsLocationListener); mLocating = false; } } diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java index cf39e95fd735..f510d8355179 100644 --- a/services/core/java/com/android/server/NetworkManagementService.java +++ b/services/core/java/com/android/server/NetworkManagementService.java @@ -170,19 +170,6 @@ public class NetworkManagementService extends INetworkManagementService.Stub */ public static final String LIMIT_GLOBAL_ALERT = "globalAlert"; - /** - * String to pass to netd to indicate that a network is only accessible - * to apps that have the CHANGE_NETWORK_STATE permission. - */ - public static final String PERMISSION_NETWORK = "NETWORK"; - - /** - * String to pass to netd to indicate that a network is only - * accessible to system apps and those with the CONNECTIVITY_INTERNAL - * permission. - */ - public static final String PERMISSION_SYSTEM = "SYSTEM"; - static class NetdResponseCode { /* Keep in sync with system/netd/server/ResponseCode.h */ public static final int InterfaceListResult = 110; @@ -223,6 +210,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub static final int DAEMON_MSG_MOBILE_CONN_REAL_TIME_INFO = 1; + static final boolean MODIFY_OPERATION_ADD = true; + static final boolean MODIFY_OPERATION_REMOVE = false; + /** * Binder context for this service */ @@ -1122,41 +1112,47 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void addRoute(int netId, RouteInfo route) { - modifyRoute("add", "" + netId, route); + modifyRoute(MODIFY_OPERATION_ADD, netId, route); } @Override public void removeRoute(int netId, RouteInfo route) { - modifyRoute("remove", "" + netId, route); + modifyRoute(MODIFY_OPERATION_REMOVE, netId, route); } - private void modifyRoute(String action, String netId, RouteInfo route) { + private void modifyRoute(boolean add, int netId, RouteInfo route) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - final Command cmd = new Command("network", "route", action, netId); - - // create triplet: interface dest-ip-addr/prefixlength gateway-ip-addr - cmd.appendArg(route.getInterface()); - cmd.appendArg(route.getDestination().toString()); + final String ifName = route.getInterface(); + final String dst = route.getDestination().toString(); + final String nextHop; switch (route.getType()) { case RouteInfo.RTN_UNICAST: if (route.hasGateway()) { - cmd.appendArg(route.getGateway().getHostAddress()); + nextHop = route.getGateway().getHostAddress(); + } else { + nextHop = INetd.NEXTHOP_NONE; } break; case RouteInfo.RTN_UNREACHABLE: - cmd.appendArg("unreachable"); + nextHop = INetd.NEXTHOP_UNREACHABLE; break; case RouteInfo.RTN_THROW: - cmd.appendArg("throw"); + nextHop = INetd.NEXTHOP_THROW; + break; + default: + nextHop = INetd.NEXTHOP_NONE; break; } - try { - mConnector.execute(cmd); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + if (add) { + mNetdService.networkAddRoute(netId, ifName, dst, nextHop); + } else { + mNetdService.networkRemoveRoute(netId, ifName, dst, nextHop); + } + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -1916,44 +1912,21 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void addVpnUidRanges(int netId, UidRange[] ranges) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - Object[] argv = new Object[3 + MAX_UID_RANGES_PER_COMMAND]; - argv[0] = "users"; - argv[1] = "add"; - argv[2] = netId; - int argc = 3; - // Avoid overly long commands by limiting number of UID ranges per command. - for (int i = 0; i < ranges.length; i++) { - argv[argc++] = ranges[i].toString(); - if (i == (ranges.length - 1) || argc == argv.length) { - try { - mConnector.execute("network", Arrays.copyOf(argv, argc)); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); - } - argc = 3; - } + + try { + mNetdService.networkAddUidRanges(netId, ranges); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @Override public void removeVpnUidRanges(int netId, UidRange[] ranges) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - Object[] argv = new Object[3 + MAX_UID_RANGES_PER_COMMAND]; - argv[0] = "users"; - argv[1] = "remove"; - argv[2] = netId; - int argc = 3; - // Avoid overly long commands by limiting number of UID ranges per command. - for (int i = 0; i < ranges.length; i++) { - argv[argc++] = ranges[i].toString(); - if (i == (ranges.length - 1) || argc == argv.length) { - try { - mConnector.execute("network", Arrays.copyOf(argv, argc)); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); - } - argc = 3; - } + try { + mNetdService.networkRemoveUidRanges(netId, ranges); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2412,17 +2385,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub } @Override - public void createPhysicalNetwork(int netId, String permission) { + public void createPhysicalNetwork(int netId, int permission) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - if (permission != null) { - mConnector.execute("network", "create", netId, permission); - } else { - mConnector.execute("network", "create", netId); - } - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkCreatePhysical(netId, permission); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2431,10 +2400,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "create", netId, "vpn", hasDNS ? "1" : "0", - secure ? "1" : "0"); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkCreateVpn(netId, hasDNS, secure); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2455,20 +2423,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub @Override public void addInterfaceToNetwork(String iface, int netId) { - modifyInterfaceInNetwork("add", "" + netId, iface); + modifyInterfaceInNetwork(MODIFY_OPERATION_ADD, netId, iface); } @Override public void removeInterfaceFromNetwork(String iface, int netId) { - modifyInterfaceInNetwork("remove", "" + netId, iface); + modifyInterfaceInNetwork(MODIFY_OPERATION_REMOVE, netId, iface); } - private void modifyInterfaceInNetwork(String action, String netId, String iface) { + private void modifyInterfaceInNetwork(boolean add, int netId, String iface) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "interface", action, netId, iface); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + if (add) { + mNetdService.networkAddInterface(netId, iface); + } else { + mNetdService.networkRemoveInterface(netId, iface); + } + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2476,20 +2448,20 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void addLegacyRouteForNetId(int netId, RouteInfo routeInfo, int uid) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - final Command cmd = new Command("network", "route", "legacy", uid, "add", netId); - - // create triplet: interface dest-ip-addr/prefixlength gateway-ip-addr final LinkAddress la = routeInfo.getDestinationLinkAddress(); - cmd.appendArg(routeInfo.getInterface()); - cmd.appendArg(la.getAddress().getHostAddress() + "/" + la.getPrefixLength()); + final String ifName = routeInfo.getInterface(); + final String dst = la.toString(); + final String nextHop; + if (routeInfo.hasGateway()) { - cmd.appendArg(routeInfo.getGateway().getHostAddress()); + nextHop = routeInfo.getGateway().getHostAddress(); + } else { + nextHop = ""; } - try { - mConnector.execute(cmd); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkAddLegacyRoute(netId, ifName, dst, nextHop, uid); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2498,9 +2470,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "default", "set", netId); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkSetDefault(netId); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2509,49 +2481,41 @@ public class NetworkManagementService extends INetworkManagementService.Stub mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "default", "clear"); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkClearDefault(); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @Override - public void setNetworkPermission(int netId, String permission) { + public void setNetworkPermission(int netId, int permission) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - if (permission != null) { - mConnector.execute("network", "permission", "network", "set", permission, netId); - } else { - mConnector.execute("network", "permission", "network", "clear", netId); - } - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkSetPermissionForNetwork(netId, permission); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } + private int parsePermission(String permission) { + if (permission.equals("NETWORK")) { + return INetd.PERMISSION_NETWORK; + } + if (permission.equals("SYSTEM")) { + return INetd.PERMISSION_SYSTEM; + } + return INetd.PERMISSION_NONE; + } @Override public void setPermission(String permission, int[] uids) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - Object[] argv = new Object[4 + MAX_UID_RANGES_PER_COMMAND]; - argv[0] = "permission"; - argv[1] = "user"; - argv[2] = "set"; - argv[3] = permission; - int argc = 4; - // Avoid overly long commands by limiting number of UIDs per command. - for (int i = 0; i < uids.length; ++i) { - argv[argc++] = uids[i]; - if (i == uids.length - 1 || argc == argv.length) { - try { - mConnector.execute("network", Arrays.copyOf(argv, argc)); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); - } - argc = 4; - } + try { + mNetdService.networkSetPermissionForUser(parsePermission(permission), uids); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2559,22 +2523,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub public void clearPermission(int[] uids) { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); - Object[] argv = new Object[3 + MAX_UID_RANGES_PER_COMMAND]; - argv[0] = "permission"; - argv[1] = "user"; - argv[2] = "clear"; - int argc = 3; - // Avoid overly long commands by limiting number of UIDs per command. - for (int i = 0; i < uids.length; ++i) { - argv[argc++] = uids[i]; - if (i == uids.length - 1 || argc == argv.length) { - try { - mConnector.execute("network", Arrays.copyOf(argv, argc)); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); - } - argc = 3; - } + try { + mNetdService.networkClearPermissionForUser(uids); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2583,9 +2535,9 @@ public class NetworkManagementService extends INetworkManagementService.Stub mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "protect", "allow", uid); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkSetProtectAllow(uid); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @@ -2594,26 +2546,26 @@ public class NetworkManagementService extends INetworkManagementService.Stub mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); try { - mConnector.execute("network", "protect", "deny", uid); - } catch (NativeDaemonConnectorException e) { - throw e.rethrowAsParcelableException(); + mNetdService.networkSetProtectDeny(uid); + } catch (RemoteException | ServiceSpecificException e) { + throw new IllegalStateException(e); } } @Override public void addInterfaceToLocalNetwork(String iface, List<RouteInfo> routes) { - modifyInterfaceInNetwork("add", "local", iface); + modifyInterfaceInNetwork(MODIFY_OPERATION_ADD, INetd.NETID_LOCAL, iface); for (RouteInfo route : routes) { if (!route.isDefaultRoute()) { - modifyRoute("add", "local", route); + modifyRoute(MODIFY_OPERATION_ADD, INetd.NETID_LOCAL, route); } } } @Override public void removeInterfaceFromLocalNetwork(String iface) { - modifyInterfaceInNetwork("remove", "local", iface); + modifyInterfaceInNetwork(MODIFY_OPERATION_REMOVE, INetd.NETID_LOCAL, iface); } @Override @@ -2622,7 +2574,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub for (RouteInfo route : routes) { try { - modifyRoute("remove", "local", route); + modifyRoute(MODIFY_OPERATION_REMOVE, INetd.NETID_LOCAL, route); } catch (IllegalStateException e) { failures++; } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 591ec0070ea5..65f3c035b031 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -216,6 +216,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private int mPreferredDataSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID; + @TelephonyManager.RadioPowerState + private int mRadioPowerState = TelephonyManager.RADIO_POWER_UNAVAILABLE; + private final LocalLog mLocalLog = new LocalLog(100); private PreciseDataConnectionState mPreciseDataConnectionState = @@ -762,6 +765,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if ((events & PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED) != 0) { + try { + r.callback.onRadioPowerStateChanged(mRadioPowerState); + } catch (RemoteException ex) { + remove(r.binder); + } + } } } } else { @@ -1609,6 +1619,32 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + public void notifyRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) { + if (!checkNotifyPermission("notifyRadioPowerStateChanged()")) { + return; + } + + if (VDBG) { + log("notifyRadioPowerStateChanged: state= " + state); + } + + synchronized (mRecords) { + mRadioPowerState = state; + + for (Record r : mRecords) { + if (r.matchPhoneStateListenerEvent( + PhoneStateListener.LISTEN_RADIO_POWER_STATE_CHANGED)) { + try { + r.callback.onRadioPowerStateChanged(state); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); @@ -1646,6 +1682,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { pw.println("mVoLteServiceState=" + mVoLteServiceState); pw.println("mPhoneCapability=" + mPhoneCapability); pw.println("mPreferredDataSubId=" + mPreferredDataSubId); + pw.println("mRadioPowerState=" + mRadioPowerState); pw.decreaseIndent(); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 8e64b5063302..f4ec1f9d5b27 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -25,7 +25,6 @@ import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.Comparator; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; @@ -552,7 +551,7 @@ public final class ActiveServices { if (!callerFg && !fgRequired && r.app == null && mAm.mUserController.hasStartedUserState(r.userId)) { ProcessRecord proc = mAm.getProcessRecordLocked(r.processName, r.appInfo.uid, false); - if (proc == null || proc.curProcState > ActivityManager.PROCESS_STATE_RECEIVER) { + if (proc == null || proc.getCurProcState() > ActivityManager.PROCESS_STATE_RECEIVER) { // If this is not coming from a foreground caller, then we may want // to delay the start if there are already other background services // that are starting. This is to avoid process start spam when lots @@ -580,7 +579,7 @@ public final class ActiveServices { } if (DEBUG_DELAYED_STARTS) Slog.v(TAG_SERVICE, "Not delaying: " + r); addToStarting = true; - } else if (proc.curProcState >= ActivityManager.PROCESS_STATE_SERVICE) { + } else if (proc.getCurProcState() >= ActivityManager.PROCESS_STATE_SERVICE) { // We slightly loosen when we will enqueue this new service as a background // starting service we are waiting for, to also include processes that are // currently running other services or receivers. @@ -589,7 +588,7 @@ public final class ActiveServices { "Not delaying, but counting as bg: " + r); } else if (DEBUG_DELAYED_STARTS) { StringBuilder sb = new StringBuilder(128); - sb.append("Not potential delay (state=").append(proc.curProcState) + sb.append("Not potential delay (state=").append(proc.getCurProcState()) .append(' ').append(proc.adjType); String reason = proc.makeAdjReason(); if (reason != null) { @@ -1442,8 +1441,8 @@ public final class ActiveServices { } } } - if (anyClientActivities != proc.hasClientActivities) { - proc.hasClientActivities = anyClientActivities; + if (anyClientActivities != proc.hasClientActivities()) { + proc.setHasClientActivities(anyClientActivities); if (updateLru) { mAm.updateLruProcessLocked(proc, anyClientActivities, null); } @@ -1623,8 +1622,9 @@ public final class ActiveServices { } } - mAm.startAssociationLocked(callerApp.uid, callerApp.processName, callerApp.curProcState, - s.appInfo.uid, s.appInfo.longVersionCode, s.name, s.processName); + mAm.startAssociationLocked(callerApp.uid, callerApp.processName, + callerApp.getCurProcState(), s.appInfo.uid, s.appInfo.longVersionCode, + s.name, s.processName); // Once the apps have become associated, if one of them is caller is ephemeral // the target app should now be able to see the calling app mAm.grantEphemeralAccessLocked(callerApp.userId, service, @@ -1680,7 +1680,7 @@ public final class ActiveServices { s.app.whitelistManager = true; } // This could have made the service more important. - mAm.updateLruProcessLocked(s.app, s.app.hasClientActivities + mAm.updateLruProcessLocked(s.app, s.app.hasClientActivities() || s.app.treatLikeActivity, b.client); mAm.updateOomAdjLocked(s.app, true); } @@ -1794,7 +1794,7 @@ public final class ActiveServices { if ((r.flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { r.binding.service.app.treatLikeActivity = true; mAm.updateLruProcessLocked(r.binding.service.app, - r.binding.service.app.hasClientActivities + r.binding.service.app.hasClientActivities() || r.binding.service.app.treatLikeActivity, null); } mAm.updateOomAdjLocked(r.binding.service.app, false); @@ -3259,9 +3259,9 @@ public final class ActiveServices { } } - void cleanUpRemovedTaskLocked(TaskRecord tr, ComponentName component, Intent baseIntent) { + void cleanUpServices(int userId, ComponentName component, Intent baseIntent) { ArrayList<ServiceRecord> services = new ArrayList<>(); - ArrayMap<ComponentName, ServiceRecord> alls = getServicesLocked(tr.userId); + ArrayMap<ComponentName, ServiceRecord> alls = getServicesLocked(userId); for (int i = alls.size() - 1; i >= 0; i--) { ServiceRecord sr = alls.valueAt(i); if (sr.packageName.equals(component.getPackageName())) { diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java index 95a8e2a0aade..fecb5732745e 100644 --- a/services/core/java/com/android/server/am/ActivityDisplay.java +++ b/services/core/java/com/android/server/am/ActivityDisplay.java @@ -37,12 +37,12 @@ import static com.android.server.am.ActivityDisplayProto.FOCUSED_STACK_ID; import static com.android.server.am.ActivityDisplayProto.ID; import static com.android.server.am.ActivityDisplayProto.RESUMED_ACTIVITY; import static com.android.server.am.ActivityDisplayProto.STACKS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStack.ActivityState.RESUMED; import static com.android.server.am.ActivityStackSupervisor.FindTaskResult; import static com.android.server.am.ActivityStackSupervisor.TAG_STATES; @@ -73,7 +73,7 @@ import java.util.ArrayList; */ class ActivityDisplay extends ConfigurationContainer<ActivityStack> implements WindowContainerListener { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityDisplay" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityDisplay" : TAG_ATM; private static final String TAG_STACK = TAG + POSTFIX_STACK; static final int POSITION_TOP = Integer.MAX_VALUE; diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 3a0289cbfd63..5c77f0a3ad47 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -220,7 +220,7 @@ final class ActivityManagerConstants extends ContentObserver { // Indicates whether the activity starts logging is enabled. // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED - boolean mFlagActivityStartsLoggingEnabled; + volatile boolean mFlagActivityStartsLoggingEnabled; private final ActivityManagerService mService; private ContentResolver mResolver; diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java index 0e63d0c557f6..0aaea2f62de0 100644 --- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java +++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java @@ -41,97 +41,48 @@ class ActivityManagerDebugConfig { // Enable all debug log categories. static final boolean DEBUG_ALL = false; - // Enable all debug log categories for activities. - static final boolean DEBUG_ALL_ACTIVITIES = DEBUG_ALL || false; - // Available log categories in the activity manager package. - static final boolean DEBUG_ADD_REMOVE = DEBUG_ALL_ACTIVITIES || false; static final boolean DEBUG_ANR = true; // STOPSHIP disable it (b/113252928) - static final boolean DEBUG_APP = DEBUG_ALL_ACTIVITIES || false; static final boolean DEBUG_BACKGROUND_CHECK = DEBUG_ALL || false; static final boolean DEBUG_BACKUP = DEBUG_ALL || false; static final boolean DEBUG_BROADCAST = DEBUG_ALL || false; static final boolean DEBUG_BROADCAST_BACKGROUND = DEBUG_BROADCAST || false; static final boolean DEBUG_BROADCAST_LIGHT = DEBUG_BROADCAST || false; - static final boolean DEBUG_CLEANUP = DEBUG_ALL || false; - static final boolean DEBUG_CONFIGURATION = DEBUG_ALL || false; - static final boolean DEBUG_CONTAINERS = DEBUG_ALL_ACTIVITIES || false; - static final boolean DEBUG_FOCUS = false; - static final boolean DEBUG_IDLE = DEBUG_ALL_ACTIVITIES || false; - static final boolean DEBUG_IMMERSIVE = DEBUG_ALL || false; - static final boolean DEBUG_LOCKTASK = DEBUG_ALL || false; static final boolean DEBUG_LRU = DEBUG_ALL || false; static final boolean DEBUG_MU = DEBUG_ALL || false; static final boolean DEBUG_NETWORK = DEBUG_ALL || false; static final boolean DEBUG_OOM_ADJ = DEBUG_ALL || false; static final boolean DEBUG_OOM_ADJ_REASON = DEBUG_ALL || false; - static final boolean DEBUG_PAUSE = DEBUG_ALL || false; static final boolean DEBUG_POWER = DEBUG_ALL || false; static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false; static final boolean DEBUG_PROCESS_OBSERVERS = DEBUG_ALL || false; static final boolean DEBUG_PROCESSES = DEBUG_ALL || false; static final boolean DEBUG_PROVIDER = DEBUG_ALL || false; static final boolean DEBUG_PSS = DEBUG_ALL || false; - static final boolean DEBUG_RECENTS = DEBUG_ALL || false; - static final boolean DEBUG_RECENTS_TRIM_TASKS = DEBUG_RECENTS || false; - static final boolean DEBUG_RELEASE = DEBUG_ALL_ACTIVITIES || false; - static final boolean DEBUG_RESULTS = DEBUG_ALL || false; - static final boolean DEBUG_SAVED_STATE = DEBUG_ALL_ACTIVITIES || false; static final boolean DEBUG_SERVICE = DEBUG_ALL || false; static final boolean DEBUG_FOREGROUND_SERVICE = DEBUG_ALL || false; static final boolean DEBUG_SERVICE_EXECUTING = DEBUG_ALL || false; - static final boolean DEBUG_STACK = DEBUG_ALL || false; - static final boolean DEBUG_STATES = DEBUG_ALL_ACTIVITIES || false; - static final boolean DEBUG_SWITCH = DEBUG_ALL || false; - static final boolean DEBUG_TASKS = DEBUG_ALL || false; - static final boolean DEBUG_TRANSITION = DEBUG_ALL || false; static final boolean DEBUG_UID_OBSERVERS = DEBUG_ALL || false; - static final boolean DEBUG_URI_PERMISSION = DEBUG_ALL || false; - static final boolean DEBUG_USER_LEAVING = DEBUG_ALL || false; - static final boolean DEBUG_VISIBILITY = DEBUG_ALL || false; static final boolean DEBUG_USAGE_STATS = DEBUG_ALL || false; static final boolean DEBUG_PERMISSIONS_REVIEW = DEBUG_ALL || false; static final boolean DEBUG_WHITELISTS = DEBUG_ALL || false; - static final boolean DEBUG_METRICS = DEBUG_ALL || false; - static final String POSTFIX_ADD_REMOVE = (APPEND_CATEGORY_NAME) ? "_AddRemove" : ""; - static final String POSTFIX_APP = (APPEND_CATEGORY_NAME) ? "_App" : ""; static final String POSTFIX_BACKUP = (APPEND_CATEGORY_NAME) ? "_Backup" : ""; static final String POSTFIX_BROADCAST = (APPEND_CATEGORY_NAME) ? "_Broadcast" : ""; static final String POSTFIX_CLEANUP = (APPEND_CATEGORY_NAME) ? "_Cleanup" : ""; - static final String POSTFIX_CONFIGURATION = (APPEND_CATEGORY_NAME) ? "_Configuration" : ""; - static final String POSTFIX_CONTAINERS = (APPEND_CATEGORY_NAME) ? "_Containers" : ""; - static final String POSTFIX_FOCUS = (APPEND_CATEGORY_NAME) ? "_Focus" : ""; - static final String POSTFIX_IDLE = (APPEND_CATEGORY_NAME) ? "_Idle" : ""; - static final String POSTFIX_IMMERSIVE = (APPEND_CATEGORY_NAME) ? "_Immersive" : ""; - static final String POSTFIX_LOCKTASK = (APPEND_CATEGORY_NAME) ? "_LockTask" : ""; static final String POSTFIX_LRU = (APPEND_CATEGORY_NAME) ? "_LRU" : ""; static final String POSTFIX_MU = "_MU"; static final String POSTFIX_NETWORK = "_Network"; static final String POSTFIX_OOM_ADJ = (APPEND_CATEGORY_NAME) ? "_OomAdj" : ""; - static final String POSTFIX_PAUSE = (APPEND_CATEGORY_NAME) ? "_Pause" : ""; static final String POSTFIX_POWER = (APPEND_CATEGORY_NAME) ? "_Power" : ""; static final String POSTFIX_PROCESS_OBSERVERS = (APPEND_CATEGORY_NAME) ? "_ProcessObservers" : ""; static final String POSTFIX_PROCESSES = (APPEND_CATEGORY_NAME) ? "_Processes" : ""; static final String POSTFIX_PROVIDER = (APPEND_CATEGORY_NAME) ? "_Provider" : ""; static final String POSTFIX_PSS = (APPEND_CATEGORY_NAME) ? "_Pss" : ""; - static final String POSTFIX_RECENTS = (APPEND_CATEGORY_NAME) ? "_Recents" : ""; - static final String POSTFIX_RELEASE = (APPEND_CATEGORY_NAME) ? "_Release" : ""; - static final String POSTFIX_RESULTS = (APPEND_CATEGORY_NAME) ? "_Results" : ""; - static final String POSTFIX_SAVED_STATE = (APPEND_CATEGORY_NAME) ? "_SavedState" : ""; static final String POSTFIX_SERVICE = (APPEND_CATEGORY_NAME) ? "_Service" : ""; static final String POSTFIX_SERVICE_EXECUTING = (APPEND_CATEGORY_NAME) ? "_ServiceExecuting" : ""; - static final String POSTFIX_STACK = (APPEND_CATEGORY_NAME) ? "_Stack" : ""; - static final String POSTFIX_STATES = (APPEND_CATEGORY_NAME) ? "_States" : ""; - static final String POSTFIX_SWITCH = (APPEND_CATEGORY_NAME) ? "_Switch" : ""; - static final String POSTFIX_TASKS = (APPEND_CATEGORY_NAME) ? "_Tasks" : ""; - static final String POSTFIX_TRANSITION = (APPEND_CATEGORY_NAME) ? "_Transition" : ""; static final String POSTFIX_UID_OBSERVERS = (APPEND_CATEGORY_NAME) ? "_UidObservers" : ""; - static final String POSTFIX_URI_PERMISSION = (APPEND_CATEGORY_NAME) ? "_UriPermission" : ""; - static final String POSTFIX_USER_LEAVING = (APPEND_CATEGORY_NAME) ? "_UserLeaving" : ""; - static final String POSTFIX_VISIBILITY = (APPEND_CATEGORY_NAME) ? "_Visibility" : ""; - } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index acf7a73332b7..d5b618f954df 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -91,7 +91,6 @@ import static android.provider.Settings.Global.DEBUG_APP; import static android.provider.Settings.Global.NETWORK_ACCESS_TIMEOUT_MS; import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER; import static android.text.format.DateUtils.DAY_IN_MILLIS; -import static android.view.Display.DEFAULT_DISPLAY; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR; @@ -100,9 +99,9 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_BACKGROUND; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BROADCAST_LIGHT; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CLEANUP; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LRU; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_NETWORK; @@ -115,15 +114,15 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESS_OBS import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROVIDER; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PSS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SERVICE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USAGE_STATS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_WHITELISTS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LRU; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_MU; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_NETWORK; @@ -134,7 +133,7 @@ import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROCESS_O import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PROVIDER; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PSS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SERVICE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_UID_OBSERVERS; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; @@ -202,7 +201,6 @@ import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo.HiddenApiEnforcementPolicy; -import android.content.pm.ConfigurationInfo; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageManager; import android.content.pm.InstrumentationInfo; @@ -267,7 +265,6 @@ import android.os.TransactionTooLargeException; import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; -import android.os.storage.IStorageManager; import android.os.storage.StorageManager; import android.os.storage.StorageManagerInternal; import android.provider.Settings; @@ -341,7 +338,6 @@ import com.android.server.SystemServiceManager; import com.android.server.ThreadPriorityBooster; import com.android.server.Watchdog; import com.android.server.am.ActivityManagerServiceDumpProcessesProto.UidObserverRegistrationProto; -import com.android.server.am.ActivityStack.ActivityState; import com.android.server.am.MemoryStatUtil.MemoryStat; import com.android.server.firewall.IntentFirewall; import com.android.server.job.JobSchedulerInternal; @@ -434,7 +430,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final boolean MONITOR_THREAD_CPU_USAGE = false; // The flags that are set for all calls we make to the package manager. - static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES; + public static final int STOCK_PM_FLAGS = PackageManager.GET_SHARED_LIBRARY_FILES; static final String SYSTEM_DEBUGGABLE = "ro.debuggable"; @@ -464,7 +460,7 @@ public class ActivityManagerService extends IActivityManager.Stub // Must be kept in sync with Am. private static final int INSTRUMENTATION_FLAG_DISABLE_HIDDEN_API_CHECKS = 1 << 0; - static final int MY_PID = myPid(); + public static final int MY_PID = myPid(); static final String[] EMPTY_STRING_ARRAY = new String[0]; @@ -485,9 +481,6 @@ public class ActivityManagerService extends IActivityManager.Stub private static final String INTENT_REMOTE_BUGREPORT_FINISHED = "com.android.internal.intent.action.REMOTE_BUGREPORT_FINISHED"; - // Used to indicate that an app transition should be animated. - static final boolean ANIMATE = true; - // If set, we will push process association information in to procstats. static final boolean TRACK_PROCSTATS_ASSOCIATIONS = true; @@ -1053,11 +1046,6 @@ public class ActivityManagerService extends IActivityManager.Stub final AppOpsService mAppOpsService; /** - * Hardware-reported OpenGLES version. - */ - final int GL_ES_VERSION; - - /** * List of initialization arguments to pass to all processes when binding applications to them. * For example, references to the commonly used services. */ @@ -1077,7 +1065,6 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("this") boolean mCallFinishBooting = false; @GuardedBy("this") boolean mBootAnimationComplete = false; - private @GuardedBy("this") boolean mCheckedForSetup = false; final Context mContext; @@ -1405,7 +1392,6 @@ public class ActivityManagerService extends IActivityManager.Stub static final int SHOW_ERROR_UI_MSG = 1; static final int SHOW_NOT_RESPONDING_UI_MSG = 2; - static final int UPDATE_CONFIGURATION_MSG = 4; static final int GC_BACKGROUND_PROCESSES_MSG = 5; static final int WAIT_FOR_DEBUGGER_UI_MSG = 6; static final int SERVICE_TIMEOUT_MSG = 12; @@ -1420,7 +1406,6 @@ public class ActivityManagerService extends IActivityManager.Stub static final int DISPATCH_PROCESS_DIED_UI_MSG = 32; static final int REPORT_MEM_USAGE_MSG = 33; static final int UPDATE_TIME_PREFERENCE_MSG = 41; - static final int SEND_LOCALE_TO_MOUNT_DAEMON_MSG = 47; static final int NOTIFY_CLEARTEXT_NETWORK_MSG = 49; static final int POST_DUMP_HEAP_NOTIFICATION_MSG = 50; static final int DELETE_DUMPHEAP_MSG = 51; @@ -1434,10 +1419,7 @@ public class ActivityManagerService extends IActivityManager.Stub static final int SERVICE_FOREGROUND_CRASH_MSG = 69; static final int DISPATCH_OOM_ADJ_OBSERVER_MSG = 70; - static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; - static final int FIRST_COMPAT_MODE_MSG = 300; - static final int FIRST_SUPERVISOR_STACK_MSG = 100; static final String SERVICE_RECORD_KEY = "servicerecord"; @@ -1600,11 +1582,6 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public void handleMessage(Message msg) { switch (msg.what) { - case UPDATE_CONFIGURATION_MSG: { - final ContentResolver resolver = mContext.getContentResolver(); - Settings.System.putConfigurationForUser(resolver, (Configuration) msg.obj, - msg.arg1); - } break; case GC_BACKGROUND_PROCESSES_MSG: { synchronized (ActivityManagerService.this) { performAppGcsIfAppropriateLocked(); @@ -1735,18 +1712,6 @@ public class ActivityManagerService extends IActivityManager.Stub } break; } - case SEND_LOCALE_TO_MOUNT_DAEMON_MSG: { - try { - Locale l = (Locale) msg.obj; - IBinder service = ServiceManager.getService("mount"); - IStorageManager storageManager = IStorageManager.Stub.asInterface(service); - Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI"); - storageManager.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag()); - } catch (RemoteException e) { - Log.e(TAG, "Error storing locale for decryption UI", e); - } - break; - } case NOTIFY_CLEARTEXT_NETWORK_MSG: { final int uid = msg.arg1; final byte[] firstPacket = (byte[]) msg.obj; @@ -2058,6 +2023,7 @@ public class ActivityManagerService extends IActivityManager.Stub public void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) { mUsageStatsService = usageStatsManager; + mActivityTaskManager.setUsageStatsManager(usageStatsManager); } public void startObservingNativeCrashes() { @@ -2297,7 +2263,6 @@ public class ActivityManagerService extends IActivityManager.Stub mInjector = injector; mContext = mInjector.getContext(); mUiContext = null; - GL_ES_VERSION = 0; mAppErrors = null; mAppOpsService = mInjector.getAppOpsService(null, null); mBatteryStatsService = null; @@ -2387,9 +2352,6 @@ public class ActivityManagerService extends IActivityManager.Stub mPendingIntentController = new PendingIntentController( mHandlerThread.getLooper(), mUserController); - GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", - ConfigurationInfo.GL_ES_VERSION_UNDEFINED); - if (SystemProperties.getInt("sys.use_fifo_ui", 0) != 0) { mUseFifoUiScheduling = true; } @@ -2398,7 +2360,8 @@ public class ActivityManagerService extends IActivityManager.Stub mIntentFirewall = new IntentFirewall(new IntentFirewallInterface(), mHandler); mActivityTaskManager = atm; - mActivityTaskManager.setActivityManagerService(this); + mActivityTaskManager.setActivityManagerService(this, mHandlerThread.getLooper(), + mIntentFirewall, mPendingIntentController); mAtmInternal = LocalServices.getService(ActivityTaskManagerInternal.class); mStackSupervisor = mActivityTaskManager.mStackSupervisor; @@ -2834,7 +2797,7 @@ public class ActivityManagerService extends IActivityManager.Stub final void updateLruProcessLocked(ProcessRecord app, boolean activityChange, ProcessRecord client) { - final boolean hasActivity = app.hasActivitiesOrRecentTasks() || app.hasClientActivities + final boolean hasActivity = app.hasActivitiesOrRecentTasks() || app.hasClientActivities() || app.treatLikeActivity; final boolean hasService = false; // not impl yet. app.services.size() > 0; if (!activityChange && hasActivity) { @@ -3693,14 +3656,6 @@ public class ActivityManagerService extends IActivityManager.Stub } } - boolean getCheckedForSetup() { - return mCheckedForSetup; - } - - void setCheckedForSetup(boolean checked) { - mCheckedForSetup = checked; - } - CompatibilityInfo compatibilityInfoForPackage(ApplicationInfo ai) { return mAtmInternal.compatibilityInfoForPackage(ai); } @@ -3764,7 +3719,7 @@ public class ActivityManagerService extends IActivityManager.Stub "Unable to set a higher trim level than current level"); } if (!(level < ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN || - app.curProcState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)) { + app.getCurProcState() > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND)) { throw new IllegalArgumentException("Unable to set a background trim level " + "on a foreground process"); } @@ -6550,7 +6505,7 @@ public class ActivityManagerService extends IActivityManager.Stub for (int i = 0; i < pids.length; i++) { ProcessRecord pr = mPidsSelfLocked.get(pids[i]); states[i] = (pr == null) ? ActivityManager.PROCESS_STATE_NONEXISTENT : - pr.curProcState; + pr.getCurProcState(); if (scores != null) { scores[i] = (pr == null) ? ProcessList.INVALID_ADJ : pr.curAdj; } @@ -6834,7 +6789,7 @@ public class ActivityManagerService extends IActivityManager.Stub proc = mPidsSelfLocked.get(callingPid); } if (proc != null && - !ActivityManager.isProcStateBackground(proc.curProcState)) { + !ActivityManager.isProcStateBackground(proc.getCurProcState())) { // Whoever is instigating this is in the foreground, so we will allow it // to go through. return ActivityManager.APP_START_MODE_NORMAL; @@ -6871,11 +6826,6 @@ public class ActivityManagerService extends IActivityManager.Stub return ptw != null ? ptw.tag : null; } - @VisibleForTesting - boolean isActivityStartsLoggingEnabled() { - return mConstants.mFlagActivityStartsLoggingEnabled; - } - private ProviderInfo getProviderInfoLocked(String authority, int userHandle, int pmFlags) { ProviderInfo pi = null; ContentProviderRecord cpr = mProviderMap.getProviderByName(authority, userHandle); @@ -7415,7 +7365,7 @@ public class ActivityManagerService extends IActivityManager.Stub } cpr.connections.add(conn); r.conProviders.add(conn); - startAssociationLocked(r.uid, r.processName, r.curProcState, + startAssociationLocked(r.uid, r.processName, r.getCurProcState(), cpr.uid, cpr.appInfo.longVersionCode, cpr.name, cpr.info.processName); return conn; } @@ -9250,11 +9200,11 @@ public class ActivityManagerService extends IActivityManager.Stub Slog.w(TAG, "setHasTopUi called on unknown pid: " + pid); return; } - if (pr.hasTopUi != hasTopUi) { + if (pr.hasTopUi() != hasTopUi) { if (DEBUG_OOM_ADJ) { Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid); } - pr.hasTopUi = hasTopUi; + pr.setHasTopUi(hasTopUi); changed = true; } } @@ -10435,10 +10385,10 @@ public class ActivityManagerService extends IActivityManager.Stub } outInfo.lastTrimLevel = app.trimMemoryLevel; int adj = app.curAdj; - int procState = app.curProcState; + int procState = app.getCurProcState(); outInfo.importance = procStateToImportance(procState, adj, outInfo, clientTargetSdk); outInfo.importanceReasonCode = app.adjTypeCode; - outInfo.processState = app.curProcState; + outInfo.processState = app.getCurProcState(); outInfo.isFocused = (app == getTopAppLocked()); outInfo.lastActivityTime = app.lastActivityTime; } @@ -12662,12 +12612,13 @@ public class ActivityManagerService extends IActivityManager.Stub if (schedGroup != ProcessOomProto.SCHED_GROUP_UNKNOWN) { proto.write(ProcessOomProto.SCHED_GROUP, schedGroup); } - if (r.foregroundActivities) { + if (r.hasForegroundActivities()) { proto.write(ProcessOomProto.ACTIVITIES, true); } else if (r.hasForegroundServices()) { proto.write(ProcessOomProto.SERVICES, true); } - proto.write(ProcessOomProto.STATE, ProcessList.makeProcStateProtoEnum(r.curProcState)); + proto.write(ProcessOomProto.STATE, + ProcessList.makeProcStateProtoEnum(r.getCurProcState())); proto.write(ProcessOomProto.TRIM_MEMORY_LEVEL, r.trimMemoryLevel); r.writeToProto(proto, ProcessOomProto.PROC); proto.write(ProcessOomProto.ADJ_TYPE, r.adjType); @@ -12693,7 +12644,7 @@ public class ActivityManagerService extends IActivityManager.Stub proto.write(ProcessOomProto.Detail.CUR_ADJ, r.curAdj); proto.write(ProcessOomProto.Detail.SET_ADJ, r.setAdj); proto.write(ProcessOomProto.Detail.CURRENT_STATE, - ProcessList.makeProcStateProtoEnum(r.curProcState)); + ProcessList.makeProcStateProtoEnum(r.getCurProcState())); proto.write(ProcessOomProto.Detail.SET_STATE, ProcessList.makeProcStateProtoEnum(r.setProcState)); proto.write(ProcessOomProto.Detail.LAST_PSS, DebugUtils.sizeValueToString( @@ -12759,14 +12710,14 @@ public class ActivityManagerService extends IActivityManager.Stub break; } char foreground; - if (r.foregroundActivities) { + if (r.hasForegroundActivities()) { foreground = 'A'; } else if (r.hasForegroundServices()) { foreground = 'S'; } else { foreground = ' '; } - String procState = ProcessList.makeProcStateString(r.curProcState); + String procState = ProcessList.makeProcStateString(r.getCurProcState()); pw.print(prefix); pw.print(r.isPersistent() ? persistentLabel : normalLabel); pw.print(" #"); @@ -12820,7 +12771,8 @@ public class ActivityManagerService extends IActivityManager.Stub pw.print(" set="); pw.println(r.setAdj); pw.print(prefix); pw.print(" "); - pw.print("state: cur="); pw.print(ProcessList.makeProcStateString(r.curProcState)); + pw.print("state: cur="); pw.print( + ProcessList.makeProcStateString(r.getCurProcState())); pw.print(" set="); pw.print(ProcessList.makeProcStateString(r.setProcState)); pw.print(" lastPss="); DebugUtils.printSizeValue(pw, r.lastPss*1024); pw.print(" lastSwapPss="); DebugUtils.printSizeValue(pw, r.lastSwapPss*1024); @@ -14610,11 +14562,11 @@ public class ActivityManagerService extends IActivityManager.Stub app.waitingToKill = null; app.forcingToImportant = null; updateProcessForegroundLocked(app, false, false); - app.foregroundActivities = false; + app.setHasForegroundActivities(false); app.hasShownUi = false; app.treatLikeActivity = false; app.hasAboveClient = false; - app.hasClientActivities = false; + app.setHasClientActivities(false); mServices.killServicesLocked(app, allowRestart); @@ -17056,7 +17008,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (app.thread == null) { app.adjSeq = mAdjSeq; app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_BACKGROUND); - app.curProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY; + app.setCurProcState(ActivityManager.PROCESS_STATE_CACHED_EMPTY); app.curAdj=app.curRawAdj=ProcessList.CACHED_APP_MAX_ADJ; app.completedAdjSeq = app.adjSeq; return false; @@ -17073,7 +17025,7 @@ public class ActivityManagerService extends IActivityManager.Stub final int logUid = mCurOomAdjUid; int prevAppAdj = app.curAdj; - int prevProcState = app.curProcState; + int prevProcState = app.getCurProcState(); if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) { // The max adjustment doesn't allow this app to be anything @@ -17084,9 +17036,9 @@ public class ActivityManagerService extends IActivityManager.Stub app.adjType = "fixed"; app.adjSeq = mAdjSeq; app.curRawAdj = app.maxAdj; - app.foregroundActivities = false; + app.setHasForegroundActivities(false); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_DEFAULT); - app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT; + app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT); // System processes can do UI, and when they do we want to have // them trim their memory after the user leaves the UI. To // facilitate this, here we need to determine whether or not it @@ -17096,7 +17048,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.systemNoUi = false; app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP); app.adjType = "pers-top-activity"; - } else if (app.hasTopUi) { + } else if (app.hasTopUi()) { // sched group/proc state adjustment is below app.systemNoUi = false; app.adjType = "pers-top-ui"; @@ -17106,11 +17058,11 @@ public class ActivityManagerService extends IActivityManager.Stub if (!app.systemNoUi) { if (mWakefulness == PowerManagerInternal.WAKEFULNESS_AWAKE) { // screen on, promote UI - app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT_UI; + app.setCurProcState(ActivityManager.PROCESS_STATE_PERSISTENT_UI); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_TOP_APP); } else { // screen off, restrict UI scheduling - app.curProcState = ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE; + app.setCurProcState(ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); app.setCurrentSchedulingGroup(ProcessList.SCHED_GROUP_RESTRICTED); } } @@ -17246,7 +17198,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (DEBUG_OOM_ADJ_REASON || logUid == appUid) { reportOomAdjMessageLocked(TAG_OOM_ADJ, "Raise to fg service: " + app); } - } else if (app.hasOverlayUi) { + } else if (app.hasOverlayUi()) { // The process is display an overlay UI. adj = ProcessList.PERCEPTIBLE_APP_ADJ; procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; @@ -17476,7 +17428,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } int clientAdj = client.curRawAdj; - int clientProcState = client.curProcState; + int clientProcState = client.getCurProcState(); if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) { // If the other app is cached for any reason, for purposes here // we are going to consider it empty. The specific cached state @@ -17637,8 +17589,8 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (procState < ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND - && (cr.flags&Context.BIND_SHOWING_UI) != 0) { - app.pendingUiClean = true; + && (cr.flags & Context.BIND_SHOWING_UI) != 0) { + app.setPendingUiClean(true); } if (adjType != null) { app.adjType = adjType; @@ -17718,7 +17670,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } int clientAdj = client.curRawAdj; - int clientProcState = client.curProcState; + int clientProcState = client.getCurProcState(); if (clientProcState >= PROCESS_STATE_CACHED_ACTIVITY) { // If the other app is cached for any reason, for purposes here // we are going to consider it empty. @@ -17879,7 +17831,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (procState >= ActivityManager.PROCESS_STATE_CACHED_EMPTY) { - if (app.hasClientActivities) { + if (app.hasClientActivities()) { // This is a cached process, but with client activities. Mark it so. procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT; app.adjType = "cch-client-act"; @@ -17946,12 +17898,12 @@ public class ActivityManagerService extends IActivityManager.Stub // keep it out of the cached vaues. app.curAdj = app.modifyRawOomAdj(adj); app.setCurrentSchedulingGroup(schedGroup); - app.curProcState = procState; - app.foregroundActivities = foregroundActivities; + app.setCurProcState(procState); + app.setHasForegroundActivities(foregroundActivities); app.completedAdjSeq = mAdjSeq; // if curAdj or curProcState improved, then this process was promoted - return app.curAdj < prevAppAdj || app.curProcState < prevProcState; + return app.curAdj < prevAppAdj || app.getCurProcState() < prevProcState; } /** @@ -18103,7 +18055,7 @@ public class ActivityManagerService extends IActivityManager.Stub for (int i = mLruProcesses.size() - 1; i >= 0; i--) { ProcessRecord app = mLruProcesses.get(i); if (app.thread == null - || app.curProcState == ActivityManager.PROCESS_STATE_NONEXISTENT) { + || app.getCurProcState() == ActivityManager.PROCESS_STATE_NONEXISTENT) { continue; } if (memLowered || (always && now > @@ -18112,7 +18064,7 @@ public class ActivityManagerService extends IActivityManager.Stub app.pssProcState = app.setProcState; app.pssStatType = always ? ProcessStats.ADD_PSS_INTERNAL_ALL_POLL : ProcessStats.ADD_PSS_INTERNAL_ALL_MEM; - app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState, + app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(), app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now); mPendingPssProcesses.add(app); } @@ -18305,7 +18257,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (doCpuKills && uptimeSince > 0) { // What is the limit for this process? int cpuLimit; - long checkDur = curUptime - app.whenUnimportant; + long checkDur = curUptime - app.getWhenUnimportant(); if (checkDur <= mConstants.POWER_CHECK_INTERVAL) { cpuLimit = mConstants.POWER_CHECK_MAX_CPU_1; } else if (checkDur <= (mConstants.POWER_CHECK_INTERVAL*2) @@ -18467,12 +18419,12 @@ public class ActivityManagerService extends IActivityManager.Stub } } } - if (app.repForegroundActivities != app.foregroundActivities) { - app.repForegroundActivities = app.foregroundActivities; + if (app.repForegroundActivities != app.hasForegroundActivities()) { + app.repForegroundActivities = app.hasForegroundActivities(); changes |= ProcessChangeItem.CHANGE_ACTIVITIES; } - if (app.getReportedProcState() != app.curProcState) { - app.setReportedProcState(app.curProcState); + if (app.getReportedProcState() != app.getCurProcState()) { + app.setReportedProcState(app.getCurProcState()); if (app.thread != null) { try { if (false) { @@ -18486,7 +18438,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } if (app.setProcState == ActivityManager.PROCESS_STATE_NONEXISTENT - || ProcessList.procStatesDifferForMem(app.curProcState, app.setProcState)) { + || ProcessList.procStatesDifferForMem(app.getCurProcState(), app.setProcState)) { if (false && mTestPssMode && app.setProcState >= 0 && app.lastStateTime <= (now-200)) { // Experimental code to more aggressively collect pss while // running test... the problem is that this tends to collect @@ -18496,46 +18448,45 @@ public class ActivityManagerService extends IActivityManager.Stub long startTime = SystemClock.currentThreadTimeMillis(); long pss = Debug.getPss(app.pid, mTmpLong, null); long endTime = SystemClock.currentThreadTimeMillis(); - recordPssSampleLocked(app, app.curProcState, pss, mTmpLong[0], mTmpLong[1], + recordPssSampleLocked(app, app.getCurProcState(), pss, mTmpLong[0], mTmpLong[1], mTmpLong[2], ProcessStats.ADD_PSS_INTERNAL_SINGLE, endTime-startTime, now); mPendingPssProcesses.remove(app); Slog.i(TAG, "Recorded pss for " + app + " state " + app.setProcState - + " to " + app.curProcState + ": " + + " to " + app.getCurProcState() + ": " + (SystemClock.uptimeMillis()-start) + "ms"); } app.lastStateTime = now; - app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState, + app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(), app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now); if (DEBUG_PSS) Slog.d(TAG_PSS, "Process state change from " + ProcessList.makeProcStateString(app.setProcState) + " to " - + ProcessList.makeProcStateString(app.curProcState) + " next pss in " + + ProcessList.makeProcStateString(app.getCurProcState()) + " next pss in " + (app.nextPssTime-now) + ": " + app); } else { if (now > app.nextPssTime || (now > (app.lastPssTime+ProcessList.PSS_MAX_INTERVAL) && now > (app.lastStateTime+ProcessList.minTimeFromStateChange( mTestPssMode)))) { if (requestPssLocked(app, app.setProcState)) { - app.nextPssTime = ProcessList.computeNextPssTime(app.curProcState, + app.nextPssTime = ProcessList.computeNextPssTime(app.getCurProcState(), app.procStateMemTracker, mTestPssMode, mAtmInternal.isSleeping(), now); } } else if (false && DEBUG_PSS) Slog.d(TAG_PSS, "Not requesting pss of " + app + ": next=" + (app.nextPssTime-now)); } - if (app.setProcState != app.curProcState) { + if (app.setProcState != app.getCurProcState()) { if (DEBUG_SWITCH || DEBUG_OOM_ADJ || mCurOomAdjUid == app.uid) { String msg = "Proc state change of " + app.processName - + " to " + ProcessList.makeProcStateString(app.curProcState) - + " (" + app.curProcState + ")" + ": " + app.adjType; + + " to " + ProcessList.makeProcStateString(app.getCurProcState()) + + " (" + app.getCurProcState() + ")" + ": " + app.adjType; reportOomAdjMessageLocked(TAG_OOM_ADJ, msg); } boolean setImportant = app.setProcState < ActivityManager.PROCESS_STATE_SERVICE; - boolean curImportant = app.curProcState < ActivityManager.PROCESS_STATE_SERVICE; + boolean curImportant = app.getCurProcState() < ActivityManager.PROCESS_STATE_SERVICE; if (setImportant && !curImportant) { - // This app is no longer something we consider important enough to allow to - // use arbitrary amounts of battery power. Note - // its current CPU time to later know to kill it if - // it is not behaving well. - app.whenUnimportant = now; + // This app is no longer something we consider important enough to allow to use + // arbitrary amounts of battery power. Note its current CPU time to later know to + // kill it if it is not behaving well. + app.setWhenUnimportant(now); app.lastCpuTime = 0; } // Inform UsageStats of important process state change @@ -18544,7 +18495,7 @@ public class ActivityManagerService extends IActivityManager.Stub maybeUpdateLastTopTime(app, now); - app.setProcState = app.curProcState; + app.setProcState = app.getCurProcState(); if (app.setProcState >= ActivityManager.PROCESS_STATE_HOME) { app.notCachedSinceIdle = false; } @@ -18553,7 +18504,7 @@ public class ActivityManagerService extends IActivityManager.Stub } else { app.procStateChanged = true; } - } else if (app.reportedInteraction && (nowElapsed-app.interactionEventTime) + } else if (app.reportedInteraction && (nowElapsed - app.getInteractionEventTime()) > mConstants.USAGE_STATS_INTERACTION_INTERVAL) { // For apps that sit around for a long time in the interactive state, we need // to report this at least once a day so they don't go idle. @@ -18707,7 +18658,7 @@ public class ActivityManagerService extends IActivityManager.Stub private void maybeUpdateProviderUsageStatsLocked(ProcessRecord app, String providerPkgName, String authority) { if (app == null) return; - if (app.curProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { + if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) { UserState userState = mUserController.getStartedUserState(app.userId); if (userState == null) return; final long now = SystemClock.elapsedRealtime(); @@ -18727,7 +18678,7 @@ public class ActivityManagerService extends IActivityManager.Stub if (DEBUG_USAGE_STATS) { Slog.d(TAG, "Checking proc [" + Arrays.toString(app.getPackageList()) + "] state changes: old = " + app.setProcState + ", new = " - + app.curProcState); + + app.getCurProcState()); } if (mUsageStatsService == null) { return; @@ -18736,24 +18687,26 @@ public class ActivityManagerService extends IActivityManager.Stub // To avoid some abuse patterns, we are going to be careful about what we consider // to be an app interaction. Being the top activity doesn't count while the display // is sleeping, nor do short foreground services. - if (app.curProcState <= ActivityManager.PROCESS_STATE_TOP) { + if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_TOP) { isInteraction = true; - app.fgInteractionTime = 0; - } else if (app.curProcState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) { - if (app.fgInteractionTime == 0) { - app.fgInteractionTime = nowElapsed; + app.setFgInteractionTime(0); + } else if (app.getCurProcState() <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) { + if (app.getFgInteractionTime() == 0) { + app.setFgInteractionTime(nowElapsed); isInteraction = false; } else { - isInteraction = nowElapsed > app.fgInteractionTime + isInteraction = nowElapsed > app.getFgInteractionTime() + mConstants.SERVICE_USAGE_INTERACTION_TIME; } } else { - isInteraction = app.curProcState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; - app.fgInteractionTime = 0; + isInteraction = + app.getCurProcState() <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND; + app.setFgInteractionTime(0); } - if (isInteraction && (!app.reportedInteraction || (nowElapsed-app.interactionEventTime) + if (isInteraction + && (!app.reportedInteraction || (nowElapsed - app.getInteractionEventTime()) > mConstants.USAGE_STATS_INTERACTION_INTERVAL)) { - app.interactionEventTime = nowElapsed; + app.setInteractionEventTime(nowElapsed); String[] packages = app.getPackageList(); if (packages != null) { for (int i = 0; i < packages.length; i++) { @@ -18764,13 +18717,13 @@ public class ActivityManagerService extends IActivityManager.Stub } app.reportedInteraction = isInteraction; if (!isInteraction) { - app.interactionEventTime = 0; + app.setInteractionEventTime(0); } } private void maybeUpdateLastTopTime(ProcessRecord app, long nowUptime) { if (app.setProcState <= ActivityManager.PROCESS_STATE_TOP - && app.curProcState > ActivityManager.PROCESS_STATE_TOP) { + && app.getCurProcState() > ActivityManager.PROCESS_STATE_TOP) { app.lastTopTime = nowUptime; } } @@ -18991,7 +18944,7 @@ public class ActivityManagerService extends IActivityManager.Stub // If we haven't yet assigned the final cached adj // to the process, do that now. if (app.curAdj >= ProcessList.UNKNOWN_ADJ) { - switch (app.curProcState) { + switch (app.getCurProcState()) { case PROCESS_STATE_CACHED_ACTIVITY: case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: case ActivityManager.PROCESS_STATE_CACHED_RECENT: @@ -19079,7 +19032,7 @@ public class ActivityManagerService extends IActivityManager.Stub applyOomAdjLocked(app, true, now, nowElapsed); // Count the number of process types. - switch (app.curProcState) { + switch (app.getCurProcState()) { case PROCESS_STATE_CACHED_ACTIVITY: case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: mNumCachedHiddenProcs++; @@ -19120,8 +19073,8 @@ public class ActivityManagerService extends IActivityManager.Stub final UidRecord uidRec = app.uidRecord; if (uidRec != null) { uidRec.ephemeral = app.info.isInstantApp(); - if (uidRec.curProcState > app.curProcState) { - uidRec.curProcState = app.curProcState; + if (uidRec.curProcState > app.getCurProcState()) { + uidRec.curProcState = app.getCurProcState(); } if (app.hasForegroundServices()) { uidRec.foregroundServices = true; @@ -19129,7 +19082,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } - if (app.curProcState >= ActivityManager.PROCESS_STATE_HOME + if (app.getCurProcState() >= ActivityManager.PROCESS_STATE_HOME && !app.killedByAm) { numTrimming++; } @@ -19212,7 +19165,7 @@ public class ActivityManagerService extends IActivityManager.Stub setProcessTrackerStateLocked(app, trackerMemFactor, now); app.procStateChanged = false; } - if (app.curProcState >= ActivityManager.PROCESS_STATE_HOME + if (app.getCurProcState() >= ActivityManager.PROCESS_STATE_HOME && !app.killedByAm) { if (app.trimMemoryLevel < curLevel && app.thread != null) { try { @@ -19235,7 +19188,7 @@ public class ActivityManagerService extends IActivityManager.Stub break; } } - } else if (app.curProcState == ActivityManager.PROCESS_STATE_HEAVY_WEIGHT + } else if (app.getCurProcState() == ActivityManager.PROCESS_STATE_HEAVY_WEIGHT && !app.killedByAm) { if (app.trimMemoryLevel < ComponentCallbacks2.TRIM_MEMORY_BACKGROUND && app.thread != null) { @@ -19250,8 +19203,8 @@ public class ActivityManagerService extends IActivityManager.Stub } app.trimMemoryLevel = ComponentCallbacks2.TRIM_MEMORY_BACKGROUND; } else { - if ((app.curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND - || app.systemNoUi) && app.pendingUiClean) { + if ((app.getCurProcState() >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND + || app.systemNoUi) && app.hasPendingUiClean()) { // If this application is now in the background and it // had done UI, then give it the special trim level to // have it free UI resources. @@ -19265,7 +19218,7 @@ public class ActivityManagerService extends IActivityManager.Stub } catch (RemoteException e) { } } - app.pendingUiClean = false; + app.setPendingUiClean(false); } if (app.trimMemoryLevel < fgTrimLevel && app.thread != null) { try { @@ -19290,8 +19243,8 @@ public class ActivityManagerService extends IActivityManager.Stub setProcessTrackerStateLocked(app, trackerMemFactor, now); app.procStateChanged = false; } - if ((app.curProcState >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND - || app.systemNoUi) && app.pendingUiClean) { + if ((app.getCurProcState() >= ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND + || app.systemNoUi) && app.hasPendingUiClean()) { if (app.trimMemoryLevel < ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN && app.thread != null) { try { @@ -19303,7 +19256,7 @@ public class ActivityManagerService extends IActivityManager.Stub } catch (RemoteException e) { } } - app.pendingUiClean = false; + app.setPendingUiClean(false); } app.trimMemoryLevel = 0; } @@ -20320,7 +20273,7 @@ public class ActivityManagerService extends IActivityManager.Stub } if (app.removed) { procs.add(app); - } else if (app.userId == userHandle && app.foregroundActivities) { + } else if (app.userId == userHandle && app.hasForegroundActivities()) { app.removed = true; procs.add(app); } @@ -20391,10 +20344,10 @@ public class ActivityManagerService extends IActivityManager.Stub return; } } - if (pr.hasOverlayUi == hasOverlayUi) { + if (pr.hasOverlayUi() == hasOverlayUi) { return; } - pr.hasOverlayUi = hasOverlayUi; + pr.setHasOverlayUi(hasOverlayUi); //Slog.i(TAG, "Setting hasOverlayUi=" + pr.hasOverlayUi + " for pid=" + pid); updateOomAdjLocked(pr, true); } @@ -20779,6 +20732,42 @@ public class ActivityManagerService extends IActivityManager.Stub (ConnectionRecord) cr, null, c)); } } + + public void cleanUpServices(int userId, ComponentName component, Intent baseIntent) { + synchronized(ActivityManagerService.this) { + mServices.cleanUpServices(userId, component, baseIntent); + } + } + + public ActivityInfo getActivityInfoForUser(ActivityInfo aInfo, int userId) { + // Locked intentionally not held as it isn't needed for this case. + return ActivityManagerService.this.getActivityInfoForUser(aInfo, userId); + } + + public void ensureBootCompleted() { + // Locked intentionally not held as it isn't needed for this case. + ActivityManagerService.this.ensureBootCompleted(); + } + + public void updateOomLevelsForDisplay(int displayId) { + synchronized(ActivityManagerService.this) { + if (mWindowManager != null) { + mProcessList.applyDisplaySize(mWindowManager); + } + } + } + + public boolean isActivityStartsLoggingEnabled() { + return mConstants.mFlagActivityStartsLoggingEnabled; + } + + public void reportCurKeyguardUsageEvent(boolean keyguardShowing) { + synchronized(ActivityManagerService.this) { + ActivityManagerService.this.reportGlobalUsageEventLocked(keyguardShowing + ? UsageEvents.Event.KEYGUARD_SHOWN + : UsageEvents.Event.KEYGUARD_HIDDEN); + } + } } /** diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 40c555f8c2e6..9f768a84d223 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -23,7 +23,7 @@ import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED; import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.view.Display.INVALID_DISPLAY; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import android.app.ActivityManager; import android.app.ActivityOptions; diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java index e661627eda60..3578ed05dccc 100644 --- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java +++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java @@ -72,9 +72,9 @@ import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_T import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_WITH_BUNDLE; import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_WARM_LAUNCH; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_METRICS; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_METRICS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.EventLogTags.AM_ACTIVITY_LAUNCH_TIME; import static com.android.server.am.MemoryStatUtil.MemoryStat; import static com.android.server.am.MemoryStatUtil.readMemoryStatFromFilesystem; @@ -114,7 +114,7 @@ import com.android.server.LocalServices; */ class ActivityMetricsLogger { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityMetricsLogger" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityMetricsLogger" : TAG_ATM; // Window modes we are interested in logging. If we ever introduce a new type, we need to add // a value here and increase the {@link #TRON_WINDOW_STATE_VARZ_STRINGS} array. @@ -155,7 +155,6 @@ class ActivityMetricsLogger { private final H mHandler; private ArtManagerInternal mArtManagerInternal; - private boolean mDrawingTraceActive; private final StringBuilder mStringBuilder = new StringBuilder(); private final class H extends Handler { @@ -501,7 +500,6 @@ class ActivityMetricsLogger { if (mWindowingModeTransitionInfo.size() == 0) { reset(true /* abort */, info); } - stopFullyDrawnTraceIfNeeded(); } } } @@ -699,6 +697,13 @@ class ActivityMetricsLogger { if (info == null) { return null; } + + // Record the handling of the reportFullyDrawn callback in the trace system. This is not + // actually used to trace this function, but instead the logical task that this function + // fullfils (handling reportFullyDrawn() callbacks). + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, + "ActivityManager:ReportingFullyDrawn " + info.launchedActivity.packageName); + final LogMaker builder = new LogMaker(APP_TRANSITION_REPORTED_DRAWN); builder.setPackageName(r.packageName); builder.addTaggedData(FIELD_CLASS_NAME, r.info.name); @@ -720,7 +725,11 @@ class ActivityMetricsLogger { info.launchedActivity.info.name, info.currentTransitionProcessRunning, startupTimeMs); - stopFullyDrawnTraceIfNeeded(); + + // Ends the trace started at the beginning of this function. This is located here to allow + // the trace slice to have a noticable duration. + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); + final WindowingModeTransitionInfoSnapshot infoSnapshot = new WindowingModeTransitionInfoSnapshot(info, r, (int) startupTimeMs); BackgroundThread.getHandler().post(() -> logAppFullyDrawn(infoSnapshot)); @@ -741,7 +750,7 @@ class ActivityMetricsLogger { Log.i(TAG, sb.toString()); } - void logActivityStart(Intent intent, ProcessRecord callerApp, ActivityRecord r, + void logActivityStart(Intent intent, WindowProcessController callerApp, ActivityRecord r, int callingUid, String callingPackage, int callingUidProcState, boolean callingUidHasAnyVisibleWindow, int realCallingUid, int realCallingUidProcState, @@ -776,31 +785,31 @@ class ActivityMetricsLogger { builder.addTaggedData(FIELD_COMING_FROM_PENDING_INTENT, comingFromPendingIntent ? 1 : 0); builder.addTaggedData(FIELD_INTENT_ACTION, intent.getAction()); if (callerApp != null) { - builder.addTaggedData(FIELD_PROCESS_RECORD_PROCESS_NAME, callerApp.processName); + builder.addTaggedData(FIELD_PROCESS_RECORD_PROCESS_NAME, callerApp.mName); builder.addTaggedData(FIELD_PROCESS_RECORD_CUR_PROC_STATE, - processStateAmToProto(callerApp.curProcState)); + processStateAmToProto(callerApp.getCurrentProcState())); builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_CLIENT_ACTIVITIES, - callerApp.hasClientActivities ? 1 : 0); + callerApp.hasClientActivities() ? 1 : 0); builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_FOREGROUND_SERVICES, callerApp.hasForegroundServices() ? 1 : 0); builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_FOREGROUND_ACTIVITIES, - callerApp.foregroundActivities ? 1 : 0); - builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_TOP_UI, callerApp.hasTopUi ? 1 : 0); + callerApp.hasForegroundActivities() ? 1 : 0); + builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_TOP_UI, callerApp.hasTopUi() ? 1 : 0); builder.addTaggedData(FIELD_PROCESS_RECORD_HAS_OVERLAY_UI, - callerApp.hasOverlayUi ? 1 : 0); + callerApp.hasOverlayUi() ? 1 : 0); builder.addTaggedData(FIELD_PROCESS_RECORD_PENDING_UI_CLEAN, - callerApp.pendingUiClean ? 1 : 0); - if (callerApp.interactionEventTime != 0) { + callerApp.hasPendingUiClean() ? 1 : 0); + if (callerApp.getInteractionEventTime() != 0) { builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_LAST_INTERACTION_EVENT, - (nowElapsed - callerApp.interactionEventTime)); + (nowElapsed - callerApp.getInteractionEventTime())); } - if (callerApp.fgInteractionTime != 0) { + if (callerApp.getFgInteractionTime() != 0) { builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_FG_INTERACTION, - (nowElapsed - callerApp.fgInteractionTime)); + (nowElapsed - callerApp.getFgInteractionTime())); } - if (callerApp.whenUnimportant != 0) { + if (callerApp.getWhenUnimportant() != 0) { builder.addTaggedData(FIELD_PROCESS_RECORD_MILLIS_SINCE_UNIMPORTANT, - (nowUptime - callerApp.whenUnimportant)); + (nowUptime - callerApp.getWhenUnimportant())); } } builder.addTaggedData(FIELD_ACTIVITY_RECORD_LAUNCH_MODE, r.info.launchMode); @@ -887,10 +896,7 @@ class ActivityMetricsLogger { } /** - * Starts traces for app launch and draw times. We stop the fully drawn trace if its already - * active since the app may not have reported fully drawn in the previous launch. - * - * See {@link android.app.Activity#reportFullyDrawn()} + * Starts traces for app launch. * * @param info * */ @@ -898,14 +904,11 @@ class ActivityMetricsLogger { if (info == null) { return; } - stopFullyDrawnTraceIfNeeded(); int transitionType = getTransitionType(info); if (!info.launchTraceActive && transitionType == TYPE_TRANSITION_WARM_LAUNCH || transitionType == TYPE_TRANSITION_COLD_LAUNCH) { Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "launching: " + info.launchedActivity.packageName, 0); - Trace.asyncTraceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); - mDrawingTraceActive = true; info.launchTraceActive = true; } } @@ -920,11 +923,4 @@ class ActivityMetricsLogger { info.launchTraceActive = false; } } - - void stopFullyDrawnTraceIfNeeded() { - if (mDrawingTraceActive) { - Trace.asyncTraceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER, "drawing", 0); - mDrawingTraceActive = false; - } - } } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 6bdceb22d866..d837118f05d4 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -83,20 +83,20 @@ import static android.os.Build.VERSION_CODES.O; import static android.os.Process.SYSTEM_UID; import static android.view.WindowManagerPolicyConstants.NAV_BAR_LEFT; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SAVED_STATE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SAVED_STATE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SAVED_STATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SAVED_STATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityRecordProto.CONFIGURATION_CONTAINER; import static com.android.server.am.ActivityRecordProto.FRONT_OF_TASK; import static com.android.server.am.ActivityRecordProto.IDENTIFIER; @@ -118,7 +118,7 @@ import static com.android.server.am.EventLogTags.AM_RELAUNCH_ACTIVITY; import static com.android.server.am.EventLogTags.AM_RELAUNCH_RESUME_ACTIVITY; import static com.android.server.am.TaskPersister.DEBUG; import static com.android.server.am.TaskPersister.IMAGE_EXTENSION; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static com.android.server.wm.IdentifierProto.HASH_CODE; import static com.android.server.wm.IdentifierProto.TITLE; import static com.android.server.wm.IdentifierProto.USER_ID; @@ -211,7 +211,7 @@ import java.util.Objects; * An entry in the history stack, representing an activity. */ final class ActivityRecord extends ConfigurationContainer implements AppWindowContainerListener { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityRecord" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityRecord" : TAG_ATM; private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; private static final String TAG_SAVED_STATE = TAG + POSTFIX_SAVED_STATE; private static final String TAG_STATES = TAG + POSTFIX_STATES; @@ -852,13 +852,12 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } } - ActivityRecord(ActivityTaskManagerService _service, ProcessRecord _caller, int _launchedFromPid, - int _launchedFromUid, String _launchedFromPackage, Intent _intent, String _resolvedType, - ActivityInfo aInfo, Configuration _configuration, - ActivityRecord _resultTo, String _resultWho, int _reqCode, - boolean _componentSpecified, boolean _rootVoiceInteraction, - ActivityStackSupervisor supervisor, ActivityOptions options, - ActivityRecord sourceRecord) { + ActivityRecord(ActivityTaskManagerService _service, WindowProcessController _caller, + int _launchedFromPid, int _launchedFromUid, String _launchedFromPackage, Intent _intent, + String _resolvedType, ActivityInfo aInfo, Configuration _configuration, + ActivityRecord _resultTo, String _resultWho, int _reqCode, boolean _componentSpecified, + boolean _rootVoiceInteraction, ActivityStackSupervisor supervisor, + ActivityOptions options, ActivityRecord sourceRecord) { service = _service; appToken = new Token(this, _intent); info = aInfo; @@ -928,8 +927,8 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } if ((aInfo.flags & FLAG_MULTIPROCESS) != 0 && _caller != null && (aInfo.applicationInfo.uid == SYSTEM_UID - || aInfo.applicationInfo.uid == _caller.info.uid)) { - processName = _caller.processName; + || aInfo.applicationInfo.uid == _caller.mInfo.uid)) { + processName = _caller.mName; } else { processName = aInfo.processName; } @@ -1783,7 +1782,7 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } setVisible(true); sleeping = false; - app.setPendingUiClean(true); + app.postPendingUiCleanMsg(true); if (reportToClient) { makeClientVisible(); } else { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 864bf2d77b59..695ffe2be8b9 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -48,39 +48,39 @@ import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; import static com.android.server.am.ActivityDisplay.POSITION_BOTTOM; import static com.android.server.am.ActivityDisplay.POSITION_TOP; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ADD_REMOVE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_APP; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CLEANUP; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONTAINERS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PAUSE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RESULTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SAVED_STATE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TRANSITION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USER_LEAVING; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_ADD_REMOVE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_APP; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ALL; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_APP; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CLEANUP; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONTAINERS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_PAUSE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RESULTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SAVED_STATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TRANSITION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_USER_LEAVING; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_ADD_REMOVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_APP; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONTAINERS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RESULTS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SAVED_STATE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TRANSITION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_USER_LEAVING; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONTAINERS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_PAUSE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RESULTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SAVED_STATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_TRANSITION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_USER_LEAVING; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityRecord.RELAUNCH_REASON_FREE_RESIZE; import static com.android.server.am.ActivityRecord.RELAUNCH_REASON_WINDOWING_MODE_RESIZE; import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; @@ -103,6 +103,7 @@ import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS; +import static com.android.server.am.ActivityTaskManagerService.H.FIRST_ACTIVITY_STACK_MSG; import static java.lang.Integer.MAX_VALUE; import android.app.Activity; @@ -172,7 +173,7 @@ import java.util.Set; */ class ActivityStack<T extends StackWindowController> extends ConfigurationContainer implements StackWindowListener { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM; private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE; private static final String TAG_APP = TAG + POSTFIX_APP; private static final String TAG_CLEANUP = TAG + POSTFIX_CLEANUP; @@ -364,12 +365,12 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai private boolean mTopActivityOccludesKeyguard; private ActivityRecord mTopDismissingKeyguardActivity; - static final int PAUSE_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 1; - static final int DESTROY_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 2; - static final int LAUNCH_TICK_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 3; - static final int STOP_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 4; - static final int DESTROY_ACTIVITIES_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 5; - static final int TRANSLUCENT_TIMEOUT_MSG = ActivityManagerService.FIRST_ACTIVITY_STACK_MSG + 6; + static final int PAUSE_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 1; + static final int DESTROY_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 2; + static final int LAUNCH_TICK_MSG = FIRST_ACTIVITY_STACK_MSG + 3; + static final int STOP_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 4; + static final int DESTROY_ACTIVITIES_MSG = FIRST_ACTIVITY_STACK_MSG + 5; + static final int TRANSLUCENT_TIMEOUT_MSG = FIRST_ACTIVITY_STACK_MSG + 6; private static class ScheduleDestroyArgs { final WindowProcessController mOwner; @@ -1509,8 +1510,6 @@ class ActivityStack<T extends StackWindowController> extends ConfigurationContai prev.getTask().touchActiveTime(); clearLaunchTime(prev); - mStackSupervisor.getActivityMetricsLogger().stopFullyDrawnTraceIfNeeded(); - mService.updateCpuStats(); if (prev.attachedToProcess()) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 8c8146c54d9f..3f823ae8c631 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -54,27 +54,27 @@ import static android.view.Display.INVALID_DISPLAY; import static android.view.Display.TYPE_VIRTUAL; import static android.view.WindowManager.TRANSIT_DOCK_TASK_FROM_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IDLE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PAUSE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IDLE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_PAUSE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STATES; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.ActivityManagerService.ANIMATE; -import static com.android.server.am.ActivityManagerService.FIRST_SUPERVISOR_STACK_MSG; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ALL; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_IDLE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_PAUSE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_IDLE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_PAUSE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STATES; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerService.ANIMATE; +import static com.android.server.am.ActivityTaskManagerService.H.FIRST_SUPERVISOR_STACK_MSG; import static com.android.server.am.ActivityRecord.RELAUNCH_REASON_NONE; import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING; @@ -91,7 +91,7 @@ import static com.android.server.am.ActivityStackSupervisorProto.IS_HOME_RECENTS import static com.android.server.am.ActivityStackSupervisorProto.KEYGUARD_CONTROLLER; import static com.android.server.am.ActivityStackSupervisorProto.PENDING_ACTIVITIES; import static com.android.server.am.ActivityStackSupervisorProto.RESUMED_ACTIVITY; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED; @@ -198,7 +198,7 @@ import java.util.Set; public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener, RecentTasks.Callbacks, RootWindowContainerListener { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStackSupervisor" : TAG_ATM; private static final String TAG_IDLE = TAG + POSTFIX_IDLE; private static final String TAG_PAUSE = TAG + POSTFIX_PAUSE; private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; @@ -1487,7 +1487,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } app.hasShownUi = true; - app.pendingUiClean = true; + app.setPendingUiClean(true); app.forceProcessStateUpTo(mService.mTopProcessState); // Because we could be starting an Activity in the system process this may not go // across a Binder interface which would create a new Configuration. Consequently @@ -1717,24 +1717,25 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D sendHint = noResumedActivities || allFocusedProcessesDiffer; } - if (sendHint && mService.mAm.mLocalPowerManager != null) { - mService.mAm.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 1); + if (sendHint && mService.mPowerManagerInternal != null) { + mService.mPowerManagerInternal.powerHint(PowerHint.LAUNCH, 1); mPowerHintSent = true; } } void sendPowerHintForLaunchEndIfNeeded() { // Trigger launch power hint if activity is launched - if (mPowerHintSent && mService.mAm.mLocalPowerManager != null) { - mService.mAm.mLocalPowerManager.powerHint(PowerHint.LAUNCH, 0); + if (mPowerHintSent && mService.mPowerManagerInternal != null) { + mService.mPowerManagerInternal.powerHint(PowerHint.LAUNCH, 0); mPowerHintSent = false; } } - boolean checkStartAnyActivityPermission(Intent intent, ActivityInfo aInfo, - String resultWho, int requestCode, int callingPid, int callingUid, - String callingPackage, boolean ignoreTargetSecurity, boolean launchingInTask, - ProcessRecord callerApp, ActivityRecord resultRecord, ActivityStack resultStack) { + boolean checkStartAnyActivityPermission(Intent intent, ActivityInfo aInfo, String resultWho, + int requestCode, int callingPid, int callingUid, String callingPackage, + boolean ignoreTargetSecurity, boolean launchingInTask, + WindowProcessController callerApp, ActivityRecord resultRecord, + ActivityStack resultStack) { final boolean isCallerRecents = mService.getRecentTasks() != null && mService.getRecentTasks().isCallerRecents(callingUid); final int startAnyPerm = mService.checkPermission(START_ANY_ACTIVITY, callingPid, @@ -3072,7 +3073,9 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D } // Find any running services associated with this app and stop if needed. - mService.mAm.mServices.cleanUpRemovedTaskLocked(tr, component, new Intent(tr.getBaseIntent())); + final Message msg = PooledLambda.obtainMessage(ActivityManagerInternal::cleanUpServices, + mService.mAmInternal, tr.userId, component, new Intent(tr.getBaseIntent())); + mService.mH.sendMessage(msg); if (!killProcess) { return; @@ -3422,7 +3425,7 @@ public class ActivityStackSupervisor extends ConfigurationContainer implements D throw new IllegalStateException("Calling must be system uid"); } mLaunchingActivity.release(); - mService.mAm.mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); + mHandler.removeMessages(LAUNCH_TIMEOUT_MSG); } } diff --git a/services/core/java/com/android/server/am/ActivityStartController.java b/services/core/java/com/android/server/am/ActivityStartController.java index f6f1e5508957..20d5ab201307 100644 --- a/services/core/java/com/android/server/am/ActivityStartController.java +++ b/services/core/java/com/android/server/am/ActivityStartController.java @@ -22,8 +22,8 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.os.FactoryTest.FACTORY_TEST_LOW_LEVEL; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import android.app.ActivityOptions; import android.app.IApplicationThread; @@ -65,7 +65,7 @@ import java.util.List; * through the pending activity list, and recording home activity launches. */ public class ActivityStartController { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStartController" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStartController" : TAG_ATM; private static final int DO_PENDING_ACTIVITY_LAUNCHES_MSG = 1; @@ -91,6 +91,8 @@ public class ActivityStartController { private final PendingRemoteAnimationRegistry mPendingRemoteAnimationRegistry; + boolean mCheckedForSetup = false; + private final class StartHandler extends Handler { public StartHandler(Looper looper) { super(looper, null, true); @@ -193,7 +195,7 @@ public class ActivityStartController { */ void startSetupActivity() { // Only do this once per boot. - if (mService.mAm.getCheckedForSetup()) { + if (mCheckedForSetup) { return; } @@ -203,7 +205,7 @@ public class ActivityStartController { final ContentResolver resolver = mService.mContext.getContentResolver(); if (mService.mFactoryTest != FACTORY_TEST_LOW_LEVEL && Settings.Global.getInt(resolver, Settings.Global.DEVICE_PROVISIONED, 0) != 0) { - mService.mAm.setCheckedForSetup(true); + mCheckedForSetup = true; // See if we should be showing the platform update setup UI. final Intent intent = new Intent(Intent.ACTION_UPGRADE_SETUP); @@ -357,7 +359,7 @@ public class ActivityStartController { null, userId, ActivityStarter.computeResolveFilterUid( callingUid, realCallingUid, UserHandle.USER_NULL)); // TODO: New, check if this is correct - aInfo = mService.mAm.getActivityInfoForUser(aInfo, userId); + aInfo = mService.mAmInternal.getActivityInfoForUser(aInfo, userId); if (aInfo != null && (aInfo.applicationInfo.privateFlags diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 33f949fccfb0..afcf9f98caa2 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -53,20 +53,20 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RESULTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_USER_LEAVING; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RESULTS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_USER_LEAVING; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.ActivityManagerService.ANIMATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RESULTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_USER_LEAVING; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RESULTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_USER_LEAVING; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerService.ANIMATE; import static com.android.server.am.ActivityStack.ActivityState.RESUMED; import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME; import static com.android.server.am.ActivityStackSupervisor.ON_TOP; @@ -127,7 +127,7 @@ import java.util.Date; * an activity and associated task and stack. */ class ActivityStarter { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStarter" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStarter" : TAG_ATM; private static final String TAG_RESULTS = TAG + POSTFIX_RESULTS; private static final String TAG_FOCUS = TAG + POSTFIX_FOCUS; private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; @@ -590,12 +590,12 @@ class ActivityStarter { final Bundle verificationBundle = options != null ? options.popAppVerificationBundle() : null; - ProcessRecord callerApp = null; + WindowProcessController callerApp = null; if (caller != null) { - callerApp = mService.mAm.getRecordForAppLocked(caller); + callerApp = mService.getProcessController(caller); if (callerApp != null) { - callingPid = callerApp.pid; - callingUid = callerApp.info.uid; + callingPid = callerApp.getPid(); + callingUid = callerApp.mInfo.uid; } else { Slog.w(TAG, "Unable to find app for caller " + caller + " (pid=" + callingPid + ") when starting: " @@ -726,14 +726,12 @@ class ActivityStarter { boolean abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, requestCode, callingPid, callingUid, callingPackage, ignoreTargetSecurity, inTask != null, callerApp, resultRecord, resultStack); - abort |= !mService.mAm.mIntentFirewall.checkStartActivity(intent, callingUid, + abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid, callingPid, resolvedType, aInfo.applicationInfo); - final WindowProcessController callerWpc = - callerApp != null ? callerApp.getWindowProcessController() : null; // Merge the two options bundles, while realCallerOptions takes precedence. ActivityOptions checkedOptions = options != null - ? options.getOptions(intent, aInfo, callerWpc, mSupervisor) : null; + ? options.getOptions(intent, aInfo, callerApp, mSupervisor) : null; if (allowPendingRemoteAnimationRegistryLookup) { checkedOptions = mService.getActivityStartController() .getPendingRemoteAnimationRegistry() @@ -833,8 +831,7 @@ class ActivityStarter { aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags, null /*profilerInfo*/); } - ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, - callingUid, + ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid, callingPackage, intent, resolvedType, aInfo, mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode, componentSpecified, voiceSession != null, mSupervisor, checkedOptions, sourceRecord); @@ -857,7 +854,7 @@ class ActivityStarter { if (!mService.checkAppSwitchAllowedLocked(callingPid, callingUid, realCallingPid, realCallingUid, "Activity start")) { mController.addPendingActivityLaunch(new PendingActivityLaunch(r, - sourceRecord, startFlags, stack, callerWpc)); + sourceRecord, startFlags, stack, callerApp)); ActivityOptions.abort(checkedOptions); return ActivityManager.START_SWITCHES_CANCELED; } @@ -874,12 +871,11 @@ class ActivityStarter { } private void maybeLogActivityStart(int callingUid, String callingPackage, int realCallingUid, - Intent intent, ProcessRecord callerApp, ActivityRecord r, + Intent intent, WindowProcessController callerApp, ActivityRecord r, PendingIntentRecord originatingPendingIntent) { - boolean callerAppHasForegroundActivity = (callerApp != null) - ? callerApp.foregroundActivities - : false; - if (!mService.mAm.isActivityStartsLoggingEnabled() || callerAppHasForegroundActivity + boolean callerAppHasForegroundActivity = + callerApp != null && callerApp.hasForegroundActivities(); + if (!mService.isActivityStartsLoggingEnabled() || callerAppHasForegroundActivity || r == null) { // skip logging in this case return; @@ -1085,9 +1081,10 @@ class ActivityStarter { || !heavy.mName.equals(aInfo.processName))) { int appCallingUid = callingUid; if (caller != null) { - ProcessRecord callerApp = mService.mAm.getRecordForAppLocked(caller); + WindowProcessController callerApp = + mService.getProcessController(caller); if (callerApp != null) { - appCallingUid = callerApp.info.uid; + appCallingUid = callerApp.mInfo.uid; } else { Slog.w(TAG, "Unable to find app for caller " + caller + " (pid=" + callingPid + ") when starting: " @@ -1127,7 +1124,7 @@ class ActivityStarter { callingUid, realCallingUid, mRequest.filterCallingUid)); aInfo = rInfo != null ? rInfo.activityInfo : null; if (aInfo != null) { - aInfo = mService.mAm.getActivityInfoForUser(aInfo, userId); + aInfo = mService.mAmInternal.getActivityInfoForUser(aInfo, userId); } } } @@ -1493,8 +1490,9 @@ class ActivityStarter { mService.mUgmInternal.grantUriPermissionFromIntent(mCallingUid, mStartActivity.packageName, mIntent, mStartActivity.getUriPermissionsLocked(), mStartActivity.userId); - mService.mAm.grantEphemeralAccessLocked(mStartActivity.userId, mIntent, - UserHandle.getAppId(mStartActivity.appInfo.uid), UserHandle.getAppId(mCallingUid)); + mService.getPackageManagerInternalLocked().grantEphemeralAccess( + mStartActivity.userId, mIntent, UserHandle.getAppId(mStartActivity.appInfo.uid), + UserHandle.getAppId(mCallingUid)); if (newTask) { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, mStartActivity.userId, mStartActivity.getTask().taskId); @@ -1608,8 +1606,8 @@ class ActivityStarter { mLaunchParams.reset(); - mSupervisor.getLaunchParamsController().calculate(inTask, null /*layout*/, r, sourceRecord, - options, mLaunchParams); + mSupervisor.getLaunchParamsController().calculate(inTask, r.info.windowLayout, r, + sourceRecord, options, mLaunchParams); if (mLaunchParams.hasPreferredDisplay()) { mPreferredDisplayId = mLaunchParams.mPreferredDisplayId; diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityTaskManagerDebugConfig.java new file mode 100644 index 000000000000..cf727380ae6b --- /dev/null +++ b/services/core/java/com/android/server/am/ActivityTaskManagerDebugConfig.java @@ -0,0 +1,91 @@ +/* + * Copyright (C) 2018 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; + +/** + * Common class for the various debug {@link android.util.Log} output configuration relating to + * activities. + */ +public class ActivityTaskManagerDebugConfig { + // All output logs relating to acitvities use the {@link #TAG_ATM} string for tagging their log + // output. This makes it easy to identify the origin of the log message when sifting + // through a large amount of log output from multiple sources. However, it also makes trying + // to figure-out the origin of a log message while debugging the activity manager a little + // painful. By setting this constant to true, log messages from the activity manager package + // will be tagged with their class names instead fot the generic tag. + static final boolean TAG_WITH_CLASS_NAME = false; + + // While debugging it is sometimes useful to have the category name of the log appended to the + // base log tag to make sifting through logs with the same base tag easier. By setting this + // constant to true, the category name of the log point will be appended to the log tag. + private static final boolean APPEND_CATEGORY_NAME = false; + + // Default log tag for the activities. + static final String TAG_ATM = "ActivityTaskManager"; + + // Enable all debug log categories. + static final boolean DEBUG_ALL = false; + + // Enable all debug log categories for activities. + private static final boolean DEBUG_ALL_ACTIVITIES = DEBUG_ALL || false; + + static final boolean DEBUG_ADD_REMOVE = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_CONFIGURATION = DEBUG_ALL || false; + static final boolean DEBUG_CONTAINERS = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_FOCUS = false; + static final boolean DEBUG_IMMERSIVE = DEBUG_ALL || false; + static final boolean DEBUG_LOCKTASK = DEBUG_ALL || false; + static final boolean DEBUG_PAUSE = DEBUG_ALL || false; + static final boolean DEBUG_RECENTS = DEBUG_ALL || false; + static final boolean DEBUG_RECENTS_TRIM_TASKS = DEBUG_RECENTS || false; + static final boolean DEBUG_SAVED_STATE = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_STACK = DEBUG_ALL || false; + static final boolean DEBUG_STATES = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_SWITCH = DEBUG_ALL || false; + static final boolean DEBUG_TASKS = DEBUG_ALL || false; + static final boolean DEBUG_TRANSITION = DEBUG_ALL || false; + static final boolean DEBUG_VISIBILITY = DEBUG_ALL || false; + static final boolean DEBUG_APP = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_IDLE = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_RELEASE = DEBUG_ALL_ACTIVITIES || false; + static final boolean DEBUG_USER_LEAVING = DEBUG_ALL || false; + static final boolean DEBUG_PERMISSIONS_REVIEW = DEBUG_ALL || false; + static final boolean DEBUG_RESULTS = DEBUG_ALL || false; + static final boolean DEBUG_CLEANUP = DEBUG_ALL || false; + static final boolean DEBUG_METRICS = DEBUG_ALL || false; + + static final String POSTFIX_APP = APPEND_CATEGORY_NAME ? "_App" : ""; + static final String POSTFIX_IDLE = APPEND_CATEGORY_NAME ? "_Idle" : ""; + static final String POSTFIX_RELEASE = APPEND_CATEGORY_NAME ? "_Release" : ""; + static final String POSTFIX_USER_LEAVING = APPEND_CATEGORY_NAME ? "_UserLeaving" : ""; + static final String POSTFIX_ADD_REMOVE = APPEND_CATEGORY_NAME ? "_AddRemove" : ""; + static final String POSTFIX_CONFIGURATION = APPEND_CATEGORY_NAME ? "_Configuration" : ""; + static final String POSTFIX_CONTAINERS = APPEND_CATEGORY_NAME ? "_Containers" : ""; + static final String POSTFIX_FOCUS = APPEND_CATEGORY_NAME ? "_Focus" : ""; + static final String POSTFIX_IMMERSIVE = APPEND_CATEGORY_NAME ? "_Immersive" : ""; + static final String POSTFIX_LOCKTASK = APPEND_CATEGORY_NAME ? "_LockTask" : ""; + static final String POSTFIX_PAUSE = APPEND_CATEGORY_NAME ? "_Pause" : ""; + static final String POSTFIX_RECENTS = APPEND_CATEGORY_NAME ? "_Recents" : ""; + static final String POSTFIX_SAVED_STATE = APPEND_CATEGORY_NAME ? "_SavedState" : ""; + static final String POSTFIX_STACK = APPEND_CATEGORY_NAME ? "_Stack" : ""; + static final String POSTFIX_STATES = APPEND_CATEGORY_NAME ? "_States" : ""; + static final String POSTFIX_SWITCH = APPEND_CATEGORY_NAME ? "_Switch" : ""; + static final String POSTFIX_TASKS = APPEND_CATEGORY_NAME ? "_Tasks" : ""; + static final String POSTFIX_TRANSITION = APPEND_CATEGORY_NAME ? "_Transition" : ""; + static final String POSTFIX_VISIBILITY = APPEND_CATEGORY_NAME ? "_Visibility" : ""; + static final String POSTFIX_RESULTS = APPEND_CATEGORY_NAME ? "_Results" : ""; +} diff --git a/services/core/java/com/android/server/am/ActivityTaskManagerService.java b/services/core/java/com/android/server/am/ActivityTaskManagerService.java index b369b7135b4e..6398680b7122 100644 --- a/services/core/java/com/android/server/am/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/am/ActivityTaskManagerService.java @@ -40,6 +40,7 @@ import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_SECOND import static android.app.WindowConfiguration.WINDOWING_MODE_UNDEFINED; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.content.pm.ApplicationInfo.FLAG_FACTORY_TEST; +import static android.content.pm.ConfigurationInfo.GL_ES_VERSION_UNDEFINED; import static android.content.pm.PackageManager.FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS; import static android.content.pm.PackageManager.FEATURE_FREEFORM_WINDOW_MANAGEMENT; import static android.content.pm.PackageManager.FEATURE_PC; @@ -67,29 +68,26 @@ import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE; import static android.view.WindowManager.TRANSIT_TASK_OPEN; import static android.view.WindowManager.TRANSIT_TASK_TO_FRONT; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_IMMERSIVE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_FOCUS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_IMMERSIVE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_STACK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_SWITCH; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.ActivityManagerService.ANIMATE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ALL; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_IMMERSIVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_FOCUS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_IMMERSIVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_STACK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_SWITCH; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_VISIBILITY; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityManagerService.MY_PID; -import static com.android.server.am.ActivityManagerService.SEND_LOCALE_TO_MOUNT_DAEMON_MSG; import static com.android.server.am.ActivityManagerService.STOCK_PM_FLAGS; -import static com.android.server.am.ActivityManagerService.UPDATE_CONFIGURATION_MSG; import static com.android.server.am.ActivityManagerService.dumpStackTraces; import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_DESTROYING; import static com.android.server.am.ActivityStackSupervisor.DEFER_RESUME; @@ -100,7 +98,7 @@ import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS; import static com.android.server.am.ActivityTaskManagerService.H.REPORT_TIME_TRACKER_MSG; import static com.android.server.am.ActivityTaskManagerService.UiHandler.DISMISS_DIALOG_UI_MSG; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT; import static com.android.server.am.TaskRecord.REPARENT_LEAVE_STACK_IN_PLACE; @@ -141,7 +139,7 @@ import android.app.WindowConfiguration; import android.app.admin.DevicePolicyCache; import android.app.assist.AssistContent; import android.app.assist.AssistStructure; -import android.app.usage.UsageEvents; +import android.app.usage.UsageStatsManagerInternal; import android.content.ActivityNotFoundException; import android.content.ComponentName; import android.content.ContentResolver; @@ -179,6 +177,7 @@ import android.os.Looper; import android.os.Message; import android.os.PersistableBundle; import android.os.PowerManager; +import android.os.PowerManagerInternal; import android.os.RemoteException; import android.os.ServiceManager; import android.os.StrictMode; @@ -189,6 +188,8 @@ import android.os.UpdateLock; import android.os.UserHandle; import android.os.UserManager; import android.os.WorkSource; +import android.os.storage.IStorageManager; +import android.os.storage.StorageManager; import android.provider.Settings; import android.service.voice.IVoiceInteractionSession; import android.service.voice.VoiceInteractionManagerInternal; @@ -230,6 +231,7 @@ import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.SystemServiceManager; import com.android.server.Watchdog; +import com.android.server.firewall.IntentFirewall; import com.android.server.pm.UserManagerService; import com.android.server.uri.UriGrantsManagerInternal; import com.android.server.vr.VrManagerInternal; @@ -254,7 +256,7 @@ import java.util.Locale; * {@hide} */ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { - private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskManagerService" : TAG_ATM; private static final String TAG_STACK = TAG + POSTFIX_STACK; private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH; private static final String TAG_IMMERSIVE = TAG + POSTFIX_IMMERSIVE; @@ -268,12 +270,19 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // How long we wait until we timeout on key dispatching during instrumentation. private static final int INSTRUMENTATION_KEY_DISPATCHING_TIMEOUT_MS = 60 * 1000; + /** Used to indicate that an app transition should be animated. */ + static final boolean ANIMATE = true; + + /** Hardware-reported OpenGLES version. */ + final int GL_ES_VERSION; + Context mContext; /** * This Context is themable and meant for UI display (AlertDialogs, etc.). The theme can * change at runtime. Use mContext for non-UI purposes. */ final Context mUiContext; + final ActivityThread mSystemThread; H mH; UiHandler mUiHandler; ActivityManagerService mAm; @@ -281,7 +290,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { UriGrantsManagerInternal mUgmInternal; private PackageManagerInternal mPmInternal; private ActivityTaskManagerInternal mInternal; + PowerManagerInternal mPowerManagerInternal; + private UsageStatsManagerInternal mUsageStatsInternal; + PendingIntentController mPendingIntentController; + IntentFirewall mIntentFirewall; + /* Global service lock used by the package the owns this service. */ Object mGlobalLock; ActivityStackSupervisor mStackSupervisor; @@ -536,8 +550,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { ActivityTaskManagerService(Context context) { mContext = context; mFactoryTest = FactoryTest.getMode(); - mUiContext = ActivityThread.currentActivityThread().getSystemUiContext(); + mSystemThread = ActivityThread.currentActivityThread(); + mUiContext = mSystemThread.getSystemUiContext(); mLifecycleManager = new ClientLifecycleManager(); + GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version", GL_ES_VERSION_UNDEFINED); } void onSystemReady() { @@ -551,6 +567,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { void onInitPowerManagement() { mStackSupervisor.initPowerManagement(); final PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE); + mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); mVoiceWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*voice*"); mVoiceWakeLock.setReferenceCounted(false); } @@ -637,15 +654,17 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } // TODO: Will be converted to WM lock once transition is complete. - void setActivityManagerService(ActivityManagerService am) { + void setActivityManagerService(ActivityManagerService am, Looper looper, + IntentFirewall intentFirewall, PendingIntentController intentController) { mAm = am; mGlobalLock = mAm; - mH = new H(mAm.mHandlerThread.getLooper()); + mH = new H(looper); mUiHandler = new UiHandler(); + mIntentFirewall = intentFirewall; final File systemDir = SystemServiceManager.ensureSystemDir(); mAppWarnings = new AppWarnings(this, mUiContext, mH, mUiHandler, systemDir); mCompatModePackages = new CompatModePackages(this, systemDir, mH); - mPendingIntentController = mAm.mPendingIntentController; + mPendingIntentController = intentController; mTempConfig.setToDefaults(); mTempConfig.setLocales(LocaleList.getDefault()); @@ -684,6 +703,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mLockTaskController.setWindowManager(wm); } + void setUsageStatsManager(UsageStatsManagerInternal usageStatsManager) { + mUsageStatsInternal = usageStatsManager; + } + UserManagerService getUserManager() { if (mUserManager == null) { IBinder b = ServiceManager.getService(Context.USER_SERVICE); @@ -763,7 +786,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { && globalConfig.keyboard != Configuration.KEYBOARD_NOKEYS) { config.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; } - config.reqGlEsVersion = mAm.GL_ES_VERSION; + config.reqGlEsVersion = GL_ES_VERSION; } return config; } @@ -2761,8 +2784,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { synchronized (mGlobalLock) { final long origId = Binder.clearCallingIdentity(); try { - WindowProcessController app = - mAm.getRecordForAppLocked(appInt).getWindowProcessController(); + final WindowProcessController app = getProcessController(appInt); mStackSupervisor.releaseSomeActivitiesLocked(app, "low-mem"); } finally { Binder.restoreCallingIdentity(origId); @@ -2783,7 +2805,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { long ident = Binder.clearCallingIdentity(); if (mKeyguardShown != keyguardShowing) { mKeyguardShown = keyguardShowing; - reportCurKeyguardUsageEventLocked(keyguardShowing); + final Message msg = PooledLambda.obtainMessage( + ActivityManagerInternal::reportCurKeyguardUsageEvent, mAmInternal, + keyguardShowing); + mH.sendMessage(msg); } try { mKeyguardController.setKeyguardShown(keyguardShowing, aodShowing, @@ -2920,12 +2945,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mTaskChangeNotificationController.unregisterTaskStackListener(listener); } - private void reportCurKeyguardUsageEventLocked(boolean keyguardShowing) { - mAm.reportGlobalUsageEventLocked(keyguardShowing - ? UsageEvents.Event.KEYGUARD_SHOWN - : UsageEvents.Event.KEYGUARD_HIDDEN); - } - @Override public boolean requestAssistContextExtras(int requestType, IAssistDataReceiver receiver, Bundle receiverExtras, IBinder activityToken, boolean focused, boolean newSessionId) { @@ -3892,8 +3911,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (mWindowManager != null) { - // Update OOM levels based on display size. - mAm.mProcessList.applyDisplaySize(mWindowManager); + final Message msg = PooledLambda.obtainMessage( + ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal, displayId); + mH.sendMessage(msg); } final long origId = Binder.clearCallingIdentity(); @@ -3921,8 +3941,10 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } if (mWindowManager != null) { - // Update OOM levels based on display size. - mAm.mProcessList.applyDisplaySize(mWindowManager); + final Message msg = PooledLambda.obtainMessage( + ActivityManagerInternal::updateOomLevelsForDisplay, mAmInternal, + DEFAULT_DISPLAY); + mH.sendMessage(msg); } final long origId = Binder.clearCallingIdentity(); @@ -4129,11 +4151,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { public void setVrThread(int tid) { enforceSystemHasVrFeature(); synchronized (mGlobalLock) { - synchronized (mAm.mPidsSelfLocked) { - final int pid = Binder.getCallingPid(); - final ProcessRecord proc = mAm.mPidsSelfLocked.get(pid); - mVrController.setVrThreadLocked(tid, pid, proc.getWindowProcessController()); - } + final int pid = Binder.getCallingPid(); + final WindowProcessController wpc = mPidMap.get(pid); + mVrController.setVrThreadLocked(tid, pid, wpc); } } @@ -4150,11 +4170,9 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { } enforceSystemHasVrFeature(); synchronized (mGlobalLock) { - synchronized (mAm.mPidsSelfLocked) { - final int pid = Binder.getCallingPid(); - final ProcessRecord proc = mAm.mPidsSelfLocked.get(pid); - mVrController.setPersistentVrThreadLocked(tid, pid, proc); - } + final int pid = Binder.getCallingPid(); + final WindowProcessController proc = mPidMap.get(pid); + mVrController.setPersistentVrThreadLocked(tid, pid, proc); } } @@ -4486,8 +4504,11 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { SystemProperties.set("persist.sys.locale", locales.get(bestLocaleIndex).toLanguageTag()); LocaleList.setDefault(locales, bestLocaleIndex); - mAm.mHandler.sendMessage(mAm.mHandler.obtainMessage(SEND_LOCALE_TO_MOUNT_DAEMON_MSG, - locales.get(bestLocaleIndex))); + + final Message m = PooledLambda.obtainMessage( + ActivityTaskManagerService::sendLocaleToMountDaemonMsg, this, + locales.get(bestLocaleIndex)); + mH.sendMessage(m); } mTempConfig.seq = increaseConfigurationSeqLocked(); @@ -4497,8 +4518,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { Slog.i(TAG, "Config changes=" + Integer.toHexString(changes) + " " + mTempConfig); // TODO(multi-display): Update UsageEvents#Event to include displayId. - mAm.mUsageStatsService.reportConfigurationChange( - mTempConfig, mAmInternal.getCurrentUserId()); + mUsageStatsInternal.reportConfigurationChange(mTempConfig, mAmInternal.getCurrentUserId()); // TODO: If our config changes, should we auto dismiss any currently showing dialogs? updateShouldShowDialogsLocked(mTempConfig); @@ -4512,16 +4532,16 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // to retrieve resource values after we return will be sure to get the new ones. This is // especially important during boot, where the first config change needs to guarantee all // resources have that config before following boot code is executed. - mAm.mSystemThread.applyConfigurationToResources(mTempConfig); + mSystemThread.applyConfigurationToResources(mTempConfig); // We need another copy of global config because we're scheduling some calls instead of // running them in place. We need to be sure that object we send will be handled unchanged. final Configuration configCopy = new Configuration(mTempConfig); if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) { - Message msg = mAm.mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG); - msg.obj = configCopy; - msg.arg1 = userId; - mAm.mHandler.sendMessage(msg); + final Message msg = PooledLambda.obtainMessage( + ActivityTaskManagerService::sendPutConfigurationForUserMsg, + this, userId, configCopy); + mH.sendMessage(msg); } for (int i = mPidMap.size() - 1; i >= 0; i--) { @@ -4659,6 +4679,26 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mWindowManager.setEventDispatching(booted && !mShuttingDown); } + private void sendPutConfigurationForUserMsg(int userId, Configuration config) { + final ContentResolver resolver = mContext.getContentResolver(); + Settings.System.putConfigurationForUser(resolver, config, userId); + } + + private void sendLocaleToMountDaemonMsg(Locale l) { + try { + IBinder service = ServiceManager.getService("mount"); + IStorageManager storageManager = IStorageManager.Stub.asInterface(service); + Log.d(TAG, "Storing locale " + l.toLanguageTag() + " for decryption UI"); + storageManager.setField(StorageManager.SYSTEM_LOCALE_KEY, l.toLanguageTag()); + } catch (RemoteException e) { + Log.e(TAG, "Error storing locale for decryption UI", e); + } + } + + boolean isActivityStartsLoggingEnabled() { + return mAmInternal.isActivityStartsLoggingEnabled(); + } + void enableScreenAfterBoot(boolean booted) { EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN, SystemClock.uptimeMillis()); @@ -5266,6 +5306,26 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return mProcessNames.get(processName, uid); } + WindowProcessController getProcessController(IApplicationThread thread) { + if (thread == null) { + return null; + } + + final IBinder threadBinder = thread.asBinder(); + final ArrayMap<String, SparseArray<WindowProcessController>> pmap = mProcessNames.getMap(); + for (int i = pmap.size()-1; i >= 0; i--) { + final SparseArray<WindowProcessController> procs = pmap.valueAt(i); + for (int j = procs.size() - 1; j >= 0; j--) { + final WindowProcessController proc = procs.valueAt(j); + if (proc.hasThread() && proc.getThread().asBinder() == threadBinder) { + return proc; + } + } + } + + return null; + } + void logAppTooSlow(WindowProcessController app, long startTime, String msg) { if (true || Build.IS_USER) { return; @@ -5327,6 +5387,8 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { final class H extends Handler { static final int REPORT_TIME_TRACKER_MSG = 1; + static final int FIRST_ACTIVITY_STACK_MSG = 100; + static final int FIRST_SUPERVISOR_STACK_MSG = 200; public H(Looper looper) { super(looper, null, true); @@ -5971,7 +6033,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { mUiHandler.post(() -> { Dialog d = new FactoryErrorDialog(mUiContext, errorMsg); d.show(); - mAm.ensureBootCompleted(); + mAmInternal.ensureBootCompleted(); }); } } diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 6a9c8877ce5b..a05fbc695370 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -684,7 +684,7 @@ class AppErrors { Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0; final boolean procIsBoundForeground = - (app.curProcState == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); + (app.getCurProcState() == ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE); Long crashTime; Long crashTimePersistent; @@ -878,7 +878,7 @@ class AppErrors { // several places in the system server. return app.isInterestingToUserLocked() || (app.info != null && "com.android.systemui".equals(app.info.packageName)) || - (app.hasTopUi || app.hasOverlayUi); + (app.hasTopUi() || app.hasOverlayUi()); } final void appNotResponding(ProcessRecord app, ActivityRecord activity, diff --git a/services/core/java/com/android/server/am/CompatModePackages.java b/services/core/java/com/android/server/am/CompatModePackages.java index 536f3a93a3f1..3c4ab006a4b6 100644 --- a/services/core/java/com/android/server/am/CompatModePackages.java +++ b/services/core/java/com/android/server/am/CompatModePackages.java @@ -16,8 +16,11 @@ package com.android.server.am; -import static com.android.server.am.ActivityManagerDebugConfig.*; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import java.io.File; import java.io.FileInputStream; @@ -48,7 +51,7 @@ import android.util.Slog; import android.util.Xml; public final class CompatModePackages { - private static final String TAG = TAG_WITH_CLASS_NAME ? "CompatModePackages" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "CompatModePackages" : TAG_ATM; private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; private final ActivityTaskManagerService mService; @@ -61,7 +64,7 @@ public final class CompatModePackages { private final HashMap<String, Integer> mPackages = new HashMap<String, Integer>(); - private static final int MSG_WRITE = ActivityManagerService.FIRST_COMPAT_MODE_MSG; + private static final int MSG_WRITE = 300; private final CompatHandler mHandler; @@ -321,16 +324,16 @@ public final class CompatModePackages { ActivityRecord starting = stack.restartPackage(packageName); // Tell all processes that loaded this package about the change. - for (int i = mService.mAm.mLruProcesses.size() - 1; i >= 0; i--) { - final ProcessRecord app = mService.mAm.mLruProcesses.get(i); - if (!app.pkgList.containsKey(packageName)) { + for (int i = mService.mPidMap.size() - 1; i >= 0; i--) { + final WindowProcessController app = mService.mPidMap.valueAt(i); + if (!app.mPkgList.contains(packageName)) { continue; } try { - if (app.thread != null) { + if (app.hasThread()) { if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Sending to proc " - + app.processName + " new compat " + ci); - app.thread.updatePackageCompatibilityInfo(packageName, ci); + + app.mName + " new compat " + ci); + app.getThread().updatePackageCompatibilityInfo(packageName, ci); } } catch (Exception e) { } diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 09c152ef5135..2ca134465cd6 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -56,6 +56,10 @@ final class CoreSettingsObserver extends ContentObserver { sGlobalSettingToTypeMap.put(Settings.Global.DEBUG_VIEW_ATTRIBUTES, int.class); sGlobalSettingToTypeMap.put(Settings.Global.ANGLE_ENABLED_APP, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.ENABLE_GPU_DEBUG_LAYERS, int.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_APP, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYERS, String.class); + sGlobalSettingToTypeMap.put(Settings.Global.GPU_DEBUG_LAYER_APP, String.class); // add other global settings here... } diff --git a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java index e5add58f287a..b39873fe4335 100644 --- a/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java +++ b/services/core/java/com/android/server/am/DeprecatedTargetSdkVersionDialog.java @@ -16,8 +16,8 @@ package com.android.server.am; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import android.app.AlertDialog; import android.content.Context; @@ -34,7 +34,7 @@ import com.android.internal.R; import com.android.server.utils.AppInstallerUtil; public class DeprecatedTargetSdkVersionDialog { - private static final String TAG = TAG_WITH_CLASS_NAME ? "DeprecatedTargetSdkVersionDialog" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "DeprecatedTargetSdkVersionDialog" : TAG_ATM; private final AlertDialog mDialog; private final String mPackageName; diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java index cfe282917f3b..28b2a42522eb 100644 --- a/services/core/java/com/android/server/am/KeyguardController.java +++ b/services/core/java/com/android/server/am/KeyguardController.java @@ -30,9 +30,9 @@ import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_TO_SHADE; import static android.view.WindowManagerPolicyConstants.KEYGUARD_GOING_AWAY_FLAG_WITH_WALLPAPER; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.KeyguardControllerProto.KEYGUARD_OCCLUDED_STATES; import static com.android.server.am.KeyguardControllerProto.KEYGUARD_SHOWING; import static com.android.server.am.KeyguardOccludedProto.DISPLAY_ID; @@ -60,7 +60,7 @@ import java.io.PrintWriter; */ class KeyguardController { - private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "KeyguardController" : TAG_ATM; private final ActivityStackSupervisor mStackSupervisor; private WindowManagerService mWindowManager; diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java index 643c922ad2ca..5b31d5fc593f 100644 --- a/services/core/java/com/android/server/am/LockTaskController.java +++ b/services/core/java/com/android/server/am/LockTaskController.java @@ -28,10 +28,10 @@ import static android.os.UserHandle.USER_CURRENT; import static android.telecom.TelecomManager.EMERGENCY_DIALER_COMPONENT; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE; import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_LAUNCHABLE_PRIV; @@ -84,7 +84,7 @@ import java.util.Arrays; * @see Activity#stopLockTask() */ public class LockTaskController { - private static final String TAG = TAG_WITH_CLASS_NAME ? "LockTaskController" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "LockTaskController" : TAG_ATM; private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; @VisibleForTesting diff --git a/services/core/java/com/android/server/am/MemoryStatUtil.java b/services/core/java/com/android/server/am/MemoryStatUtil.java index a8e1ccca8b9d..98f3f95ebb87 100644 --- a/services/core/java/com/android/server/am/MemoryStatUtil.java +++ b/services/core/java/com/android/server/am/MemoryStatUtil.java @@ -16,7 +16,7 @@ package com.android.server.am; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_METRICS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_METRICS; import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index 667d3faefc9f..3128333def6f 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -136,7 +136,7 @@ final class ProcessRecord implements WindowProcessListener { private int mCurSchedGroup; // Currently desired scheduling class int setSchedGroup; // Last set to background scheduling class int trimMemoryLevel; // Last selected memory trimming level - int curProcState = PROCESS_STATE_NONEXISTENT; // Currently computed process state + private int mCurProcState = PROCESS_STATE_NONEXISTENT; // Currently computed process state private int mRepProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state int setProcState = PROCESS_STATE_NONEXISTENT; // Last set process state in process tracker int pssProcState = PROCESS_STATE_NONEXISTENT; // Currently requesting pss for @@ -146,19 +146,19 @@ final class ProcessRecord implements WindowProcessListener { boolean serviceb; // Process currently is on the service B list boolean serviceHighRam; // We are forcing to service B list due to its RAM use boolean notCachedSinceIdle; // Has this process not been in a cached state since last idle? - boolean hasClientActivities; // Are there any client services with activities? + private boolean mHasClientActivities; // Are there any client services with activities? boolean hasStartedServices; // Are there any started services running in this process? private boolean mHasForegroundServices; // Running any services that are foreground? - boolean foregroundActivities; // Running any activities that are foreground? + private boolean mHasForegroundActivities; // Running any activities that are foreground? boolean repForegroundActivities; // Last reported foreground activities. boolean systemNoUi; // This is a system process, but not currently showing UI. boolean hasShownUi; // Has UI been shown in this process since it was started? - boolean hasTopUi; // Is this process currently showing a non-activity UI that the user + private boolean mHasTopUi; // Is this process currently showing a non-activity UI that the user // is interacting with? E.g. The status bar when it is expanded, but // not when it is minimized. When true the // process will be set to use the ProcessList#SCHED_GROUP_TOP_APP // scheduling group to boost performance. - boolean hasOverlayUi; // Is the process currently showing a non-activity UI that + private boolean mHasOverlayUi; // Is the process currently showing a non-activity UI that // overlays on-top of activity UIs on screen. E.g. display a window // of type // android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY @@ -171,7 +171,7 @@ final class ProcessRecord implements WindowProcessListener { // performance, as well as oom adj score will be set to // ProcessList#VISIBLE_APP_ADJ at minimum to reduce the chance // of the process getting killed. - boolean pendingUiClean; // Want to clean up resources from showing UI? + private boolean mPendingUiClean; // Want to clean up resources from showing UI? boolean hasAboveClient; // Bound using BIND_ABOVE_CLIENT, so want to be lower boolean treatLikeActivity; // Bound using BIND_TREAT_LIKE_ACTIVITY boolean bad; // True if disabled in the bad process list @@ -180,8 +180,8 @@ final class ProcessRecord implements WindowProcessListener { boolean procStateChanged; // Keep track of whether we changed 'setAdj'. boolean reportedInteraction;// Whether we have told usage stats about it being an interaction boolean unlocked; // True when proc was started in user unlocked state - long interactionEventTime; // The time we sent the last interaction event - long fgInteractionTime; // When we became foreground for interaction purposes + private long mInteractionEventTime; // The time we sent the last interaction event + private long mFgInteractionTime; // When we became foreground for interaction purposes String waitingToKill; // Process is waiting to be killed when in the bg, and reason Object forcingToImportant; // Token that is forcing this process to be important int adjSeq; // Sequence id for identifying oom_adj assignment cycles @@ -194,7 +194,7 @@ final class ProcessRecord implements WindowProcessListener { // process. private boolean mUsingWrapper; // Set to true when process was launched with a wrapper attached final ArraySet<BroadcastRecord> curReceivers = new ArraySet<BroadcastRecord>();// receivers currently running in the app - long whenUnimportant; // When (uptime) the process last became unimportant + private long mWhenUnimportant; // When (uptime) the process last became unimportant long lastCpuTime; // How long proc has run CPU at last check long curCpuTime; // How long proc has run CPU most recently long lastRequestedGc; // When we last asked the app to do a gc @@ -370,38 +370,38 @@ final class ProcessRecord implements WindowProcessListener { pw.print(" setSchedGroup="); pw.print(setSchedGroup); pw.print(" systemNoUi="); pw.print(systemNoUi); pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel); - pw.print(prefix); pw.print("curProcState="); pw.print(curProcState); + pw.print(prefix); pw.print("curProcState="); pw.print(getCurProcState()); pw.print(" mRepProcState="); pw.print(mRepProcState); pw.print(" pssProcState="); pw.print(pssProcState); pw.print(" setProcState="); pw.print(setProcState); pw.print(" lastStateTime="); TimeUtils.formatDuration(lastStateTime, nowUptime, pw); pw.println(); - if (hasShownUi || pendingUiClean || hasAboveClient || treatLikeActivity) { + if (hasShownUi || mPendingUiClean || hasAboveClient || treatLikeActivity) { pw.print(prefix); pw.print("hasShownUi="); pw.print(hasShownUi); - pw.print(" pendingUiClean="); pw.print(pendingUiClean); + pw.print(" pendingUiClean="); pw.print(mPendingUiClean); pw.print(" hasAboveClient="); pw.print(hasAboveClient); pw.print(" treatLikeActivity="); pw.println(treatLikeActivity); } - if (hasTopUi || hasOverlayUi || runningRemoteAnimation) { - pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi); - pw.print(" hasOverlayUi="); pw.print(hasOverlayUi); + if (hasTopUi() || hasOverlayUi() || runningRemoteAnimation) { + pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi()); + pw.print(" hasOverlayUi="); pw.print(hasOverlayUi()); pw.print(" runningRemoteAnimation="); pw.println(runningRemoteAnimation); } if (mHasForegroundServices || forcingToImportant != null) { pw.print(prefix); pw.print("mHasForegroundServices="); pw.print(mHasForegroundServices); pw.print(" forcingToImportant="); pw.println(forcingToImportant); } - if (reportedInteraction || fgInteractionTime != 0) { + if (reportedInteraction || mFgInteractionTime != 0) { pw.print(prefix); pw.print("reportedInteraction="); pw.print(reportedInteraction); - if (interactionEventTime != 0) { + if (mInteractionEventTime != 0) { pw.print(" time="); - TimeUtils.formatDuration(interactionEventTime, SystemClock.elapsedRealtime(), pw); + TimeUtils.formatDuration(mInteractionEventTime, SystemClock.elapsedRealtime(), pw); } - if (fgInteractionTime != 0) { + if (mFgInteractionTime != 0) { pw.print(" fgInteractionTime="); - TimeUtils.formatDuration(fgInteractionTime, SystemClock.elapsedRealtime(), pw); + TimeUtils.formatDuration(mFgInteractionTime, SystemClock.elapsedRealtime(), pw); } pw.println(); } @@ -409,9 +409,9 @@ final class ProcessRecord implements WindowProcessListener { pw.print(prefix); pw.print("persistent="); pw.print(mPersistent); pw.print(" removed="); pw.println(removed); } - if (hasClientActivities || foregroundActivities || repForegroundActivities) { - pw.print(prefix); pw.print("hasClientActivities="); pw.print(hasClientActivities); - pw.print(" foregroundActivities="); pw.print(foregroundActivities); + if (mHasClientActivities || mHasForegroundActivities || repForegroundActivities) { + pw.print(prefix); pw.print("hasClientActivities="); pw.print(mHasClientActivities); + pw.print(" foregroundActivities="); pw.print(mHasForegroundActivities); pw.print(" (rep="); pw.print(repForegroundActivities); pw.println(")"); } if (lastProviderTime > 0) { @@ -438,7 +438,7 @@ final class ProcessRecord implements WindowProcessListener { TimeUtils.formatDuration(curCpuTime - lastCpuTime, pw); } pw.print(" whenUnimportant="); - TimeUtils.formatDuration(whenUnimportant - nowUptime, pw); + TimeUtils.formatDuration(mWhenUnimportant - nowUptime, pw); pw.println(); } pw.print(prefix); pw.print("lastRequestedGc="); @@ -857,7 +857,8 @@ final class ProcessRecord implements WindowProcessListener { public void forceProcessStateUpTo(int newState) { if (mRepProcState > newState) { - curProcState = mRepProcState = newState; + mRepProcState = newState; + setCurProcState(newState); for (int ipkg = pkgList.size() - 1; ipkg >= 0; ipkg--) { StatsLog.write(StatsLog.PROCESS_STATE_CHANGED, uid, processName, pkgList.keyAt(ipkg), @@ -931,6 +932,15 @@ final class ProcessRecord implements WindowProcessListener { return mCurSchedGroup; } + void setCurProcState(int curProcState) { + mCurProcState = curProcState; + mWindowProcessController.setCurrentProcState(mCurProcState); + } + + int getCurProcState() { + return mCurProcState; + } + void setReportedProcState(int repProcState) { mRepProcState = repProcState; for (int ipkg = pkgList.size() - 1; ipkg >= 0; ipkg--) { @@ -991,6 +1001,69 @@ final class ProcessRecord implements WindowProcessListener { return mHasForegroundServices; } + void setHasForegroundActivities(boolean hasForegroundActivities) { + mHasForegroundActivities = hasForegroundActivities; + mWindowProcessController.setHasForegroundActivities(hasForegroundActivities); + } + + boolean hasForegroundActivities() { + return mHasForegroundActivities; + } + + void setHasClientActivities(boolean hasClientActivities) { + mHasClientActivities = hasClientActivities; + mWindowProcessController.setHasClientActivities(hasClientActivities); + } + + boolean hasClientActivities() { + return mHasClientActivities; + } + + void setHasTopUi(boolean hasTopUi) { + mHasTopUi = hasTopUi; + mWindowProcessController.setHasTopUi(hasTopUi); + } + + boolean hasTopUi() { + return mHasTopUi; + } + + void setHasOverlayUi(boolean hasOverlayUi) { + mHasOverlayUi = hasOverlayUi; + mWindowProcessController.setHasOverlayUi(hasOverlayUi); + } + + boolean hasOverlayUi() { + return mHasOverlayUi; + } + + void setInteractionEventTime(long interactionEventTime) { + mInteractionEventTime = interactionEventTime; + mWindowProcessController.setInteractionEventTime(interactionEventTime); + } + + long getInteractionEventTime() { + return mInteractionEventTime; + } + + void setFgInteractionTime(long fgInteractionTime) { + mFgInteractionTime = fgInteractionTime; + mWindowProcessController.setFgInteractionTime(fgInteractionTime); + } + + long getFgInteractionTime() { + return mFgInteractionTime; + } + + void setWhenUnimportant(long whenUnimportant) { + mWhenUnimportant = whenUnimportant; + mWindowProcessController.setWhenUnimportant(whenUnimportant); + } + + long getWhenUnimportant() { + return mWhenUnimportant; + } + void setDebugging(boolean debugging) { mDebugging = debugging; mWindowProcessController.setDebugging(debugging); @@ -1039,14 +1112,19 @@ final class ProcessRecord implements WindowProcessListener { @Override public void setPendingUiClean(boolean pendingUiClean) { synchronized (mService) { - this.pendingUiClean = true; + mPendingUiClean = pendingUiClean; + mWindowProcessController.setPendingUiClean(pendingUiClean); } } + boolean hasPendingUiClean() { + return mPendingUiClean; + } + @Override public void setPendingUiCleanAndForceProcessStateUpTo(int newState) { synchronized (mService) { - pendingUiClean = true; + setPendingUiClean(true); forceProcessStateUpTo(newState); } } diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index dd13e9868b1d..57f939f4438b 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -33,15 +33,15 @@ import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.os.Process.SYSTEM_UID; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS_TRIM_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RECENTS_TRIM_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import android.app.ActivityManager; import android.app.ActivityTaskManager; @@ -103,7 +103,7 @@ import java.util.concurrent.TimeUnit; * // 'X' tasks are trimmed. */ class RecentTasks { - private static final String TAG = TAG_WITH_CLASS_NAME ? "RecentTasks" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "RecentTasks" : TAG_ATM; private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; private static final String TAG_TASKS = TAG + POSTFIX_TASKS; diff --git a/services/core/java/com/android/server/am/SafeActivityOptions.java b/services/core/java/com/android/server/am/SafeActivityOptions.java index fa0cb47ade02..115216592e71 100644 --- a/services/core/java/com/android/server/am/SafeActivityOptions.java +++ b/services/core/java/com/android/server/am/SafeActivityOptions.java @@ -21,9 +21,9 @@ import static android.Manifest.permission.START_TASKS_FROM_RECENTS; import static android.content.pm.PackageManager.PERMISSION_DENIED; import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.view.Display.INVALID_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; -import static com.android.server.am.TaskRecord.INVALID_TASK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import android.annotation.Nullable; import android.app.ActivityOptions; @@ -46,7 +46,7 @@ import com.android.internal.annotations.VisibleForTesting; */ public class SafeActivityOptions { - private static final String TAG = TAG_WITH_CLASS_NAME ? "SafeActivityOptions" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "SafeActivityOptions" : TAG_ATM; private final int mOriginalCallingPid; private final int mOriginalCallingUid; diff --git a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java index fd34d180ebc0..eae28127a67f 100644 --- a/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java +++ b/services/core/java/com/android/server/am/TaskLaunchParamsModifier.java @@ -35,8 +35,8 @@ import static android.util.DisplayMetrics.DENSITY_DEFAULT; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import android.annotation.NonNull; import android.annotation.Nullable; @@ -59,7 +59,7 @@ import java.util.List; * The class that defines the default launch params for tasks. */ class TaskLaunchParamsModifier implements LaunchParamsModifier { - private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskLaunchParamsModifier" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskLaunchParamsModifier" : TAG_ATM; private static final boolean DEBUG = false; // A mask for SUPPORTS_SCREEN that indicates the activity supports resize. @@ -131,16 +131,16 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { } // STEP 2: Resolve launch windowing mode. // STEP 2.1: Determine if any parameter has specified initial bounds. That might be the - // launch bounds from activity options, or size/gravity passed in layout. It also treat the + // launch bounds from activity options, or size/gravity passed in layout. It also treats the // launch windowing mode in options as a suggestion for future resolution. int launchMode = options != null ? options.getLaunchWindowingMode() : WINDOWING_MODE_UNDEFINED; // hasInitialBounds is set if either activity options or layout has specified bounds. If // that's set we'll skip some adjustments later to avoid overriding the initial bounds. boolean hasInitialBounds = false; - final boolean canApplyFreeformPolicy = - canApplyFreeformWindowPolicy(display, root, launchMode); - if (mSupervisor.canUseActivityOptionsLaunchBounds(options) && canApplyFreeformPolicy) { + final boolean canApplyFreeformPolicy = canApplyFreeformWindowPolicy(display, launchMode); + if (mSupervisor.canUseActivityOptionsLaunchBounds(options) + && (canApplyFreeformPolicy || canApplyPipWindowPolicy(launchMode))) { hasInitialBounds = true; launchMode = launchMode == WINDOWING_MODE_UNDEFINED ? WINDOWING_MODE_FREEFORM @@ -279,10 +279,14 @@ class TaskLaunchParamsModifier implements LaunchParamsModifier { return displayId; } - private boolean canApplyFreeformWindowPolicy(@NonNull ActivityDisplay display, - @NonNull ActivityRecord root, int launchMode) { - return display.inFreeformWindowingMode() || launchMode == WINDOWING_MODE_FREEFORM - || root.isResizeable(); + private boolean canApplyFreeformWindowPolicy(@NonNull ActivityDisplay display, int launchMode) { + return mSupervisor.mService.mSupportsFreeformWindowManagement + && (display.inFreeformWindowingMode() || launchMode == WINDOWING_MODE_FREEFORM); + } + + private boolean canApplyPipWindowPolicy(int launchMode) { + return mSupervisor.mService.mSupportsPictureInPicture + && launchMode == WINDOWING_MODE_PINNED; } private void getLayoutBounds(@NonNull ActivityDisplay display, @NonNull ActivityRecord root, diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index 05b0d598f878..5f5916331e67 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -17,6 +17,7 @@ package com.android.server.am; import static android.app.ActivityTaskManager.INVALID_STACK_ID; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; import static android.app.ActivityTaskManager.RESIZE_MODE_FORCED; import static android.app.ActivityTaskManager.RESIZE_MODE_SYSTEM; import static android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD; @@ -45,16 +46,16 @@ import static android.content.pm.ActivityInfo.RESIZE_MODE_RESIZEABLE_VIA_SDK_VER import static android.os.Trace.TRACE_TAG_ACTIVITY_MANAGER; import static android.provider.Settings.Secure.USER_SETUP_COMPLETE; import static android.view.Display.DEFAULT_DISPLAY; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ADD_REMOVE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_ADD_REMOVE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_LOCKTASK; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RECENTS; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_TASKS; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_ADD_REMOVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_ADD_REMOVE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_LOCKTASK; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RECENTS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_TASKS; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN; import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING; import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP; @@ -129,7 +130,7 @@ import java.util.Objects; // TODO: Make package private again once move to WM package is complete. public class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener { - private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "TaskRecord" : TAG_ATM; private static final String TAG_ADD_REMOVE = TAG + POSTFIX_ADD_REMOVE; private static final String TAG_RECENTS = TAG + POSTFIX_RECENTS; private static final String TAG_LOCKTASK = TAG + POSTFIX_LOCKTASK; @@ -172,7 +173,6 @@ public class TaskRecord extends ConfigurationContainer implements TaskWindowCont // code. private static final int PERSIST_TASK_VERSION = 1; - static final int INVALID_TASK_ID = -1; private static final int INVALID_MIN_SIZE = -1; /** diff --git a/services/core/java/com/android/server/am/VrController.java b/services/core/java/com/android/server/am/VrController.java index 366f95a170ff..51d86d66e6c1 100644 --- a/services/core/java/com/android/server/am/VrController.java +++ b/services/core/java/com/android/server/am/VrController.java @@ -248,9 +248,9 @@ final class VrController { * * @param tid the tid of the thread to set, or 0 to unset the current thread. * @param pid the pid of the process owning the thread to set. - * @param proc the ProcessRecord of the process owning the thread to set. + * @param proc the process owning the thread to set. */ - public void setPersistentVrThreadLocked(int tid, int pid, ProcessRecord proc) { + public void setPersistentVrThreadLocked(int tid, int pid, WindowProcessController proc) { if (!hasPersistentVrFlagSet()) { Slog.w(TAG, "Persistent VR thread may only be set in persistent VR mode!"); return; diff --git a/services/core/java/com/android/server/am/WindowProcessController.java b/services/core/java/com/android/server/am/WindowProcessController.java index f6f4db6a2d37..a461d1c4b849 100644 --- a/services/core/java/com/android/server/am/WindowProcessController.java +++ b/services/core/java/com/android/server/am/WindowProcessController.java @@ -18,12 +18,12 @@ package com.android.server.am; import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CONFIGURATION; -import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_RELEASE; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; -import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.DEBUG_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_CONFIGURATION; +import static com.android.server.am.ActivityTaskManagerDebugConfig.POSTFIX_RELEASE; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_ATM; +import static com.android.server.am.ActivityTaskManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.am.ActivityStack.ActivityState.DESTROYED; import static com.android.server.am.ActivityStack.ActivityState.DESTROYING; import static com.android.server.am.ActivityStack.ActivityState.PAUSED; @@ -63,7 +63,7 @@ import java.util.ArrayList; * calls are allowed to proceed. */ public class WindowProcessController extends ConfigurationContainer<ConfigurationContainer> { - private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowProcessController" : TAG_AM; + private static final String TAG = TAG_WITH_CLASS_NAME ? "WindowProcessController" : TAG_ATM; private static final String TAG_RELEASE = TAG + POSTFIX_RELEASE; private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION; @@ -87,6 +87,8 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private volatile IApplicationThread mThread; // Currently desired scheduling class private volatile int mCurSchedGroup; + // Currently computed process state + private volatile int mCurProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state; private volatile int mRepProcState = PROCESS_STATE_NONEXISTENT; // are we in the process of crashing? @@ -99,6 +101,28 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio private volatile String mRequiredAbi; // Running any services that are foreground? private volatile boolean mHasForegroundServices; + // Running any activities that are foreground? + private volatile boolean mHasForegroundActivities; + // Are there any client services with activities? + private volatile boolean mHasClientActivities; + // Is this process currently showing a non-activity UI that the user is interacting with? + // E.g. The status bar when it is expanded, but not when it is minimized. When true the process + // will be set to use the ProcessList#SCHED_GROUP_TOP_APP scheduling group to boost performance. + private volatile boolean mHasTopUi; + // Is the process currently showing a non-activity UI that overlays on-top of activity UIs on + // screen. E.g. display a window of type + // android.view.WindowManager.LayoutParams#TYPE_APPLICATION_OVERLAY When true the process will + // oom adj score will be set to ProcessList#PERCEPTIBLE_APP_ADJ at minimum to reduce the chance + // of the process getting killed. + private volatile boolean mHasOverlayUi; + // Want to clean up resources from showing UI? + private volatile boolean mPendingUiClean; + // The time we sent the last interaction event + private volatile long mInteractionEventTime; + // When we became foreground for interaction purposes + private volatile long mFgInteractionTime; + // When (uptime) the process last became unimportant + private volatile long mWhenUnimportant; // was app launched for debugging? private volatile boolean mDebugging; // Active instrumentation running in process? @@ -161,6 +185,14 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return mCurSchedGroup; } + public void setCurrentProcState(int curProcState) { + mCurProcState = curProcState; + } + + int getCurrentProcState() { + return mCurProcState; + } + public void setReportedProcState(int repProcState) { mRepProcState = repProcState; } @@ -201,6 +233,78 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio return mHasForegroundServices; } + public void setHasForegroundActivities(boolean hasForegroundActivities) { + mHasForegroundActivities = hasForegroundActivities; + } + + boolean hasForegroundActivities() { + return mHasForegroundActivities; + } + + public void setHasClientActivities(boolean hasClientActivities) { + mHasClientActivities = hasClientActivities; + } + + boolean hasClientActivities() { + return mHasClientActivities; + } + + public void setHasTopUi(boolean hasTopUi) { + mHasTopUi = hasTopUi; + } + + boolean hasTopUi() { + return mHasTopUi; + } + + public void setHasOverlayUi(boolean hasOverlayUi) { + mHasOverlayUi = hasOverlayUi; + } + + boolean hasOverlayUi() { + return mHasOverlayUi; + } + + public void setPendingUiClean(boolean hasPendingUiClean) { + mPendingUiClean = hasPendingUiClean; + } + + boolean hasPendingUiClean() { + return mPendingUiClean; + } + + void postPendingUiCleanMsg(boolean pendingUiClean) { + if (mListener == null) return; + // Posting on handler so WM lock isn't held when we call into AM. + final Message m = PooledLambda.obtainMessage( + WindowProcessListener::setPendingUiClean, mListener, pendingUiClean); + mAtm.mH.sendMessage(m); + } + + public void setInteractionEventTime(long interactionEventTime) { + mInteractionEventTime = interactionEventTime; + } + + long getInteractionEventTime() { + return mInteractionEventTime; + } + + public void setFgInteractionTime(long fgInteractionTime) { + mFgInteractionTime = fgInteractionTime; + } + + long getFgInteractionTime() { + return mFgInteractionTime; + } + + public void setWhenUnimportant(long whenUnimportant) { + mWhenUnimportant = whenUnimportant; + } + + long getWhenUnimportant() { + return mWhenUnimportant; + } + public void setRequiredAbi(String requiredAbi) { mRequiredAbi = requiredAbi; } @@ -532,14 +636,6 @@ public class WindowProcessController extends ConfigurationContainer<Configuratio WindowProcessListener::updateServiceConnectionActivities, mListener)); } - void setPendingUiClean(boolean pendingUiClean) { - if (mListener == null) return; - // Posting on handler so WM lock isn't held when we call into AM. - final Message m = PooledLambda.obtainMessage( - WindowProcessListener::setPendingUiClean, mListener, pendingUiClean); - mAtm.mH.sendMessage(m); - } - void setPendingUiCleanAndForceProcessStateUpTo(int newState) { if (mListener == null) return; // Posting on handler so WM lock isn't held when we call into AM. diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index f0ff570e385b..cd1a7c2be26c 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -5975,6 +5975,9 @@ public class AudioService extends IAudioService.Stub address)); sendMsg(mAudioHandler, MSG_ACCESSORY_PLUG_MEDIA_UNMUTE, SENDMSG_QUEUE, AudioSystem.DEVICE_OUT_HEARING_AID, 0, null, 0); + sendMsg(mAudioHandler, MSG_SET_DEVICE_VOLUME, SENDMSG_QUEUE, + AudioSystem.DEVICE_OUT_HEARING_AID, 0, + mStreamStates[AudioSystem.STREAM_MUSIC], 0); } // must be called synchronized on mConnectedDevices diff --git a/services/core/java/com/android/server/connectivity/ProxyTracker.java b/services/core/java/com/android/server/connectivity/ProxyTracker.java index 47e85b5fd3ab..15468ff05c08 100644 --- a/services/core/java/com/android/server/connectivity/ProxyTracker.java +++ b/services/core/java/com/android/server/connectivity/ProxyTracker.java @@ -126,9 +126,9 @@ public class ProxyTracker { public ProxyInfo getDefaultProxy() { // This information is already available as a world read/writable jvm property. synchronized (mProxyLock) { - final ProxyInfo ret = mGlobalProxy; - if ((ret == null) && mDefaultProxyEnabled) return mDefaultProxy; - return ret; + if (mGlobalProxy != null) return mGlobalProxy; + if (mDefaultProxyEnabled) return mDefaultProxy; + return null; } } @@ -204,11 +204,10 @@ public class ProxyTracker { * * Confusingly this method also sets the PAC file URL. TODO : separate this, it has nothing * to do in a "sendProxyBroadcast" method. - * @param proxyInfo the proxy spec, or null for no proxy. */ - // TODO : make the argument NonNull final and the method private - public void sendProxyBroadcast(@Nullable ProxyInfo proxyInfo) { - if (proxyInfo == null) proxyInfo = new ProxyInfo("", 0, ""); + public void sendProxyBroadcast() { + final ProxyInfo defaultProxy = getDefaultProxy(); + final ProxyInfo proxyInfo = null != defaultProxy ? defaultProxy : new ProxyInfo("", 0, ""); if (mPacManager.setCurrentProxyScriptUrl(proxyInfo)) return; if (DBG) Slog.d(TAG, "sending Proxy Broadcast for " + proxyInfo); Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION); @@ -269,7 +268,7 @@ public class ProxyTracker { Binder.restoreCallingIdentity(token); } - sendProxyBroadcast(mGlobalProxy == null ? mDefaultProxy : proxyInfo); + sendProxyBroadcast(); } } @@ -296,14 +295,14 @@ public class ProxyTracker { && (!Uri.EMPTY.equals(proxyInfo.getPacFileUrl())) && proxyInfo.getPacFileUrl().equals(mGlobalProxy.getPacFileUrl())) { mGlobalProxy = proxyInfo; - sendProxyBroadcast(mGlobalProxy); + sendProxyBroadcast(); return; } mDefaultProxy = proxyInfo; if (mGlobalProxy != null) return; if (mDefaultProxyEnabled) { - sendProxyBroadcast(proxyInfo); + sendProxyBroadcast(); } } } @@ -320,7 +319,7 @@ public class ProxyTracker { if (mDefaultProxyEnabled != enabled) { mDefaultProxyEnabled = enabled; if (mGlobalProxy == null && mDefaultProxy != null) { - sendProxyBroadcast(enabled ? mDefaultProxy : null); + sendProxyBroadcast(); } } } diff --git a/services/core/java/com/android/server/media/MediaUpdateService.java b/services/core/java/com/android/server/media/MediaUpdateService.java index af06d157a526..7304f0788a1d 100644 --- a/services/core/java/com/android/server/media/MediaUpdateService.java +++ b/services/core/java/com/android/server/media/MediaUpdateService.java @@ -22,7 +22,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; -import android.media.IMediaExtractorUpdateService; +import android.media.IMediaUpdateService; import android.os.Build; import android.os.IBinder; import android.os.Handler; @@ -34,6 +34,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.Slog; import com.android.server.SystemService; +import java.util.HashMap; /** This class provides a system service that manages media framework updates. */ public class MediaUpdateService extends SystemService { @@ -42,34 +43,40 @@ public class MediaUpdateService extends SystemService { private static final String MEDIA_UPDATE_PACKAGE_NAME = SystemProperties.get("ro.mediacomponents.package"); private static final String EXTRACTOR_UPDATE_SERVICE_NAME = "media.extractor.update"; - - private IMediaExtractorUpdateService mMediaExtractorUpdateService; - final Handler mHandler; + private static final String CODEC_UPDATE_SERVICE_NAME = "media.codec.update"; + private static final String[] UPDATE_SERVICE_NAME_ARRAY = { + EXTRACTOR_UPDATE_SERVICE_NAME, CODEC_UPDATE_SERVICE_NAME, + }; + private final HashMap<String, IMediaUpdateService> mUpdateServiceMap = new HashMap<>(); + private final Handler mHandler = new Handler(); public MediaUpdateService(Context context) { super(context); - mHandler = new Handler(); } @Override public void onStart() { if (("userdebug".equals(android.os.Build.TYPE) || "eng".equals(android.os.Build.TYPE)) && !TextUtils.isEmpty(MEDIA_UPDATE_PACKAGE_NAME)) { - connect(); + for (String serviceName : UPDATE_SERVICE_NAME_ARRAY) { + connect(serviceName); + } registerBroadcastReceiver(); } } - private void connect() { - IBinder binder = ServiceManager.getService(EXTRACTOR_UPDATE_SERVICE_NAME); + private void connect(final String serviceName) { + IBinder binder = ServiceManager.getService(serviceName); if (binder != null) { try { binder.linkToDeath(new IBinder.DeathRecipient() { @Override public void binderDied() { - Slog.w(TAG, "mediaextractor died; reconnecting"); - mMediaExtractorUpdateService = null; - connect(); + Slog.w(TAG, "service " + serviceName + " died; reconnecting"); + synchronized (mUpdateServiceMap) { + mUpdateServiceMap.remove(serviceName); + } + connect(serviceName); } }, 0); } catch (Exception e) { @@ -77,15 +84,18 @@ public class MediaUpdateService extends SystemService { } } if (binder != null) { - mMediaExtractorUpdateService = IMediaExtractorUpdateService.Stub.asInterface(binder); + synchronized (mUpdateServiceMap) { + mUpdateServiceMap.put(serviceName, + IMediaUpdateService.Stub.asInterface(binder)); + } mHandler.post(new Runnable() { @Override public void run() { - packageStateChanged(); + packageStateChanged(serviceName); } }); } else { - Slog.w(TAG, EXTRACTOR_UPDATE_SERVICE_NAME + " not found."); + Slog.w(TAG, serviceName + " not found."); } } @@ -106,13 +116,12 @@ public class MediaUpdateService extends SystemService { // following ACTION_PACKAGE_ADDED case. return; } - packageStateChanged(); - break; + // fall-thru case Intent.ACTION_PACKAGE_CHANGED: - packageStateChanged(); - break; case Intent.ACTION_PACKAGE_ADDED: - packageStateChanged(); + for (String serviceName : UPDATE_SERVICE_NAME_ARRAY) { + packageStateChanged(serviceName); + } break; } } @@ -128,7 +137,7 @@ public class MediaUpdateService extends SystemService { null /* broadcast permission */, null /* handler */); } - private void packageStateChanged() { + private void packageStateChanged(String serviceName) { ApplicationInfo packageInfo = null; boolean pluginsAvailable = false; try { @@ -144,17 +153,23 @@ public class MediaUpdateService extends SystemService { + " targetSdk:" + packageInfo.targetSdkVersion); pluginsAvailable = false; } - loadExtractorPlugins( + loadPlugins(serviceName, (packageInfo != null && pluginsAvailable) ? packageInfo.sourceDir : ""); } - private void loadExtractorPlugins(String apkPath) { + private void loadPlugins(String serviceName, String apkPath) { try { - if (mMediaExtractorUpdateService != null) { - mMediaExtractorUpdateService.loadPlugins(apkPath); + IMediaUpdateService service = null; + synchronized (serviceName) { + service = mUpdateServiceMap.get(serviceName); + } + if (service != null) { + service.loadPlugins(apkPath); + } else { + Slog.w(TAG, "service " + serviceName + " passed away"); } } catch (Exception e) { - Slog.w(TAG, "Error in loadPlugins", e); + Slog.w(TAG, "Error in loadPlugins for " + serviceName, e); } } } diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java index 6ca4f2e49d0a..14434cdcb4f7 100644 --- a/services/core/java/com/android/server/stats/StatsCompanionService.java +++ b/services/core/java/com/android/server/stats/StatsCompanionService.java @@ -43,12 +43,15 @@ import android.os.Binder; import android.os.Bundle; import android.os.Environment; import android.os.FileUtils; +import android.os.Handler; +import android.os.HandlerThread; import android.os.IBinder; import android.os.IStatsCompanionService; import android.os.IStatsManager; import android.os.IStoraged; import android.os.IThermalEventListener; import android.os.IThermalService; +import android.os.Looper; import android.os.ParcelFileDescriptor; import android.os.Parcelable; import android.os.Process; @@ -85,6 +88,7 @@ import com.android.internal.os.KernelWakelockReader; import com.android.internal.os.KernelWakelockStats; import com.android.internal.os.LooperStats; import com.android.internal.os.PowerProfile; +import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.StoragedUidIoStatsReader; import com.android.internal.util.DumpUtils; import com.android.server.BinderCallsStatsService; @@ -148,6 +152,13 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { public static final String EXTRA_LAST_REPORT_TIME = "android.app.extra.LAST_REPORT_TIME"; public static final int DEATH_THRESHOLD = 10; + + static final class CompanionHandler extends Handler { + CompanionHandler(Looper looper) { + super(looper); + } + } + private final Context mContext; private final AlarmManager mAlarmManager; @GuardedBy("sStatsdLock") @@ -164,15 +175,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats(); private IWifiManager mWifiManager = null; private TelephonyManager mTelephony = null; - private final StatFs mStatFsData = new StatFs(Environment.getDataDirectory().getAbsolutePath()); - private final StatFs mStatFsSystem = - new StatFs(Environment.getRootDirectory().getAbsolutePath()); - private final StatFs mStatFsTemp = - new StatFs(Environment.getDownloadCacheDirectory().getAbsolutePath()); @GuardedBy("sStatsdLock") private final HashSet<Long> mDeathTimeMillis = new HashSet<>(); @GuardedBy("sStatsdLock") private final HashMap<Long, String> mDeletedFiles = new HashMap<>(); + private final CompanionHandler mHandler; private KernelUidCpuTimeReader mKernelUidCpuTimeReader = new KernelUidCpuTimeReader(); private KernelCpuSpeedReader[] mKernelCpuSpeedReaders; @@ -188,6 +195,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private static IThermalService sThermalService; private File mBaseDir = new File(SystemServiceManager.ensureSystemDir(), "stats_companion"); + @GuardedBy("this") + ProcessCpuTracker mProcessCpuTracker = null; public StatsCompanionService(Context context) { super(); @@ -251,6 +260,11 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { } else { Slog.e(TAG, "cannot find thermalservice, no throttling push notifications"); } + + HandlerThread handlerThread = new HandlerThread(TAG); + handlerThread.start(); + mHandler = new CompanionHandler(handlerThread.getLooper()); + } @Override @@ -498,7 +512,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // only fire when it awakens. // AlarmManager will automatically cancel any previous mAnomalyAlarmListener alarm. mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".anomaly", - mAnomalyAlarmListener, null); + mAnomalyAlarmListener, mHandler); } finally { Binder.restoreCallingIdentity(callingToken); } @@ -529,7 +543,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will // only fire when it awakens. mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, timestampMs, TAG + ".periodic", - mPeriodicAlarmListener, null); + mPeriodicAlarmListener, mHandler); } finally { Binder.restoreCallingIdentity(callingToken); } @@ -561,7 +575,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { // using ELAPSED_REALTIME, not ELAPSED_REALTIME_WAKEUP, so if device is asleep, will // only fire when it awakens. mAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME, nextPullTimeMs, TAG + ".pull", - mPullingAlarmListener, null); + mPullingAlarmListener, mHandler); } finally { Binder.restoreCallingIdentity(callingToken); } @@ -756,7 +770,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullBluetoothBytesTransfer( int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { - BluetoothActivityEnergyInfo info = pullBluetoothData(); + BluetoothActivityEnergyInfo info = fetchBluetoothData(); if (info.getUidTraffic() != null) { for (UidTraffic traffic : info.getUidTraffic()) { StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, @@ -868,9 +882,12 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { long token = Binder.clearCallingIdentity(); - if (mWifiManager == null) { - mWifiManager = - IWifiManager.Stub.asInterface(ServiceManager.getService(Context.WIFI_SERVICE)); + synchronized (this) { + if (mWifiManager == null) { + mWifiManager = + IWifiManager.Stub.asInterface( + ServiceManager.getService(Context.WIFI_SERVICE)); + } } if (mWifiManager != null) { try { @@ -900,8 +917,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { long token = Binder.clearCallingIdentity(); - if (mTelephony == null) { - mTelephony = TelephonyManager.from(mContext); + synchronized (this) { + if (mTelephony == null) { + mTelephony = TelephonyManager.from(mContext); + } } if (mTelephony != null) { SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony"); @@ -925,7 +944,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullBluetoothActivityInfo( int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { - BluetoothActivityEnergyInfo info = pullBluetoothData(); + BluetoothActivityEnergyInfo info = fetchBluetoothData(); StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); e.writeLong(info.getTimeStamp()); e.writeInt(info.getBluetoothStackState()); @@ -936,7 +955,7 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pulledData.add(e); } - private synchronized BluetoothActivityEnergyInfo pullBluetoothData() { + private synchronized BluetoothActivityEnergyInfo fetchBluetoothData() { final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); if (adapter != null) { SynchronousResultReceiver bluetoothReceiver = new SynchronousResultReceiver( @@ -1290,30 +1309,35 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { private void pullProcessStats(int section, int tagId, long elapsedNanos, long wallClockNanos, List<StatsLogEventWrapper> pulledData) { - try { - long lastHighWaterMark = readProcStatsHighWaterMark(section); - List<ParcelFileDescriptor> statsFiles = new ArrayList<>(); - long highWaterMark = mProcessStats.getCommittedStats( - lastHighWaterMark, section, true, statsFiles); - if (statsFiles.size() != 1) { - return; + synchronized (this) { + try { + long lastHighWaterMark = readProcStatsHighWaterMark(section); + List<ParcelFileDescriptor> statsFiles = new ArrayList<>(); + long highWaterMark = mProcessStats.getCommittedStats( + lastHighWaterMark, section, true, statsFiles); + if (statsFiles.size() != 1) { + return; + } + InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream( + statsFiles.get(0)); + int[] len = new int[1]; + byte[] stats = readFully(stream, len); + StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, + wallClockNanos); + e.writeStorage(Arrays.copyOf(stats, len[0])); + pulledData.add(e); + new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + + lastHighWaterMark).delete(); + new File( + mBaseDir.getAbsolutePath() + "/" + section + "_" + + highWaterMark).createNewFile(); + } catch (IOException e) { + Log.e(TAG, "Getting procstats failed: ", e); + } catch (RemoteException e) { + Log.e(TAG, "Getting procstats failed: ", e); + } catch (SecurityException e) { + Log.e(TAG, "Getting procstats failed: ", e); } - InputStream stream = new ParcelFileDescriptor.AutoCloseInputStream(statsFiles.get(0)); - int[] len = new int[1]; - byte[] stats = readFully(stream, len); - StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, wallClockNanos); - e.writeStorage(Arrays.copyOf(stats, len[0])); - pulledData.add(e); - new File(mBaseDir.getAbsolutePath() + "/" + section + "_" + lastHighWaterMark).delete(); - new File( - mBaseDir.getAbsolutePath() + "/" + section + "_" - + highWaterMark).createNewFile(); - } catch (IOException e) { - Log.e(TAG, "Getting procstats failed: ", e); - } catch (RemoteException e) { - Log.e(TAG, "Getting procstats failed: ", e); - } catch (SecurityException e) { - Log.e(TAG, "Getting procstats failed: ", e); } } @@ -1382,12 +1406,34 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { }); } + private void pullProcessCpuTime(int tagId, long elapsedNanos, final long wallClockNanos, + List<StatsLogEventWrapper> pulledData) { + synchronized (this) { + if (mProcessCpuTracker == null) { + mProcessCpuTracker = new ProcessCpuTracker(false); + mProcessCpuTracker.init(); + } + mProcessCpuTracker.update(); + for (int i = 0; i < mProcessCpuTracker.countStats(); i++) { + ProcessCpuTracker.Stats st = mProcessCpuTracker.getStats(i); + StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, elapsedNanos, + wallClockNanos); + e.writeInt(st.uid); + e.writeString(st.name); + e.writeLong(st.base_utime); + e.writeLong(st.base_stime); + pulledData.add(e); + } + } + } + /** * Pulls various data. */ @Override // Binder call public StatsLogEventWrapper[] pullData(int tagId) { enforceCallingPermission(); + if (DEBUG) { Slog.d(TAG, "Pulling " + tagId); } @@ -1496,7 +1542,8 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { break; } case StatsLog.PROC_STATS: { - pullProcessStats(ProcessStats.REPORT_ALL, tagId, elapsedNanos, wallClockNanos, ret); + pullProcessStats(ProcessStats.REPORT_ALL, tagId, elapsedNanos, wallClockNanos, + ret); break; } case StatsLog.PROC_STATS_PKG_PROC: { @@ -1512,6 +1559,10 @@ public class StatsCompanionService extends IStatsCompanionService.Stub { pullPowerProfile(tagId, elapsedNanos, wallClockNanos, ret); break; } + case StatsLog.PROCESS_CPU_TIME: { + pullProcessCpuTime(tagId, elapsedNanos, wallClockNanos, ret); + break; + } default: Slog.w(TAG, "No such tagId data as " + tagId); return null; diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 642f57814c61..d8fd198fe143 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -2077,9 +2077,9 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo int taskForTapOutside(int x, int y) { for (int stackNdx = mTaskStackContainers.getChildCount() - 1; stackNdx >= 0; --stackNdx) { final TaskStack stack = mTaskStackContainers.getChildAt(stackNdx); - if (stack.isActivityTypeHome()) { + if (stack.isActivityTypeHome() && !stack.inMultiWindowMode()) { // We skip not only home stack, but also everything behind home because user can't - // see them. + // see them when home stack is isn't in multi-window mode. break; } final int taskId = stack.taskIdFromPoint(x, y); diff --git a/services/tests/mockingservicestests/Android.mk b/services/tests/mockingservicestests/Android.mk index 8c0283318419..b83a79fc232c 100644 --- a/services/tests/mockingservicestests/Android.mk +++ b/services/tests/mockingservicestests/Android.mk @@ -22,6 +22,7 @@ LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_LIBRARIES := \ frameworks-base-testutils \ services.core \ + services.net \ androidx-test \ mockito-target-extended-minus-junit4 \ platform-test-annotations \ diff --git a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java index 95ed00f3ad5b..8afd788256c1 100644 --- a/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/DeviceIdleControllerTest.java @@ -41,6 +41,9 @@ import static com.android.server.DeviceIdleController.lightStateToString; import static com.android.server.DeviceIdleController.stateToString; import static org.junit.Assert.assertEquals; + +import android.net.NetworkInfo; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -50,6 +53,8 @@ import static org.mockito.ArgumentMatchers.anyString; import android.app.ActivityManagerInternal; import android.app.AlarmManager; +import android.net.ConnectivityManager; +import android.content.Intent; import android.app.IActivityManager; import android.content.ContentResolver; import android.content.Context; @@ -83,11 +88,14 @@ public class DeviceIdleControllerTest { private DeviceIdleController mDeviceIdleController; private AnyMotionDetectorForTest mAnyMotionDetector; private AppStateTrackerForTest mAppStateTracker; + private InjectorForTest mInjector; private MockitoSession mMockingSession; @Mock private AlarmManager mAlarmManager; @Mock + private ConnectivityService mConnectivityService; + @Mock private DeviceIdleController.Constants mConstants; @Mock private IActivityManager mIActivityManager; @@ -99,6 +107,8 @@ public class DeviceIdleControllerTest { private PowerManager.WakeLock mWakeLock; class InjectorForTest extends DeviceIdleController.Injector { + ConnectivityService connectivityService; + LocationManager locationManager; InjectorForTest(Context ctx) { super(ctx); @@ -122,18 +132,19 @@ public class DeviceIdleControllerTest { @Override ConnectivityService getConnectivityService() { - return null; + return connectivityService; } @Override - DeviceIdleController.Constants getConstants(DeviceIdleController controller, Handler handler, + DeviceIdleController.Constants getConstants(DeviceIdleController controller, + Handler handler, ContentResolver resolver) { return mConstants; } @Override LocationManager getLocationManager() { - return mLocationManager; + return locationManager; } @Override @@ -201,8 +212,8 @@ public class DeviceIdleControllerTest { doNothing().when(mWakeLock).acquire(); mAppStateTracker = new AppStateTrackerForTest(getContext(), Looper.getMainLooper()); mAnyMotionDetector = new AnyMotionDetectorForTest(); - mDeviceIdleController = new DeviceIdleController(getContext(), - new InjectorForTest(getContext())); + mInjector = new InjectorForTest(getContext()); + mDeviceIdleController = new DeviceIdleController(getContext(), mInjector); spyOn(mDeviceIdleController); doNothing().when(mDeviceIdleController).publishBinderService(any(), any()); mDeviceIdleController.onStart(); @@ -271,6 +282,60 @@ public class DeviceIdleControllerTest { } @Test + public void testUpdateConnectivityState() { + // No connectivity service + final boolean isConnected = mDeviceIdleController.isNetworkConnected(); + mInjector.connectivityService = null; + mDeviceIdleController.updateConnectivityState(null); + assertEquals(isConnected, mDeviceIdleController.isNetworkConnected()); + + // No active network info + mInjector.connectivityService = mConnectivityService; + doReturn(null).when(mConnectivityService).getActiveNetworkInfo(); + mDeviceIdleController.updateConnectivityState(null); + assertFalse(mDeviceIdleController.isNetworkConnected()); + + // Active network info says connected. + final NetworkInfo ani = mock(NetworkInfo.class); + doReturn(ani).when(mConnectivityService).getActiveNetworkInfo(); + doReturn(true).when(ani).isConnected(); + mDeviceIdleController.updateConnectivityState(null); + assertTrue(mDeviceIdleController.isNetworkConnected()); + + // Active network info says not connected. + doReturn(false).when(ani).isConnected(); + mDeviceIdleController.updateConnectivityState(null); + assertFalse(mDeviceIdleController.isNetworkConnected()); + + // Wrong intent passed (false). + Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION); + intent.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, 3); + doReturn(true).when(ani).isConnected(); + doReturn(1).when(ani).getType(); + mDeviceIdleController.updateConnectivityState(intent); + // Wrong intent means we shouldn't update the connected state. + assertFalse(mDeviceIdleController.isNetworkConnected()); + + // Intent says connected. + doReturn(1).when(ani).getType(); + intent.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, 1); + intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false); + mDeviceIdleController.updateConnectivityState(intent); + assertTrue(mDeviceIdleController.isNetworkConnected()); + + // Wrong intent passed (true). + intent.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, 3); + // Wrong intent means we shouldn't update the connected state. + assertTrue(mDeviceIdleController.isNetworkConnected()); + + // Intent says not connected. + intent.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, 1); + intent.putExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, true); + mDeviceIdleController.updateConnectivityState(intent); + assertFalse(mDeviceIdleController.isNetworkConnected()); + } + + @Test public void testStateActiveToStateInactive_ConditionsNotMet() { mDeviceIdleController.becomeActiveLocked("testing", 0); verifyStateConditions(STATE_ACTIVE); @@ -360,8 +425,56 @@ public class DeviceIdleControllerTest { } @Test + public void testStepIdleStateLocked_ValidStates_WithWakeFromIdleAlarmSoon() { + enterDeepState(STATE_ACTIVE); + // Return that there's an alarm coming soon. + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_ACTIVE); + + // Everything besides ACTIVE should end up as INACTIVE since the screen would be off. + + enterDeepState(STATE_INACTIVE); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + + enterDeepState(STATE_IDLE_PENDING); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + + enterDeepState(STATE_SENSING); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + + enterDeepState(STATE_LOCATING); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + + enterDeepState(STATE_IDLE); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + + enterDeepState(STATE_IDLE_MAINTENANCE); + doReturn(SystemClock.elapsedRealtime() + mConstants.MIN_TIME_TO_ALARM / 2).when( + mAlarmManager).getNextWakeFromIdleTime(); + mDeviceIdleController.stepIdleStateLocked("testing"); + verifyStateConditions(STATE_INACTIVE); + } + + @Test public void testStepIdleStateLocked_ValidStates_NoLocationManager() { - mDeviceIdleController.setLocationManagerForTest(null); + mInjector.locationManager = null; // Make sure the controller doesn't think there's a wake-from-idle alarm coming soon. doReturn(Long.MAX_VALUE).when(mAlarmManager).getNextWakeFromIdleTime(); // Set state to INACTIVE. @@ -427,9 +540,9 @@ public class DeviceIdleControllerTest { @Test public void testStepIdleStateLocked_ValidStates_WithLocationManager_WithProviders() { + mInjector.locationManager = mLocationManager; doReturn(mock(LocationProvider.class)).when(mLocationManager).getProvider(anyString()); // Make sure the controller doesn't think there's a wake-from-idle alarm coming soon. - // TODO: add tests for when there's a wake-from-idle alarm coming soon. doReturn(Long.MAX_VALUE).when(mAlarmManager).getNextWakeFromIdleTime(); // Set state to INACTIVE. mDeviceIdleController.becomeActiveLocked("testing", 0); @@ -463,6 +576,160 @@ public class DeviceIdleControllerTest { } @Test + public void testLightStepIdleStateLocked_InvalidStates() { + mDeviceIdleController.becomeActiveLocked("testing", 0); + mDeviceIdleController.stepLightIdleStateLocked("testing"); + // stepLightIdleStateLocked doesn't handle the ACTIVE case, so the state + // should stay as ACTIVE. + verifyLightStateConditions(LIGHT_STATE_ACTIVE); + } + + /** + * Make sure stepLightIdleStateLocked doesn't change state when the state is + * LIGHT_STATE_OVERRIDE. + */ + @Test + public void testLightStepIdleStateLocked_Overriden() { + enterLightState(LIGHT_STATE_OVERRIDE); + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_OVERRIDE); + } + + @Test + public void testLightStepIdleStateLocked_ValidStates_NoActiveOps_NetworkConnected() { + setNetworkConnected(true); + mDeviceIdleController.setJobsActive(false); + mDeviceIdleController.setAlarmsActive(false); + mDeviceIdleController.setActiveIdleOpsForTest(0); + + // Set state to INACTIVE. + mDeviceIdleController.becomeActiveLocked("testing", 0); + setChargingOn(false); + setScreenOn(false); + verifyLightStateConditions(LIGHT_STATE_INACTIVE); + + // No active ops means INACTIVE should go straight to IDLE. + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + // Should just alternate between IDLE and IDLE_MAINTENANCE now. + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + } + + @Test + public void testLightStepIdleStateLocked_ValidStates_ActiveOps_NetworkConnected() { + setNetworkConnected(true); + // Set state to INACTIVE. + mDeviceIdleController.becomeActiveLocked("testing", 0); + setChargingOn(false); + setScreenOn(false); + verifyLightStateConditions(LIGHT_STATE_INACTIVE); + + // Active ops means INACTIVE should go to PRE_IDLE to wait. + mDeviceIdleController.setJobsActive(true); + mDeviceIdleController.setAlarmsActive(true); + mDeviceIdleController.setActiveIdleOpsForTest(1); + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_PRE_IDLE); + + // Even with active ops, PRE_IDLE should go to IDLE. + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + // Should just alternate between IDLE and IDLE_MAINTENANCE now. + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + } + + @Test + public void testLightStepIdleStateLocked_ValidStates_NoActiveOps_NoNetworkConnected() { + setNetworkConnected(false); + mDeviceIdleController.setJobsActive(false); + mDeviceIdleController.setAlarmsActive(false); + mDeviceIdleController.setActiveIdleOpsForTest(0); + + // Set state to INACTIVE. + mDeviceIdleController.becomeActiveLocked("testing", 0); + setChargingOn(false); + setScreenOn(false); + verifyLightStateConditions(LIGHT_STATE_INACTIVE); + + // No active ops means INACTIVE should go straight to IDLE. + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + // Should cycle between IDLE, WAITING_FOR_NETWORK, and IDLE_MAINTENANCE now. + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + } + + @Test + public void testLightStepIdleStateLocked_ValidStates_ActiveOps_NoNetworkConnected() { + setNetworkConnected(false); + // Set state to INACTIVE. + mDeviceIdleController.becomeActiveLocked("testing", 0); + setChargingOn(false); + setScreenOn(false); + verifyLightStateConditions(LIGHT_STATE_INACTIVE); + + // Active ops means INACTIVE should go to PRE_IDLE to wait. + mDeviceIdleController.setJobsActive(true); + mDeviceIdleController.setAlarmsActive(true); + mDeviceIdleController.setActiveIdleOpsForTest(1); + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_PRE_IDLE); + + // Even with active ops, PRE_IDLE should go to IDLE. + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + // Should cycle between IDLE, WAITING_FOR_NETWORK, and IDLE_MAINTENANCE now. + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_WAITING_FOR_NETWORK); + + mDeviceIdleController.stepLightIdleStateLocked("testing"); + verifyLightStateConditions(LIGHT_STATE_IDLE_MAINTENANCE); + } + + @Test public void testExitMaintenanceEarlyIfNeededLocked_deep_noActiveOps() { mDeviceIdleController.setJobsActive(false); mDeviceIdleController.setAlarmsActive(false); @@ -903,6 +1170,7 @@ public class DeviceIdleControllerTest { mDeviceIdleController.becomeActiveLocked("testing", 0); break; case STATE_LOCATING: + mInjector.locationManager = mLocationManager; doReturn(mock(LocationProvider.class)).when(mLocationManager).getProvider( anyString()); // Fallthrough to step loop. @@ -917,7 +1185,6 @@ public class DeviceIdleControllerTest { setScreenOn(false); setChargingOn(false); mDeviceIdleController.becomeInactiveIfAppropriateLocked(); - //fail(stateToString(mDeviceIdleController.getState())); int count = 0; while (mDeviceIdleController.getState() != state) { // Stepping through each state ensures that the proper features are turned @@ -925,7 +1192,8 @@ public class DeviceIdleControllerTest { mDeviceIdleController.stepIdleStateLocked("testing"); count++; if (count > 10) { - fail(stateToString(mDeviceIdleController.getState())); + fail("Infinite loop. Check test configuration. Currently at " + + stateToString(mDeviceIdleController.getState())); } } break; @@ -954,7 +1222,8 @@ public class DeviceIdleControllerTest { count++; if (count > 10) { - fail(lightStateToString(mDeviceIdleController.getLightState())); + fail("Infinite loop. Check test configuration. Currently at " + + lightStateToString(mDeviceIdleController.getLightState())); } } break; @@ -979,6 +1248,14 @@ public class DeviceIdleControllerTest { mDeviceIdleController.updateInteractivityLocked(); } + private void setNetworkConnected(boolean connected) { + mInjector.connectivityService = mConnectivityService; + final NetworkInfo ani = mock(NetworkInfo.class); + doReturn(connected).when(ani).isConnected(); + doReturn(ani).when(mConnectivityService).getActiveNetworkInfo(); + mDeviceIdleController.updateConnectivityState(null); + } + private void verifyStateConditions(int expectedState) { int curState = mDeviceIdleController.getState(); assertEquals( diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java index bac4a525b9ea..062c044ac3e3 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityStarterTests.java @@ -37,7 +37,7 @@ import static android.content.Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static com.android.server.am.ActivityDisplay.POSITION_BOTTOM; -import static com.android.server.am.ActivityManagerService.ANIMATE; +import static com.android.server.am.ActivityTaskManagerService.ANIMATE; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -48,6 +48,7 @@ import static org.mockito.ArgumentMatchers.anyObject; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -206,11 +207,11 @@ public class ActivityStarterTests extends ActivityTestsBase { prepareStarter(launchFlags); final IApplicationThread caller = mock(IApplicationThread.class); - // If no caller app, return {@code null} {@link ProcessRecord}. - final ProcessRecord record = containsConditions(preconditions, PRECONDITION_NO_CALLER_APP) - ? null : new ProcessRecord(service.mAm, mock(ApplicationInfo.class), null, 0, null); - - doReturn(record).when(service.mAm).getRecordForAppLocked(anyObject()); + final WindowProcessController wpc = + containsConditions(preconditions, PRECONDITION_NO_CALLER_APP) + ? null : new WindowProcessController( + service, mock(ApplicationInfo.class),null, 0, -1, null, null, null); + doReturn(wpc).when(service).getProcessController(anyObject()); final Intent intent = new Intent(); intent.setFlags(launchFlags); @@ -354,10 +355,12 @@ public class ActivityStarterTests extends ActivityTestsBase { invocation -> { throw new RuntimeException("Not stubbed"); }); - doReturn(mockPackageManager).when(mService.mAm).getPackageManagerInternalLocked(); + doReturn(mockPackageManager).when(mService).getPackageManagerInternalLocked(); // Never review permissions doReturn(false).when(mockPackageManager).isPermissionsReviewRequired(any(), anyInt()); + doNothing().when(mockPackageManager).grantEphemeralAccess( + anyInt(), any(), anyInt(), anyInt()); final Intent intent = new Intent(); intent.addFlags(launchFlags); @@ -408,8 +411,9 @@ public class ActivityStarterTests extends ActivityTestsBase { .setActivityOptions(new SafeActivityOptions(options)) .execute(); - // verify that values are passed to the modifier. - verify(modifier, times(1)).onCalculate(any(), eq(windowLayout), any(), any(), eq(options), + // verify that values are passed to the modifier. Values are passed twice -- once for + // setting initial state, another when task is created. + verify(modifier, times(2)).onCalculate(any(), eq(windowLayout), any(), any(), eq(options), any(), any()); } @@ -510,7 +514,7 @@ public class ActivityStarterTests extends ActivityTestsBase { */ @Test public void testActivityStartsLogging_noLoggingWhenDisabled() { - doReturn(false).when(mService.mAm).isActivityStartsLoggingEnabled(); + doReturn(false).when(mService).isActivityStartsLoggingEnabled(); doReturn(mActivityMetricsLogger).when(mService.mStackSupervisor).getActivityMetricsLogger(); ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK); @@ -528,7 +532,7 @@ public class ActivityStarterTests extends ActivityTestsBase { @Test public void testActivityStartsLogging_logsWhenEnabled() { // note: conveniently this package doesn't have any activity visible - doReturn(true).when(mService.mAm).isActivityStartsLoggingEnabled(); + doReturn(true).when(mService).isActivityStartsLoggingEnabled(); doReturn(mActivityMetricsLogger).when(mService.mStackSupervisor).getActivityMetricsLogger(); ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_NEW_TASK) diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java index 2008861907a6..023f7758bd0a 100644 --- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java +++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java @@ -162,7 +162,8 @@ public class ActivityTestsBase { void setupActivityManagerService( TestActivityManagerService am, TestActivityTaskManagerService atm) { - atm.setActivityManagerService(am); + atm.setActivityManagerService(am, am.mHandlerThread.getLooper(), am.mIntentFirewall, + am.mPendingIntentController); atm.mAmInternal = am.getLocalService(); am.mAtmInternal = atm.getLocalService(); // Makes sure the supervisor is using with the spy object. diff --git a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java index 0d1302f78316..ea1320ce3b83 100644 --- a/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java +++ b/services/tests/servicestests/src/com/android/server/am/TaskLaunchParamsModifierTests.java @@ -189,7 +189,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, /* layout */ null, mActivity, /* source */ null, options, mCurrent, mResult)); - assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, + assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode, WINDOWING_MODE_FULLSCREEN); } @@ -277,7 +277,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { } @Test - public void testNonEmptyLayoutInfersFreeformWithResizeableActivity() { + public void testNonEmptyLayoutUsesFullscreenWithResizeableActivity() { final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder() .setWidth(120).setHeight(80).build(); @@ -286,7 +286,7 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, layout, mActivity, /* source */ null, /* options */ null, mCurrent, mResult)); - assertEquivalentWindowingMode(WINDOWING_MODE_FREEFORM, mResult.mWindowingMode, + assertEquivalentWindowingMode(WINDOWING_MODE_FULLSCREEN, mResult.mWindowingMode, WINDOWING_MODE_FULLSCREEN); } @@ -713,21 +713,6 @@ public class TaskLaunchParamsModifierTests extends ActivityTestsBase { } @Test - public void testNonEmptyLayoutBoundsWithResizeableActivity() { - final ActivityDisplay display = mSupervisor.getActivityDisplay(DEFAULT_DISPLAY); - display.setBounds(new Rect(0, 0, 1920, 1080)); - final ActivityInfo.WindowLayout layout = new WindowLayoutBuilder() - .setWidth(120).setHeight(80).build(); - - mCurrent.mPreferredDisplayId = DEFAULT_DISPLAY; - - assertEquals(RESULT_CONTINUE, mTarget.onCalculate(/* task */ null, layout, mActivity, - /* source */ null, /* options */ null, mCurrent, mResult)); - - assertEquals(new Rect(900, 500, 1020, 580), mResult.mBounds); - } - - @Test public void testRespectBoundsFromFullyResolvedCurrentParam_NonEmptyBounds() { final TestActivityDisplay freeformDisplay = createNewActivityDisplay( WINDOWING_MODE_FREEFORM); diff --git a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java index 79eba680c998..92211ec0b649 100644 --- a/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java +++ b/services/tests/servicestests/src/com/android/server/backup/TrampolineTest.java @@ -887,7 +887,7 @@ public class TrampolineTest { } @Override - protected BackupManagerServiceInterface createBackupManagerService() { + protected BackupManagerService createBackupManagerService() { mCreateServiceCallsCount++; return sBackupManagerServiceMock; } diff --git a/startop/iorap/TEST_MAPPING b/startop/iorap/TEST_MAPPING new file mode 100644 index 000000000000..a09c2ee315db --- /dev/null +++ b/startop/iorap/TEST_MAPPING @@ -0,0 +1,13 @@ +{ + "presubmit": [ + { + "name": "libiorap-java-tests" + } + ], + "imports": [ + { + "path": "system/iorap" + } + ] +} + diff --git a/startop/iorap/tests/AndroidTest.xml b/startop/iorap/tests/AndroidTest.xml new file mode 100644 index 000000000000..f83a16ec0916 --- /dev/null +++ b/startop/iorap/tests/AndroidTest.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2018 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. +--> + +<configuration description="Runs libiorap-java-tests."> + <option name="test-suite-tag" value="apct" /> + <option name="test-suite-tag" value="apct-instrumentation" /> + <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller"> + <option name="cleanup-apks" value="true" /> + <option name="test-file-name" value="libiorap-java-tests.apk" /> + </target_preparer> + + <!-- + Our IIorapIntegrationTest.kt requires setlinux to be disabled: + it connects to the iorapd binder service but this requires selinux permissions: + + avc: denied { find } for service=iorapd pid=2738 uid=10050 + scontext=u:r:platform_app:s0:c512,c768 tcontext=u:object_r:iorapd_service:s0 + tclass=service_manager permissive=0 + --> + <target_preparer class="com.android.tradefed.targetprep.DisableSELinuxTargetPreparer"> + </target_preparer> + + <test class="com.android.tradefed.testtype.AndroidJUnitTest" > + <option name="package" value="com.google.android.startop.iorap.tests" /> + <option name="runner" value="android.support.test.runner.AndroidJUnitRunner" /> + </test> +</configuration> + diff --git a/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt index 4ba44a93f2a8..16dcbe20f46a 100644 --- a/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt +++ b/startop/iorap/tests/src/com/google/android/startop/iorap/IIorapIntegrationTest.kt @@ -77,17 +77,21 @@ class IIorapIntegrationTest { inOrder.verifyNoMoreInteractions() } finally { - iorapService.setTaskListener(null) + // iorapService.setTaskListener(null) + // FIXME: null is broken, C++ side sees a non-null object. } } @Test fun testOnPackageEvent() { + /* testAnyMethod { requestId : RequestId -> iorapService.onPackageEvent(requestId, PackageEvent.createReplaced( Uri.parse("https://www.google.com"), "com.fake.package")) } + */ + // FIXME: Broken for some reason. C++ side never sees this call. } @Test diff --git a/startop/tools/view_compiler/Android.bp b/startop/tools/view_compiler/Android.bp index c3e91849e636..3681529643bc 100644 --- a/startop/tools/view_compiler/Android.bp +++ b/startop/tools/view_compiler/Android.bp @@ -14,19 +14,30 @@ // limitations under the License. // +cc_defaults { + name: "viewcompiler_defaults", + shared_libs: [ + "libdexfile", + "slicer", + ], +} + cc_library_host_static { name: "libviewcompiler", + defaults: ["viewcompiler_defaults"], srcs: [ + "dex_builder.cc", "java_lang_builder.cc", "util.cc", ], static_libs: [ - "libbase" - ] + "libbase", + ], } cc_binary_host { name: "viewcompiler", + defaults: ["viewcompiler_defaults"], srcs: [ "main.cc", ], @@ -40,10 +51,12 @@ cc_binary_host { cc_test_host { name: "view-compiler-tests", + defaults: ["viewcompiler_defaults"], srcs: [ + "dex_builder_test.cc", "util_test.cc", ], static_libs: [ "libviewcompiler", - ] + ], } diff --git a/startop/tools/view_compiler/dex_builder.cc b/startop/tools/view_compiler/dex_builder.cc new file mode 100644 index 000000000000..7a9f41fd8f38 --- /dev/null +++ b/startop/tools/view_compiler/dex_builder.cc @@ -0,0 +1,214 @@ +/* + * Copyright (C) 2018 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. + */ + +#include "dex_builder.h" + +#include "dex/descriptors_names.h" +#include "dex/dex_instruction.h" + +#include <fstream> +#include <memory> + +namespace startop { +namespace dex { + +using std::shared_ptr; +using std::string; + +using art::Instruction; +using ::dex::kAccPublic; + +const TypeDescriptor TypeDescriptor::Int() { return TypeDescriptor{"I"}; }; +const TypeDescriptor TypeDescriptor::Void() { return TypeDescriptor{"V"}; }; + +namespace { +// From https://source.android.com/devices/tech/dalvik/dex-format#dex-file-magic +constexpr uint8_t kDexFileMagic[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x38, 0x00}; + +// Strings lengths can be 32 bits long, but encoded as LEB128 this can take up to five bytes. +constexpr size_t kMaxEncodedStringLength{5}; + +} // namespace + +void* TrackingAllocator::Allocate(size_t size) { + std::unique_ptr<uint8_t[]> buffer = std::make_unique<uint8_t[]>(size); + void* raw_buffer = buffer.get(); + allocations_[raw_buffer] = std::move(buffer); + return raw_buffer; +} + +void TrackingAllocator::Free(void* ptr) { allocations_.erase(allocations_.find(ptr)); } + +// Write out a DEX file that is basically: +// +// package dextest; +// public class DexTest { +// public static int foo() { return 5; } +// } +void WriteTestDexFile(const string& filename) { + DexBuilder dex_file; + + ClassBuilder cbuilder{dex_file.MakeClass("dextest.DexTest")}; + cbuilder.set_source_file("dextest.java"); + + MethodBuilder method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int()})}; + + MethodBuilder::Register r = method.MakeRegister(); + method.BuildConst4(r, 5); + method.BuildReturn(r); + + method.Encode(); + + slicer::MemView image{dex_file.CreateImage()}; + + std::ofstream out_file(filename); + out_file.write(image.ptr<const char>(), image.size()); +} + +DexBuilder::DexBuilder() : dex_file_{std::make_shared<ir::DexFile>()} { + dex_file_->magic = slicer::MemView{kDexFileMagic, sizeof(kDexFileMagic)}; +} + +slicer::MemView DexBuilder::CreateImage() { + ::dex::Writer writer(dex_file_); + size_t image_size{0}; + ::dex::u1* image = writer.CreateImage(&allocator_, &image_size); + return slicer::MemView{image, image_size}; +} + +ir::String* DexBuilder::GetOrAddString(const std::string& string) { + ir::String*& entry = strings_[string]; + + if (entry == nullptr) { + // Need to encode the length and then write out the bytes, including 1 byte for null terminator + auto buffer = std::make_unique<uint8_t[]>(string.size() + kMaxEncodedStringLength + 1); + uint8_t* string_data_start = ::dex::WriteULeb128(buffer.get(), string.size()); + + size_t header_length = + reinterpret_cast<uintptr_t>(string_data_start) - reinterpret_cast<uintptr_t>(buffer.get()); + + auto end = std::copy(string.begin(), string.end(), string_data_start); + *end = '\0'; + + entry = Alloc<ir::String>(); + // +1 for null terminator + entry->data = slicer::MemView{buffer.get(), header_length + string.size() + 1}; + string_data_.push_back(std::move(buffer)); + } + return entry; +} + +ClassBuilder DexBuilder::MakeClass(const std::string& name) { + auto* class_def = Alloc<ir::Class>(); + ir::Type* type_def = GetOrAddType(art::DotToDescriptor(name.c_str())); + type_def->class_def = class_def; + + class_def->type = type_def; + class_def->super_class = GetOrAddType(art::DotToDescriptor("java.lang.Object")); + class_def->access_flags = kAccPublic; + return ClassBuilder{this, class_def}; +} + +// TODO(eholk): we probably want GetOrAddString() also +ir::Type* DexBuilder::GetOrAddType(const std::string& descriptor) { + if (types_by_descriptor_.find(descriptor) != types_by_descriptor_.end()) { + return types_by_descriptor_[descriptor]; + } + + ir::Type* type = Alloc<ir::Type>(); + type->descriptor = GetOrAddString(descriptor); + types_by_descriptor_[descriptor] = type; + return type; +} + +ir::Proto* Prototype::Encode(DexBuilder* dex) const { + auto* proto = dex->Alloc<ir::Proto>(); + proto->shorty = dex->GetOrAddString(Shorty()); + proto->return_type = dex->GetOrAddType(return_type_.descriptor()); + if (param_types_.size() > 0) { + proto->param_types = dex->Alloc<ir::TypeList>(); + for (const auto& param_type : param_types_) { + proto->param_types->types.push_back(dex->GetOrAddType(param_type.descriptor())); + } + } else { + proto->param_types = nullptr; + } + return proto; +} + +std::string Prototype::Shorty() const { + std::string shorty; + shorty.append(return_type_.short_descriptor()); + for (const auto& type_descriptor : param_types_) { + shorty.append(type_descriptor.short_descriptor()); + } + return shorty; +} + +ClassBuilder::ClassBuilder(DexBuilder* parent, ir::Class* class_def) + : parent_(parent), class_(class_def) {} + +MethodBuilder ClassBuilder::CreateMethod(const std::string& name, Prototype prototype) { + ir::String* dex_name{parent_->GetOrAddString(name)}; + + auto* decl = parent_->Alloc<ir::MethodDecl>(); + decl->name = dex_name; + decl->parent = class_->type; + decl->prototype = prototype.Encode(parent_); + + return MethodBuilder{parent_, class_, decl}; +} + +void ClassBuilder::set_source_file(const string& source) { + class_->source_file = parent_->GetOrAddString(source); +} + +MethodBuilder::MethodBuilder(DexBuilder* dex, ir::Class* class_def, ir::MethodDecl* decl) + : dex_{dex}, class_{class_def}, decl_{decl} {} + +ir::EncodedMethod* MethodBuilder::Encode() { + auto* method = dex_->Alloc<ir::EncodedMethod>(); + method->decl = decl_; + + // TODO: make access flags configurable + method->access_flags = kAccPublic | ::dex::kAccStatic; + + auto* code = dex_->Alloc<ir::Code>(); + code->registers = num_registers_; + // TODO: support ins and outs + code->instructions = slicer::ArrayView<const ::dex::u2>(buffer_.data(), buffer_.size()); + method->code = code; + + class_->direct_methods.push_back(method); + + return method; +} + +MethodBuilder::Register MethodBuilder::MakeRegister() { return num_registers_++; } + +void MethodBuilder::BuildReturn() { buffer_.push_back(Instruction::RETURN_VOID); } + +void MethodBuilder::BuildReturn(Register src) { buffer_.push_back(Instruction::RETURN | src << 8); } + +void MethodBuilder::BuildConst4(Register target, int value) { + DCHECK_LT(value, 16); + // TODO: support more registers + DCHECK_LT(target, 16); + buffer_.push_back(Instruction::CONST_4 | (value << 12) | (target << 8)); +} + +} // namespace dex +} // namespace startop diff --git a/startop/tools/view_compiler/dex_builder.h b/startop/tools/view_compiler/dex_builder.h new file mode 100644 index 000000000000..d280abce21f5 --- /dev/null +++ b/startop/tools/view_compiler/dex_builder.h @@ -0,0 +1,189 @@ +/* + * Copyright (C) 2018 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. + */ +#ifndef DEX_BUILDER_H_ +#define DEX_BUILDER_H_ + +#include <map> +#include <string> +#include <vector> + +#include "slicer/dex_ir.h" +#include "slicer/writer.h" + +namespace startop { +namespace dex { + +// TODO: remove this once the dex generation code is complete. +void WriteTestDexFile(const std::string& filename); + +////////////////////////// +// Forward declarations // +////////////////////////// +class DexBuilder; + +// Our custom allocator for dex::Writer +// +// This keeps track of all allocations and ensures they are freed when +// TrackingAllocator is destroyed. Pointers to memory allocated by this +// allocator must not outlive the allocator. +class TrackingAllocator : public ::dex::Writer::Allocator { + public: + virtual void* Allocate(size_t size); + virtual void Free(void* ptr); + + private: + std::map<void*, std::unique_ptr<uint8_t[]>> allocations_; +}; + +// Represents a DEX type descriptor. +// +// TODO: add a way to create a descriptor for a reference of a class type. +class TypeDescriptor { + public: + // Named constructors for base type descriptors. + static const TypeDescriptor Int(); + static const TypeDescriptor Void(); + + // Return the full descriptor, such as I or Ljava/lang/Object + const std::string& descriptor() const { return descriptor_; } + // Return the shorty descriptor, such as I or L + std::string short_descriptor() const { return descriptor().substr(0, 1); } + + private: + TypeDescriptor(std::string descriptor) : descriptor_{descriptor} {} + + const std::string descriptor_; +}; + +// Defines a function signature. For example, Prototype{TypeDescriptor::VOID, TypeDescriptor::Int} +// represents the function type (Int) -> Void. +class Prototype { + public: + template <typename... TypeDescriptors> + Prototype(TypeDescriptor return_type, TypeDescriptors... param_types) + : return_type_{return_type}, param_types_{param_types...} {} + + // Encode this prototype into the dex file. + ir::Proto* Encode(DexBuilder* dex) const; + + // Get the shorty descriptor, such as VII for (Int, Int) -> Void + std::string Shorty() const; + + private: + const TypeDescriptor return_type_; + const std::vector<TypeDescriptor> param_types_; +}; + +// Tools to help build methods and their bodies. +class MethodBuilder { + public: + MethodBuilder(DexBuilder* dex, ir::Class* class_def, ir::MethodDecl* decl); + + // Encode the method into DEX format. + ir::EncodedMethod* Encode(); + + // Registers are just represented by their number. + using Register = size_t; + + // Create a new register to be used to storing values. Note that these are not SSA registers, like + // might be expected in similar code generators. This does no liveness tracking or anything, so + // it's up to the caller to reuse registers as appropriate. + Register MakeRegister(); + + ///////////////////////////////// + // Instruction builder methods // + ///////////////////////////////// + + // return-void + void BuildReturn(); + void BuildReturn(Register src); + // const/4 + void BuildConst4(Register target, int value); + + // TODO: add builders for more instructions + + private: + DexBuilder* dex_; + ir::Class* class_; + ir::MethodDecl* decl_; + + // A buffer to hold instructions we are generating. + std::vector<::dex::u2> buffer_; + + // How many registers we've allocated + size_t num_registers_; +}; + +// A helper to build class definitions. +class ClassBuilder { + public: + ClassBuilder(DexBuilder* parent, ir::Class* class_def); + + void set_source_file(const std::string& source); + + // Create a method with the given name and prototype. The returned MethodBuilder can be used to + // fill in the method body. + MethodBuilder CreateMethod(const std::string& name, Prototype prototype); + + private: + DexBuilder* parent_; + ir::Class* class_; +}; + +// Builds Dex files from scratch. +class DexBuilder { + public: + DexBuilder(); + + // Create an in-memory image of the DEX file that can either be loaded directly or written to a + // file. + slicer::MemView CreateImage(); + + template <typename T> + T* Alloc() { + return dex_file_->Alloc<T>(); + } + + // Find the ir::String that matches the given string, creating it if it does not exist. + ir::String* GetOrAddString(const std::string& string); + // Create a new class of the given name. + ClassBuilder MakeClass(const std::string& name); + + // Add a type for the given descriptor, or return the existing one if it already exists. + // See the TypeDescriptor class for help generating these. + ir::Type* GetOrAddType(const std::string& descriptor); + + private: + std::shared_ptr<ir::DexFile> dex_file_; + + // allocator_ is needed to be able to encode the image. + TrackingAllocator allocator_; + + // We'll need to allocate buffers for all of the encoded strings we create. This is where we store + // all of them. + std::vector<std::unique_ptr<uint8_t[]>> string_data_; + + // Keep track of what types we've defined so we can look them up later. + std::map<std::string, ir::Type*> types_by_descriptor_; + + // Keep track of what strings we've defined so we can look them up later. + std::map<std::string, ir::String*> strings_; +}; + +} // namespace dex +} // namespace startop + +#endif // DEX_BUILDER_H_ diff --git a/startop/tools/view_compiler/dex_builder_test.cc b/startop/tools/view_compiler/dex_builder_test.cc new file mode 100644 index 000000000000..0d8b8541caeb --- /dev/null +++ b/startop/tools/view_compiler/dex_builder_test.cc @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2018 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. + */ + +#include "dex_builder.h" + +#include "dex/art_dex_file_loader.h" +#include "dex/dex_file.h" +#include "gtest/gtest.h" + +using namespace startop::dex; + +// Takes a DexBuilder, encodes it into an in-memory DEX file, verifies the resulting DEX file and +// returns whether the verification was successful. +bool EncodeAndVerify(DexBuilder* dex_file) { + slicer::MemView image{dex_file->CreateImage()}; + + art::ArtDexFileLoader loader; + std::string error_msg; + std::unique_ptr<const art::DexFile> loaded_dex_file{loader.Open(image.ptr<const uint8_t>(), + image.size(), + /*location=*/"", + /*location_checksum=*/0, + /*oat_dex_file=*/nullptr, + /*verify=*/true, + /*verify_checksum=*/false, + &error_msg)}; + return loaded_dex_file != nullptr; +} + +TEST(DexBuilderTest, VerifyDexWithClassMethod) { + DexBuilder dex_file; + + auto cbuilder{dex_file.MakeClass("dextest.DexTest")}; + + auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void()})}; + method.BuildReturn(); + method.Encode(); + + EXPECT_TRUE(EncodeAndVerify(&dex_file)); +} + +// Makes sure a bad DEX class fails to verify. +TEST(DexBuilderTest, VerifyBadDexWithClassMethod) { + DexBuilder dex_file; + + auto cbuilder{dex_file.MakeClass("dextest.DexTest")}; + + // This method has the error, because methods cannot take Void() as a parameter. + auto method{ + cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Void(), TypeDescriptor::Void()})}; + method.BuildReturn(); + method.Encode(); + + EXPECT_FALSE(EncodeAndVerify(&dex_file)); +} + +TEST(DexBuilderTest, VerifyDexReturn5) { + DexBuilder dex_file; + + auto cbuilder{dex_file.MakeClass("dextest.DexTest")}; + + auto method{cbuilder.CreateMethod("foo", Prototype{TypeDescriptor::Int()})}; + auto r = method.MakeRegister(); + method.BuildConst4(r, 5); + method.BuildReturn(r); + method.Encode(); + + EXPECT_TRUE(EncodeAndVerify(&dex_file)); +} diff --git a/startop/tools/view_compiler/main.cc b/startop/tools/view_compiler/main.cc index 0ad7e24feb3b..7d791c229a98 100644 --- a/startop/tools/view_compiler/main.cc +++ b/startop/tools/view_compiler/main.cc @@ -16,6 +16,7 @@ #include "gflags/gflags.h" +#include "dex_builder.h" #include "java_lang_builder.h" #include "util.h" @@ -27,15 +28,17 @@ #include <string> #include <vector> +namespace { + using namespace tinyxml2; using std::string; constexpr char kStdoutFilename[]{"stdout"}; -DEFINE_string(package, "", "The package name for the generated class (required)"); +DEFINE_bool(dex, false, "Generate a DEX file instead of Java"); DEFINE_string(out, kStdoutFilename, "Where to write the generated class"); +DEFINE_string(package, "", "The package name for the generated class (required)"); -namespace { class ViewCompilerXmlVisitor : public XMLVisitor { public: ViewCompilerXmlVisitor(JavaLangViewBuilder* builder) : builder_(builder) {} @@ -63,6 +66,7 @@ class ViewCompilerXmlVisitor : public XMLVisitor { private: JavaLangViewBuilder* builder_; }; + } // end namespace int main(int argc, char** argv) { @@ -82,6 +86,11 @@ int main(int argc, char** argv) { return 1; } + if (FLAGS_dex) { + startop::dex::WriteTestDexFile("test.dex"); + return 0; + } + const char* const filename = argv[kFileNameParam]; const string layout_name = FindLayoutNameFromFilename(filename); @@ -102,4 +111,4 @@ int main(int argc, char** argv) { xml.Accept(&visitor); return 0; -}
\ No newline at end of file +} diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java index 3ea018af97cf..c83d6aa3897d 100644 --- a/telephony/java/android/telephony/PhoneStateListener.java +++ b/telephony/java/android/telephony/PhoneStateListener.java @@ -17,6 +17,7 @@ package android.telephony; import android.annotation.NonNull; +import android.annotation.SystemApi; import android.annotation.UnsupportedAppUsage; import android.os.Bundle; import android.os.Handler; @@ -291,6 +292,15 @@ public class PhoneStateListener { */ public static final int LISTEN_PREFERRED_DATA_SUBID_CHANGE = 0x00400000; + /** + * Listen for changes to the radio power state. + * + * @see #onRadioPowerStateChanged + * @hide + */ + @SystemApi + public static final int LISTEN_RADIO_POWER_STATE_CHANGED = 0x00800000; + /* * Subscription used to listen to the phone state changes * @hide @@ -420,6 +430,9 @@ public class PhoneStateListener { case LISTEN_PREFERRED_DATA_SUBID_CHANGE: PhoneStateListener.this.onPreferredDataSubIdChanged((int) msg.obj); break; + case LISTEN_RADIO_POWER_STATE_CHANGED: + PhoneStateListener.this.onRadioPowerStateChanged((int) msg.obj); + break; } } }; @@ -672,6 +685,17 @@ public class PhoneStateListener { } /** + * Callback invoked when modem radio power state changes. Requires + * the READ_PRIVILEGED_PHONE_STATE permission. + * @param state the modem radio power state + * @hide + */ + @SystemApi + public void onRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) { + // default implementation empty + } + + /** * Callback invoked when telephony has received notice from a carrier * app that a network action that could result in connectivity loss * has been requested by an app using @@ -807,6 +831,10 @@ public class PhoneStateListener { send(LISTEN_PREFERRED_DATA_SUBID_CHANGE, 0, 0, subId); } + public void onRadioPowerStateChanged(@TelephonyManager.RadioPowerState int state) { + send(LISTEN_RADIO_POWER_STATE_CHANGED, 0, 0, state); + } + } /** diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 40ba2b6c2355..d0c6c49e18d6 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -88,8 +88,7 @@ public class SubscriptionManager { /** @hide */ public static final int INVALID_PHONE_INDEX = -1; - /** An invalid slot identifier */ - /** @hide */ + /** Indicates invalid sim slot. This can be returned by {@link #getSlotIndex(int)}. */ public static final int INVALID_SIM_SLOT_INDEX = -1; /** Indicates the default subscription ID in Telephony. */ @@ -1310,15 +1309,15 @@ public class SubscriptionManager { /** * Get slotIndex associated with the subscription. - * @return slotIndex as a positive integer or a negative value if an error either - * SIM_NOT_INSERTED or < 0 if an invalid slot index - * @hide + * + * @param subscriptionId the unique SubscriptionInfo index in database + * @return slotIndex as a positive integer or {@link #INVALID_SIM_SLOT_INDEX} if the supplied + * subscriptionId doesn't have an associated slot index. */ - @UnsupportedAppUsage - public static int getSlotIndex(int subId) { - if (!isValidSubscriptionId(subId)) { + public static int getSlotIndex(int subscriptionId) { + if (!isValidSubscriptionId(subscriptionId)) { if (DBG) { - logd("[getSlotIndex]- fail"); + logd("[getSlotIndex]- supplied subscriptionId is invalid."); } } @@ -1327,7 +1326,7 @@ public class SubscriptionManager { try { ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); if (iSub != null) { - result = iSub.getSlotIndex(subId); + result = iSub.getSlotIndex(subscriptionId); } } catch (RemoteException ex) { // ignore it diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index b6d728ed7448..8f78c346e422 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1619,8 +1619,7 @@ public class TelephonyManager { ITelephony telephony = getITelephony(); if (telephony == null) return null; - return telephony.getNeighboringCellInfo(mContext.getOpPackageName(), - mContext.getApplicationInfo().targetSdkVersion); + return telephony.getNeighboringCellInfo(mContext.getOpPackageName()); } catch (RemoteException ex) { return null; } catch (NullPointerException ex) { @@ -6871,6 +6870,60 @@ public class TelephonyManager { } /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(prefix = {"RADIO_POWER_"}, + value = {RADIO_POWER_OFF, + RADIO_POWER_ON, + RADIO_POWER_UNAVAILABLE, + }) + public @interface RadioPowerState {} + + /** + * Radio explicitly powered off (e.g, airplane mode). + * @hide + */ + @SystemApi + public static final int RADIO_POWER_OFF = 0; + + /** + * Radio power is on. + * @hide + */ + @SystemApi + public static final int RADIO_POWER_ON = 1; + + /** + * Radio power unavailable (eg, modem resetting or not booted). + * @hide + */ + @SystemApi + public static final int RADIO_POWER_UNAVAILABLE = 2; + + /** + * @return current modem radio state. + * + * <p>Requires permission: {@link android.Manifest.permission#READ_PRIVILEGED_PHONE_STATE} or + * {@link android.Manifest.permission#READ_PHONE_STATE} or that the calling + * app has carrier privileges (see {@link #hasCarrierPrivileges}). + * + * @hide + */ + @SystemApi + @RequiresPermission(anyOf = {android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, + android.Manifest.permission.READ_PHONE_STATE}) + public @RadioPowerState int getRadioPowerState() { + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.getRadioPowerState(getSlotIndex(), mContext.getOpPackageName()); + } + } catch (RemoteException ex) { + // This could happen if binder process crashes. + } + return RADIO_POWER_UNAVAILABLE; + } + + /** @hide */ @SystemApi @SuppressLint("Doclava125") public void updateServiceLocation() { diff --git a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl index 38a1bc73c94d..9e42f12d685d 100644 --- a/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/telephony/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -53,5 +53,6 @@ oneway interface IPhoneStateListener { void onUserMobileDataStateChanged(in boolean enabled); void onPhoneCapabilityChanged(in PhoneCapability capability); void onPreferredDataSubIdChanged(in int subId); + void onRadioPowerStateChanged(in int state); } diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 32eb12b49cf0..006b04036dca 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -280,7 +280,7 @@ interface ITelephony { /** * Returns the neighboring cell information of the device. */ - List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg, int targetSdk); + List<NeighboringCellInfo> getNeighboringCellInfo(String callingPkg); int getCallState(); @@ -1499,4 +1499,10 @@ interface ITelephony { * Set the default SMS app to a given package on a given user. */ void setDefaultSmsApp(int userId, String packageName); + + /** + * Return the modem radio power state for slot index. + * + */ + int getRadioPowerState(int slotIndex, String callingPackage); } diff --git a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl index c03065c34ca8..0baf860efac4 100644 --- a/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -80,4 +80,5 @@ interface ITelephonyRegistry { void notifyUserMobileDataStateChangedForPhoneId(in int phoneId, in int subId, in boolean state); void notifyPhoneCapabilityChanged(in PhoneCapability capability); void notifyPreferredDataSubIdChanged(int preferredSubId); + void notifyRadioPowerStateChanged(in int state); } diff --git a/tools/aapt2/Android.mk b/tools/aapt2/Android.mk index c9987b86cc5c..b165c6bed220 100644 --- a/tools/aapt2/Android.mk +++ b/tools/aapt2/Android.mk @@ -2,10 +2,19 @@ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) +aapt2_results := $(call intermediates-dir-for,PACKAGING,aapt2_run_host_unit_tests)/result.xml + # Target for running host unit tests on post/pre-submit. .PHONY: aapt2_run_host_unit_tests -aapt2_run_host_unit_tests: PRIVATE_GTEST_OPTIONS := --gtest_output=xml:$(DIST_DIR)/gtest/aapt2_host_unit_tests_result.xml -aapt2_run_host_unit_tests: $(HOST_OUT_NATIVE_TESTS)/aapt2_tests/aapt2_tests - -$(HOST_OUT_NATIVE_TESTS)/aapt2_tests/aapt2_tests $(PRIVATE_GTEST_OPTIONS) > /dev/null 2>&1 +aapt2_run_host_unit_tests: $(aapt2_results) + +$(call dist-for-goals,aapt2_run_host_unit_tests,$(aapt2_results):gtest/aapt2_host_unit_tests_result.xml) + +# Always run the tests again, even if they haven't changed +$(aapt2_results): .KATI_IMPLICIT_OUTPUTS := $(aapt2_results)-nocache +$(aapt2_results): $(HOST_OUT_NATIVE_TESTS)/aapt2_tests/aapt2_tests + -$(HOST_OUT_NATIVE_TESTS)/aapt2_tests/aapt2_tests --gtest_output=xml:$@ > /dev/null 2>&1 + +aapt2_results := include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tools/hiddenapi/sort_api.sh b/tools/hiddenapi/sort_api.sh index 76a2f2d6eba1..710da40585ac 100755 --- a/tools/hiddenapi/sort_api.sh +++ b/tools/hiddenapi/sort_api.sh @@ -21,4 +21,6 @@ A=( $(uniq <<< "${A[*]}") ) A=( ${C[*]} ${A[*]} ) unset IFS # Dump array back into the file -printf '%s\n' "${A[@]}" > "$dest_list" +if [ ${#A[@]} -ne 0 ]; then + printf '%s\n' "${A[@]}" > "$dest_list" +fi |