Android检查权限
举个例子,来看下面段代码
1 if (!checkCallingPermission(android.Manifest.permission.MANAGE_APP_TOKENS, 2 "updateOrientationFromAppTokens()")) { 3 throw new SecurityException("Requires MANAGE_APP_TOKENS permission"); 4 }
找到函数checkCallingPermission(),我们查看函数内容
1 boolean checkCallingPermission(String permission, String func) { 2 // Quick check: if the calling permission is me, it's all okay. 3 if (Binder.getCallingPid() == Process.myPid()) { 4 return true; 5 } 6 7 if (mContext.checkCallingPermission(permission) 8 == PackageManager.PERMISSION_GRANTED) { 9 return true; 10 } 11 String msg = "Permission Denial: " + func + " from pid=" 12 + Binder.getCallingPid() 13 + ", uid=" + Binder.getCallingUid() 14 + " requires " + permission; 15 Slog.w(TAG, msg); 16 return false; 17 }
上面函数返回false的时候抛出异常,那么返回true的时候就是权限检查通过了,继续跟进Context.java
public abstract int checkCallingPermission(String permission);
原来是抽象的,继续查看继承它的类找到ContextImpl.java
1 @Override 2 public int checkPermission(String permission, int pid, int uid) { 3 if (permission == null) { 4 throw new IllegalArgumentException("permission is null"); 5 } 6 7 if (!Process.supportsProcesses()) { 8 return PackageManager.PERMISSION_GRANTED; 9 } 10 try { 11 return ActivityManagerNative.getDefault().checkPermission( 12 permission, pid, uid); 13 } catch (RemoteException e) { 14 return PackageManager.PERMISSION_DENIED; 15 } 16 } 17 18 @Override 19 public int checkCallingPermission(String permission) { 20 if (permission == null) { 21 throw new IllegalArgumentException("permission is null"); 22 } 23 24 if (!Process.supportsProcesses()) { 25 return PackageManager.PERMISSION_GRANTED; 26 } 27 int pid = Binder.getCallingPid(); 28 if (pid != Process.myPid()) { 29 return checkPermission(permission, pid, 30 Binder.getCallingUid()); 31 } 32 return PackageManager.PERMISSION_DENIED; 33 }
ActivityManagerNative.getDefault() 返回 IActivityManager,拿到ActivityManagerProxy对象的引用
static public IActivityManager getDefault() { if (gDefault != null) { return gDefault; } IBinder b = ServiceManager.getService("activity"); gDefault = asInterface(b); return gDefault; }
找到ActivityManagerNative.java
public int checkPermission(String permission, int pid, int uid)throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); data.writeInterfaceToken(IActivityManager.descriptor); data.writeString(permission); data.writeInt(pid); data.writeInt(uid); mRemote.transact(CHECK_PERMISSION_TRANSACTION, data, reply, 0); reply.readException(); int res = reply.readInt(); data.recycle(); reply.recycle(); return res; }
通过Binder机制调用到onTransact
public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException { case CHECK_PERMISSION_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); String perm = data.readString(); int pid = data.readInt(); int uid = data.readInt(); int res = checkPermission(perm, pid, uid); reply.writeNoException(); reply.writeInt(res); return true; } ................. }
找到ActivityManagerService.java
public int checkPermission(String permission, int pid, int uid) { if (permission == null) { return PackageManager.PERMISSION_DENIED; } return checkComponentPermission(permission, pid, uid, -1); }
int checkComponentPermission(String permission, int pid, int uid, int reqUid) { try { return AppGlobals.getPackageManager().checkUidPermission(permission, uid); } catch (RemoteException e) { } }
转到 AppGlobals.java
public static IPackageManager getPackageManager() { return ActivityThread.getPackageManager(); }
转到 ActivityThread.java
public static IPackageManager getPackageManager() { if (sPackageManager != null) { return sPackageManager; } IBinder b = ServiceManager.getService("package"); sPackageManager = IPackageManager.Stub.asInterface(b); return sPackageManager; }
转到PackageManagerService.java
public int checkUidPermission(String permName, int uid) { synchronized (mPackages) { Object obj = mSettings.getUserIdLP(uid); if (obj != null) { GrantedPermissions gp = (GrantedPermissions)obj; if (gp.grantedPermissions.contains(permName)) { return PackageManager.PERMISSION_GRANTED; } } else { HashSet<String> perms = mSystemPermissions.get(uid); if (perms != null && perms.contains(permName)) { return PackageManager.PERMISSION_GRANTED; } } } return PackageManager.PERMISSION_DENIED; }
转载自:https://www.cnblogs.com/RTFSC/archive/2012/03/14/2395749.html