05-27 09:03:04.337 7079 7254 D ContentResolver: java.lang.RuntimeException: here
05-27 09:03:04.337 7079 7254 D ContentResolver: at android.content.ContentResolver.delete(ContentResolver.java:1371)
05-27 09:03:04.337 7079 7254 D ContentResolver: at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:105)
05-27 09:03:04.337 7079 7254 D ContentResolver: at android.os.Handler.dispatchMessage(Handler.java:102)
05-27 09:03:04.337 7079 7254 D ContentResolver: at android.os.Looper.loop(Looper.java:154)
05-27 09:03:04.337 7079 7254 D ContentResolver: at android.os.HandlerThread.run(HandlerThread.java:61)
05-27 09:03:04.341 7079 7254 D ContentResolver: delete startTime=246684,provider=android.content.ContentProviderProxy@471e842
05-27 09:03:04.343 5545 6451 D ContentProvider: delete
05-27 09:03:04.343 5545 6451 D ContentProvider: java.lang.RuntimeException: here
05-27 09:03:04.343 5545 6451 D ContentProvider: at android.content.ContentProvider$Transport.delete(ContentProvider.java:336)
05-27 09:03:04.343 5545 6451 D ContentProvider: at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:206)
05-27 09:03:04.343 5545 6451 D ContentProvider: at android.os.Binder.execTransact(Binder.java:565)
05-27 09:03:04.344 5545 6451 D ContentProvider: delete callingPkg=com.android.mms,uri=content://sms/2
05-27 09:03:04.345 5545 6451 D SmsProvider: delete: match: 1,url=content://sms/2,where=null,whereArgs=null
05-27 09:03:04.412 5545 6451 D SmsProvider: delete: ncount: 1,url=content://sms/2
05-27 09:03:04.434 7079 7254 D ContentResolver: delete rowsDeleted=1,mPackageName=com.android.mms
05-27 10:14:37.492 4959 5821 D ContentProvider: delete mode=0,callingPkg=com.android.mmsmWriteOp=15
05-27 10:14:37.492 3449 5307 D AppOps : resolveProxyPackageNamecom.android.phone
05-27 10:14:37.492 3449 5307 D AppOps : uidMode0 switchCode 15
05-27 10:14:37.492 3449 5307 D AppOps : noteOperation: allowing code 15 uid 1001 package com.android.phone
05-27 10:14:37.492 3449 5307 D AppOps : proxyMode 0
05-27 10:14:37.493 3449 5307 D AppOps : resolveProxiedPackageNamecom.android.mms
05-27 10:14:37.493 3449 5307 D AppOps : switchOp.mode0 switchCode 15
05-27 10:14:37.493 3449 5307 D AppOps : noteOperation: allowing code 15 uid 10024 package com.android.mms
05-27 10:17:16.688 4959 5107 D ContentProvider: delete mode=0,callingPkg=com.xxx.salestrackermWriteOp=15
05-27 10:17:16.689 3449 5610 D AppOps : resolveProxyPackageNamecom.android.phone
05-27 10:17:16.689 3449 5610 D AppOps : uidMode0 switchCode 15
05-27 10:17:16.689 3449 5610 D AppOps : noteOperation: allowing code 15 uid 1001 package com.android.phone
05-27 10:17:16.689 3449 5610 D AppOps : proxyMode 0
05-27 10:17:16.689 3449 5610 D AppOps : resolveProxiedPackageNamecom.xxx.salestracker
05-27 10:17:16.689 3449 5610 D AppOps : switchOp.mode1 switchCode 15
05-27 10:17:16.689 3449 5610 D AppOps : noteOperation: reject #1 for code 15 (15) uid 1000 package com.hipad.salestracker
1、权限管理机制Android Runtime Permission.
2、Application Permission Manage的功能,该功能应该就是基于AppOps(应用程序权限管理)实现
AppOpsService.java
当应用需要去检查某个权限的时候,会调用checkOp或者noteOp去读取/data/system/appops.xml里面对应的值。
4.常用的接口
接口在AppOpsManager.java中,但大部分只针对系统应用。
-
public int checkOp(String op, int uid, String packageName)
检查某个应用(packageName)是否具有某个权限(op) -
public int checkOpNoThrow(String op, int uid, String packageName)
同checkOp,但出错不会报异常,返回MODE_ERRORED -
public int noteOp(String op, int uid, String packageName)
检查某个应用(packageName)是否具有某个权限(op),同时会做记录 -
public int noteOpNoThrow(String op, int uid, String packageName)
同checkOp,但出错不会报异常,返回MODE_ERRORED -
/* @hide /
public void setMode(int code, int uid, String packageName, int mode)
设置权限,code是权限的标识码,比如OP_READ_CONTACTS, mode是权限的状态,比如MODE_ALLOWED
android/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:2701: mAppOpsService = new AppOpsService(new File(systemDir, "appops.xml"), mHandler);
ContentProvider.java
//权限检查
/**
* Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is
* allowed to perform the given operation.
*/
public static final int MODE_ALLOWED = 0;
if (enforceWritePermission(callingPkg, uri, null) != AppOpsManager.MODE_ALLOWED) {
return 0;
}
private int enforceWritePermission(String callingPkg, Uri uri, IBinder callerToken)throws SecurityException {
final int mode = enforceWritePermissionInner(uri, callingPkg, callerToken);
if (mode != MODE_ALLOWED) {
return mode;
}
if (mWriteOp != AppOpsManager.OP_NONE) {
return mAppOpsManager.noteProxyOp(mWriteOp, callingPkg);
}
return AppOpsManager.MODE_ALLOWED;
}
添加如下代码:
AppOpsManager appOps = (AppOpsManager)getSystemService(APP_OPS_SERVICE);
ApplicationInfo info = getApplicationInfo();
int mode = appOps.checkOp(AppOpsManager.OP_WRITE_SMS, info.uid, info.processName);
if (mode != AppOpsManager.MODE_ALLOWED) {
Log.d(TAG,"xxx mode="+mode+",info.uid="+info.uid+",info.processName="+info.processName);
appOps.setMode(AppOpsManager.OP_WRITE_SMS, info.uid, info.processName, AppOpsManager.MODE_ALLOWED);
}