diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-07-17 17:26:15 -0700 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2013-07-17 17:26:15 -0700 |
commit | 913b63d235a982174b66acad95ca2f87ac8a1982 (patch) | |
tree | 971b3386461f6a6aaefb01134967900c5dc9c805 /libs/binder | |
parent | ba3ed90b095dfd397aa252fb0234647d7cc5c8f9 (diff) | |
download | frameworks_native-913b63d235a982174b66acad95ca2f87ac8a1982.zip frameworks_native-913b63d235a982174b66acad95ca2f87ac8a1982.tar.gz frameworks_native-913b63d235a982174b66acad95ca2f87ac8a1982.tar.bz2 |
Follow framework change to track started ops by proc.
Change-Id: Ibbce3bf6556f45751c74bab045b46377e56bff9b
Diffstat (limited to 'libs/binder')
-rw-r--r-- | libs/binder/AppOpsManager.cpp | 16 | ||||
-rw-r--r-- | libs/binder/IAppOpsService.cpp | 32 |
2 files changed, 42 insertions, 6 deletions
diff --git a/libs/binder/AppOpsManager.cpp b/libs/binder/AppOpsManager.cpp index 7ac1b11..99c2747 100644 --- a/libs/binder/AppOpsManager.cpp +++ b/libs/binder/AppOpsManager.cpp @@ -15,6 +15,7 @@ */ #include <binder/AppOpsManager.h> +#include <binder/Binder.h> #include <binder/IServiceManager.h> #include <utils/SystemClock.h> @@ -22,6 +23,16 @@ namespace android { static String16 _appops("appops"); +static pthread_mutex_t gTokenMutex = PTHREAD_MUTEX_INITIALIZER; +static sp<IBinder> gToken; + +static const sp<IBinder>& getToken(const sp<IAppOpsService>& service) { + pthread_mutex_lock(&gTokenMutex); + if (gToken == NULL) { + gToken = service->getToken(new BBinder()); + } + return gToken; +} AppOpsManager::AppOpsManager() { @@ -66,13 +77,14 @@ int32_t AppOpsManager::noteOp(int32_t op, int32_t uid, const String16& callingPa int32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) { sp<IAppOpsService> service = getService(); - return service != NULL ? service->startOperation(op, uid, callingPackage) : MODE_IGNORED; + return service != NULL ? service->startOperation(getToken(service), op, uid, callingPackage) + : MODE_IGNORED; } void AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) { sp<IAppOpsService> service = getService(); if (service != NULL) { - service->finishOperation(op, uid, callingPackage); + service->finishOperation(getToken(service), op, uid, callingPackage); } } diff --git a/libs/binder/IAppOpsService.cpp b/libs/binder/IAppOpsService.cpp index 282b30f..471e3e9 100644 --- a/libs/binder/IAppOpsService.cpp +++ b/libs/binder/IAppOpsService.cpp @@ -61,9 +61,11 @@ public: return reply.readInt32(); } - virtual int32_t startOperation(int32_t code, int32_t uid, const String16& packageName) { + virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid, + const String16& packageName) { Parcel data, reply; data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); + data.writeStrongBinder(token); data.writeInt32(code); data.writeInt32(uid); data.writeString16(packageName); @@ -73,9 +75,11 @@ public: return reply.readInt32(); } - virtual void finishOperation(int32_t code, int32_t uid, const String16& packageName) { + virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid, + const String16& packageName) { Parcel data, reply; data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); + data.writeStrongBinder(token); data.writeInt32(code); data.writeInt32(uid); data.writeString16(packageName); @@ -98,6 +102,16 @@ public: data.writeStrongBinder(callback->asBinder()); remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply); } + + virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) { + Parcel data, reply; + data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); + data.writeStrongBinder(clientToken); + remote()->transact(GET_TOKEN_TRANSACTION, data, &reply); + // fail on exception + if (reply.readExceptionCode() != 0) return NULL; + return reply.readStrongBinder(); + } }; IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService"); @@ -131,20 +145,22 @@ status_t BnAppOpsService::onTransact( } break; case START_OPERATION_TRANSACTION: { CHECK_INTERFACE(IAppOpsService, data, reply); + sp<IBinder> token = data.readStrongBinder(); int32_t code = data.readInt32(); int32_t uid = data.readInt32(); String16 packageName = data.readString16(); - int32_t res = startOperation(code, uid, packageName); + int32_t res = startOperation(token, code, uid, packageName); reply->writeNoException(); reply->writeInt32(res); return NO_ERROR; } break; case FINISH_OPERATION_TRANSACTION: { CHECK_INTERFACE(IAppOpsService, data, reply); + sp<IBinder> token = data.readStrongBinder(); int32_t code = data.readInt32(); int32_t uid = data.readInt32(); String16 packageName = data.readString16(); - finishOperation(code, uid, packageName); + finishOperation(token, code, uid, packageName); reply->writeNoException(); return NO_ERROR; } break; @@ -164,6 +180,14 @@ status_t BnAppOpsService::onTransact( reply->writeNoException(); return NO_ERROR; } break; + case GET_TOKEN_TRANSACTION: { + CHECK_INTERFACE(IAppOpsService, data, reply); + sp<IBinder> clientToken = data.readStrongBinder(); + sp<IBinder> token = getToken(clientToken); + reply->writeNoException(); + reply->writeStrongBinder(token); + return NO_ERROR; + } break; default: return BBinder::onTransact(code, data, reply, flags); } |