diff options
20 files changed, 131 insertions, 65 deletions
diff --git a/cmds/installd/dexopt.cpp b/cmds/installd/dexopt.cpp index 9f1cd451cc..02a60637de 100644 --- a/cmds/installd/dexopt.cpp +++ b/cmds/installd/dexopt.cpp @@ -1877,9 +1877,8 @@ int dexopt(const char* dex_path, uid_t uid, const char* pkgname, const char* ins const char* dex_metadata_path, const char* compilation_reason) { CHECK(pkgname != nullptr); CHECK(pkgname[0] != 0); - if ((dexopt_flags & ~DEXOPT_MASK) != 0) { - LOG_FATAL("dexopt flags contains unknown fields\n"); - } + CHECK_EQ(dexopt_flags & ~DEXOPT_MASK, 0) + << "dexopt flags contains unknown fields: " << dexopt_flags; if (!validate_dex_path_size(dex_path)) { return -1; diff --git a/cmds/installd/installd_constants.h b/cmds/installd/installd_constants.h index 06c83e4758..6282ba2512 100644 --- a/cmds/installd/installd_constants.h +++ b/cmds/installd/installd_constants.h @@ -64,6 +64,7 @@ constexpr int DEXOPT_MASK = | DEXOPT_FORCE | DEXOPT_STORAGE_CE | DEXOPT_STORAGE_DE + | DEXOPT_IDLE_BACKGROUND_JOB | DEXOPT_ENABLE_HIDDEN_API_CHECKS; // NOTE: keep in sync with StorageManager diff --git a/cmds/installd/otapreopt.cpp b/cmds/installd/otapreopt.cpp index 899285a84e..76edb4cc74 100644 --- a/cmds/installd/otapreopt.cpp +++ b/cmds/installd/otapreopt.cpp @@ -82,7 +82,8 @@ static_assert(DEXOPT_STORAGE_DE == 1 << 8, "DEXOPT_STORAGE_DE unexpected."); static_assert(DEXOPT_ENABLE_HIDDEN_API_CHECKS == 1 << 10, "DEXOPT_ENABLE_HIDDEN_API_CHECKS unexpected"); -static_assert(DEXOPT_MASK == 0x5fe, "DEXOPT_MASK unexpected."); +static_assert(DEXOPT_MASK == (0x5fe | DEXOPT_IDLE_BACKGROUND_JOB), + "DEXOPT_MASK unexpected."); diff --git a/libs/binder/AppOpsManager.cpp b/libs/binder/AppOpsManager.cpp index f3b86ae311..62c8987def 100644 --- a/libs/binder/AppOpsManager.cpp +++ b/libs/binder/AppOpsManager.cpp @@ -100,11 +100,12 @@ int32_t AppOpsManager::noteOp(int32_t op, int32_t uid, const String16& callingPa : APP_OPS_MANAGER_UNAVAILABLE_MODE; } -int32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) { +int32_t AppOpsManager::startOpNoThrow(int32_t op, int32_t uid, const String16& callingPackage, + bool startIfModeDefault) { sp<IAppOpsService> service = getService(); return service != NULL - ? service->startOperation(getToken(service), op, uid, callingPackage) - : APP_OPS_MANAGER_UNAVAILABLE_MODE; + ? service->startOperation(getToken(service), op, uid, callingPackage, + startIfModeDefault) : APP_OPS_MANAGER_UNAVAILABLE_MODE; } void AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) { diff --git a/libs/binder/IAppOpsService.cpp b/libs/binder/IAppOpsService.cpp index 638ae5c8ac..9c76350cbd 100644 --- a/libs/binder/IAppOpsService.cpp +++ b/libs/binder/IAppOpsService.cpp @@ -61,13 +61,14 @@ public: } virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid, - const String16& packageName) { + const String16& packageName, bool startIfModeDefault) { Parcel data, reply; data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); data.writeStrongBinder(token); data.writeInt32(code); data.writeInt32(uid); data.writeString16(packageName); + data.writeInt32(startIfModeDefault ? 1 : 0); remote()->transact(START_OPERATION_TRANSACTION, data, &reply); // fail on exception if (reply.readExceptionCode() != 0) return MODE_ERRORED; @@ -159,7 +160,8 @@ status_t BnAppOpsService::onTransact( int32_t code = data.readInt32(); int32_t uid = data.readInt32(); String16 packageName = data.readString16(); - int32_t res = startOperation(token, code, uid, packageName); + bool startIfModeDefault = data.readInt32() == 1; + int32_t res = startOperation(token, code, uid, packageName, startIfModeDefault); reply->writeNoException(); reply->writeInt32(res); return NO_ERROR; diff --git a/libs/binder/include/binder/AppOpsManager.h b/libs/binder/include/binder/AppOpsManager.h index 4212776e89..a44d270411 100644 --- a/libs/binder/include/binder/AppOpsManager.h +++ b/libs/binder/include/binder/AppOpsManager.h @@ -99,7 +99,8 @@ public: int32_t checkOp(int32_t op, int32_t uid, const String16& callingPackage); int32_t noteOp(int32_t op, int32_t uid, const String16& callingPackage); - int32_t startOp(int32_t op, int32_t uid, const String16& callingPackage); + int32_t startOpNoThrow(int32_t op, int32_t uid, const String16& callingPackage, + bool startIfModeDefault); void finishOp(int32_t op, int32_t uid, const String16& callingPackage); void startWatchingMode(int32_t op, const String16& packageName, const sp<IAppOpsCallback>& callback); diff --git a/libs/binder/include/binder/IAppOpsService.h b/libs/binder/include/binder/IAppOpsService.h index dc18045975..ecba5d66b3 100644 --- a/libs/binder/include/binder/IAppOpsService.h +++ b/libs/binder/include/binder/IAppOpsService.h @@ -33,7 +33,7 @@ public: virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) = 0; virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName) = 0; virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid, - const String16& packageName) = 0; + const String16& packageName, bool startIfModeDefault) = 0; virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid, const String16& packageName) = 0; virtual void startWatchingMode(int32_t op, const String16& packageName, diff --git a/libs/gui/SurfaceComposerClient.cpp b/libs/gui/SurfaceComposerClient.cpp index b7773c4f45..92a24ad933 100644 --- a/libs/gui/SurfaceComposerClient.cpp +++ b/libs/gui/SurfaceComposerClient.cpp @@ -105,12 +105,11 @@ SurfaceComposerClient::Transaction::Transaction(const Transaction& other) : } SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::merge(Transaction&& other) { - for (auto const& state : other.mComposerStates) { - ssize_t index = mComposerStates.indexOf(state); - if (index < 0) { - mComposerStates.add(state); + for (auto const& kv : other.mComposerStates) { + if (mComposerStates.count(kv.first) == 0) { + mComposerStates[kv.first] = kv.second; } else { - mComposerStates.editItemAt(static_cast<size_t>(index)).state.merge(state.state); + mComposerStates[kv.first].state.merge(kv.second.state); } } other.mComposerStates.clear(); @@ -141,7 +140,10 @@ status_t SurfaceComposerClient::Transaction::apply(bool synchronous) { mForceSynchronous |= synchronous; - composerStates = mComposerStates; + for (auto const& kv : mComposerStates){ + composerStates.add(kv.second); + } + mComposerStates.clear(); displayStates = mDisplayStates; @@ -182,18 +184,15 @@ void SurfaceComposerClient::Transaction::setAnimationTransaction() { } layer_state_t* SurfaceComposerClient::Transaction::getLayerState(const sp<SurfaceControl>& sc) { - ComposerState s; - s.client = sc->getClient()->mClient; - s.state.surface = sc->getHandle(); - - ssize_t index = mComposerStates.indexOf(s); - if (index < 0) { + if (mComposerStates.count(sc) == 0) { // we don't have it, add an initialized layer_state to our list - index = mComposerStates.add(s); + ComposerState s; + s.client = sc->getClient()->mClient; + s.state.surface = sc->getHandle(); + mComposerStates[sc] = s; } - ComposerState* const out = mComposerStates.editArray(); - return &(out[index].state); + return &(mComposerStates[sc].state); } SurfaceComposerClient::Transaction& SurfaceComposerClient::Transaction::setPosition( diff --git a/libs/gui/include/gui/SurfaceComposerClient.h b/libs/gui/include/gui/SurfaceComposerClient.h index e5156c6121..3fe66356bf 100644 --- a/libs/gui/include/gui/SurfaceComposerClient.h +++ b/libs/gui/include/gui/SurfaceComposerClient.h @@ -19,6 +19,7 @@ #include <stdint.h> #include <sys/types.h> +#include <unordered_map> #include <binder/IBinder.h> @@ -127,8 +128,14 @@ public: static status_t injectVSync(nsecs_t when); + struct SCHash { + std::size_t operator()(const sp<SurfaceControl>& sc) const { + return std::hash<SurfaceControl *>{}(sc.get()); + } + }; + class Transaction { - SortedVector<ComposerState> mComposerStates; + std::unordered_map<sp<SurfaceControl>, ComposerState, SCHash> mComposerStates; SortedVector<DisplayState > mDisplayStates; uint32_t mForceSynchronous = 0; uint32_t mTransactionNestCount = 0; diff --git a/services/inputflinger/tests/Android.bp b/services/inputflinger/tests/Android.bp index 8a35509822..b1d5e61b00 100644 --- a/services/inputflinger/tests/Android.bp +++ b/services/inputflinger/tests/Android.bp @@ -12,7 +12,7 @@ cc_test { "-Werror", "-Wno-unused-parameter", ], - shared_libs = [ + shared_libs: [ "libcutils", "liblog", "libutils", diff --git a/services/surfaceflinger/Android.bp b/services/surfaceflinger/Android.bp index ae34d34fae..3531c4ebd9 100644 --- a/services/surfaceflinger/Android.bp +++ b/services/surfaceflinger/Android.bp @@ -73,8 +73,8 @@ cc_defaults { cc_library_headers { name: "libsurfaceflinger_headers", export_include_dirs: ["."], - static_libs = ["libserviceutils"], - export_static_lib_headers = ["libserviceutils"], + static_libs: ["libserviceutils"], + export_static_lib_headers: ["libserviceutils"], } filegroup { @@ -139,7 +139,7 @@ cc_library_shared { "frameworks/native/vulkan/include", ], cppflags: [ - "-fwhole-program-vtables", // requires ThinLTO + "-fwhole-program-vtables", // requires ThinLTO ], lto: { thin: true, diff --git a/services/surfaceflinger/MonitoredProducer.cpp b/services/surfaceflinger/MonitoredProducer.cpp index 1a5a85e079..389fbd23e3 100644 --- a/services/surfaceflinger/MonitoredProducer.cpp +++ b/services/surfaceflinger/MonitoredProducer.cpp @@ -33,26 +33,13 @@ MonitoredProducer::~MonitoredProducer() { // because we don't know where this destructor is called from. It could be // called with the mStateLock held, leading to a dead-lock (it actually // happens). - class MessageCleanUpList : public MessageBase { - public: - MessageCleanUpList(const sp<SurfaceFlinger>& flinger, - const wp<IBinder>& producer) - : mFlinger(flinger), mProducer(producer) {} - - virtual ~MessageCleanUpList() {} - - virtual bool handler() { - Mutex::Autolock _l(mFlinger->mStateLock); - mFlinger->mGraphicBufferProducerList.remove(mProducer); - return true; - } - - private: - sp<SurfaceFlinger> mFlinger; - wp<IBinder> mProducer; - }; - - mFlinger->postMessageAsync(new MessageCleanUpList(mFlinger, asBinder(mProducer))); + sp<LambdaMessage> cleanUpListMessage = + new LambdaMessage([flinger = mFlinger, asBinder = wp<IBinder>(onAsBinder())]() { + Mutex::Autolock lock(flinger->mStateLock); + flinger->mGraphicBufferProducerList.erase(asBinder); + }); + + mFlinger->postMessageAsync(cleanUpListMessage); } status_t MonitoredProducer::requestBuffer(int slot, sp<GraphicBuffer>* buf) { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index c8025b37c5..cb410a14e1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -701,7 +701,7 @@ bool SurfaceFlinger::authenticateSurfaceTexture( bool SurfaceFlinger::authenticateSurfaceTextureLocked( const sp<IGraphicBufferProducer>& bufferProducer) const { sp<IBinder> surfaceTextureBinder(IInterface::asBinder(bufferProducer)); - return mGraphicBufferProducerList.indexOf(surfaceTextureBinder) >= 0; + return mGraphicBufferProducerList.count(surfaceTextureBinder.get()) > 0; } status_t SurfaceFlinger::getSupportedFrameTimestamps( @@ -2894,7 +2894,9 @@ status_t SurfaceFlinger::addClientLayer(const sp<Client>& client, parent->addChild(lbc); } - mGraphicBufferProducerList.add(IInterface::asBinder(gbc)); + mGraphicBufferProducerList.insert(IInterface::asBinder(gbc).get()); + LOG_ALWAYS_FATAL_IF(mGraphicBufferProducerList.size() > MAX_LAYERS, + "Suspected IGBP leak"); mLayersAdded = true; mNumLayers++; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index aae8d2ccc8..392acaa0a6 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -717,7 +717,9 @@ private: bool mTransactionPending; bool mAnimTransactionPending; SortedVector< sp<Layer> > mLayersPendingRemoval; - SortedVector< wp<IBinder> > mGraphicBufferProducerList; + + // Can't be unordered_set because wp<> isn't hashable + std::set<wp<IBinder>> mGraphicBufferProducerList; // protected by mStateLock (but we could use another lock) bool mLayersRemoved; diff --git a/services/surfaceflinger/layerproto/Android.bp b/services/surfaceflinger/layerproto/Android.bp index 8eb218c96e..485090c778 100644 --- a/services/surfaceflinger/layerproto/Android.bp +++ b/services/surfaceflinger/layerproto/Android.bp @@ -33,4 +33,22 @@ cc_library_shared { "-Wno-undef", ], -}
\ No newline at end of file +} + +java_library_static { + name: "layersprotosnano", + host_supported: true, + proto: { + type: "nano", + }, + srcs: ["*.proto"], + no_framework_libs: true, + target: { + android: { + jarjar_rules: "jarjar-rules.txt", + }, + host: { + static_libs: ["libprotobuf-java-nano"], + }, + }, +} diff --git a/services/surfaceflinger/layerproto/jarjar-rules.txt b/services/surfaceflinger/layerproto/jarjar-rules.txt new file mode 100644 index 0000000000..40043a861c --- /dev/null +++ b/services/surfaceflinger/layerproto/jarjar-rules.txt @@ -0,0 +1 @@ +rule com.google.protobuf.nano.** com.android.framework.protobuf.nano.@1 diff --git a/services/surfaceflinger/tests/SurfaceFlinger_test.filter b/services/surfaceflinger/tests/SurfaceFlinger_test.filter index be4127c915..36424b9c5e 100644 --- a/services/surfaceflinger/tests/SurfaceFlinger_test.filter +++ b/services/surfaceflinger/tests/SurfaceFlinger_test.filter @@ -1,5 +1,5 @@ { "presubmit": { - "filter": "LayerTransactionTest.*:LayerUpdateTest.*:ChildLayerTest.*:SurfaceFlingerStress.*:CropLatchingTest.*:GeometryLatchingTest.*" + "filter": "LayerTransactionTest.*:LayerUpdateTest.*:ChildLayerTest.*:SurfaceFlingerStress.*:CropLatchingTest.*:GeometryLatchingTest.*:ScreenCaptureTest.*:DereferenceSurfaceControlTest.*" } } diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index ac8a2ad868..92c26af9eb 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -2460,4 +2460,49 @@ TEST_F(ScreenCaptureTest, CaptureInvalidLayer) { ASSERT_EQ(NAME_NOT_FOUND, sf->captureLayers(redLayerHandle, &outBuffer, Rect::EMPTY_RECT, 1.0)); } + +class DereferenceSurfaceControlTest : public LayerTransactionTest { +protected: + void SetUp() override { + LayerTransactionTest::SetUp(); + bgLayer = createLayer("BG layer", 20, 20); + fillLayerColor(bgLayer, Color::RED); + fgLayer = createLayer("FG layer", 20, 20); + fillLayerColor(fgLayer, Color::BLUE); + Transaction().setLayer(fgLayer, mLayerZBase + 1).apply(); + { + SCOPED_TRACE("before anything"); + auto shot = screenshot(); + shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE); + } + } + void TearDown() override { + LayerTransactionTest::TearDown(); + bgLayer = 0; + fgLayer = 0; + } + + sp<SurfaceControl> bgLayer; + sp<SurfaceControl> fgLayer; +}; + +TEST_F(DereferenceSurfaceControlTest, LayerNotInTransaction) { + fgLayer = nullptr; + { + SCOPED_TRACE("after setting null"); + auto shot = screenshot(); + shot->expectColor(Rect(0, 0, 20, 20), Color::RED); + } +} + +TEST_F(DereferenceSurfaceControlTest, LayerInTransaction) { + auto transaction = Transaction().show(fgLayer); + fgLayer = nullptr; + { + SCOPED_TRACE("after setting null"); + auto shot = screenshot(); + shot->expectColor(Rect(0, 0, 20, 20), Color::BLUE); + } +} + } // namespace android diff --git a/services/utils/tests/Android.bp b/services/utils/tests/Android.bp index 15829fa12b..f21254cd7d 100644 --- a/services/utils/tests/Android.bp +++ b/services/utils/tests/Android.bp @@ -17,13 +17,13 @@ cc_test { name: "prioritydumper_test", test_suites: ["device-tests"], - srcs: [ "PriorityDumper_test.cpp"], + srcs: ["PriorityDumper_test.cpp"], shared_libs: [ "libutils", ], - static_libs = [ + static_libs: [ "libgmock", - "libserviceutils" + "libserviceutils", ], clang: true, -}
\ No newline at end of file +} diff --git a/services/vr/virtual_touchpad/Android.bp b/services/vr/virtual_touchpad/Android.bp index 7196b2bb87..513fcc13d3 100644 --- a/services/vr/virtual_touchpad/Android.bp +++ b/services/vr/virtual_touchpad/Android.bp @@ -14,7 +14,7 @@ shared_libs = [ ] header_libraries = [ - "libdvr_headers" + "libdvr_headers", ] cc_library { @@ -48,19 +48,19 @@ cc_test { srcs: test_src_files, static_libs: test_static_libs, header_libs: header_libraries, - cflags = [ + cflags: [ "-Wall", "-Werror", ], - cppflags = [ + cppflags: [ "-std=c++11", ], - host_ldlibs = [ + host_ldlibs: [ "-llog", ], name: "VirtualTouchpad_test", stl: "libc++_static", - tags: [ "optional" ], + tags: ["optional"], } // Service. |