日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

AndroidL的checkPermission方法详解

發布時間:2025/3/15 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AndroidL的checkPermission方法详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?在Android源碼的很多地方都會出現權限檢查的方法checkPermission,此篇文字主要介紹Android5.1.1源碼中的checkPermission方法是如何實現的,在此以WallpaperManagerService.java中的checkPermission方法為例來分析。

./base/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java

? ? ........
? ? final Context mContext;
? ? ........
? ? public WallpaperManagerService(Context context) {
? ? ? ? mContext = context;
? ? ? ? ........
? ? }
? ? ........
? ? private void checkPermission(String permission) {

? ? ? ??// 調用Context的checkCallingOrSelfPermission來檢查權限

? ? ? ??if (PackageManager.PERMISSION_GRANTED!= mContext.checkCallingOrSelfPermission(permission)) {?

? ? ? ? ? ? throw new SecurityException("Access denied to process: " + Binder.getCallingPid()
? ? ? ? ? ? ? ? ? ? + ", must have permission " + permission);
? ? ? ? }
? ? }


checkCallingOrSelfPermission中checkCallingOrSelfPermission的定義

./base/core/java/android/context/Context.java?

? ? public abstract int checkCallingOrSelfPermission(@NonNull String permission);



ContextImpl實現了Context接口,權限檢查是在ContextImpl類的checkPermission方法來完成的
./base/core/java/android/app/ContextImpl.java?
? ? @Override
? ? public int checkPermission(String permission, int pid, int uid) {
? ? ? ? if (permission == null) {
? ? ? ? ? ? throw new IllegalArgumentException("permission is null");
? ? ? ? }

? ? ? ? try {
? ? ? ? ? ? return ActivityManagerNative.getDefault().checkPermission(
? ? ? ? ? ? ? ? ? ? permission, pid, uid);?// 調用ActivityManagerNative的getDefault()方法來獲取ActivityManagerService的對象
? ? ? ? } catch (RemoteException e) {
? ? ? ? ? ? return PackageManager.PERMISSION_DENIED;
? ? ? ? }
? ? }
? ? ........
? ? @Override
? ? public int checkCallingOrSelfPermission(String permission) {
? ? ? ? if (permission == null) {
? ? ? ? ? ? throw new IllegalArgumentException("permission is null");
? ? ? ? }

? ? ? ? return checkPermission(permission, Binder.getCallingPid(),
? ? ? ? ? ? ? ? Binder.getCallingUid());?// 調用checkPermission函數來檢查權限
? ? }


ActivityManagerNative中getDefault方法實現過程
./base/core/java/android/app/ActivityManagerNative.java
? ? static public IActivityManager getDefault() {
? ? ? ? return gDefault.get();?// 最終返回的是個ActivityManagerService的對象
? ? }


ActivityManagerService中checkPermission的實現過程
./base/services/core/java/com/android/server/am/ActivityManagerService.java
? ? int checkComponentPermission(String permission, int pid, int uid,
? ? ? ? ? ? int owningUid, boolean exported) {
? ? ? ? // We might be performing an operation on behalf of an indirect binder
? ? ? ? // invocation, e.g. via {@link #openContentUri}. ?Check and adjust the
? ? ? ? // client identity accordingly before proceeding.
? ? ? ? Identity tlsIdentity = sCallerIdentity.get();
? ? ? ? if (tlsIdentity != null) {
? ? ? ? ? ? Slog.d(TAG, "checkComponentPermission() adjusting {pid,uid} to {"
? ? ? ? ? ? ? ? ? ? + tlsIdentity.pid + "," + tlsIdentity.uid + "}");
? ? ? ? ? ? uid = tlsIdentity.uid;
? ? ? ? ? ? pid = tlsIdentity.pid;
? ? ? ? }

? ? ? ? if (pid == MY_PID) {
? ? ? ? ? ? return PackageManager.PERMISSION_GRANTED;
? ? ? ? }

? ? ? ? return ActivityManager.checkComponentPermission(permission, uid,
? ? ? ? ? ? ? ? owningUid, exported);?// 調用ActivityManager的checkComponentPermission來檢查權限
? ? }
? ? ........
? ? @Override
? ? public int checkPermission(String permission, int pid, int uid) {
? ? ? ? if (permission == null) {
? ? ? ? ? ? return PackageManager.PERMISSION_DENIED;

? ? ? ? }

? ? ? ??// 調用checkComponentPermission函數來檢查權限

? ? ? ? return checkComponentPermission(permission, pid, UserHandle.getAppId(uid), -1, true);
? ? }


ActivityManager中checkComponentPermission的實現過程
./base/core/java/android/app/ActivityManager.java
? ? public static int checkComponentPermission(String permission, int uid,
? ? ? ? ? ? int owningUid, boolean exported) {
? ? ? ? ........
? ? ? ? try {
? ? ? ? ? ? return AppGlobals.getPackageManager()?// 調用AppGlobals的getPackageManager()函數返回IPackageManager對象
? ? ? ? ? ? ? ? ? ? .checkUidPermission(permission, uid);
? ? ? ? } catch (RemoteException e) {
? ? ? ? ? ? // Should never happen, but if it does... deny!
? ? ? ? ? ? Slog.e(TAG, "PackageManager is dead?!?", e);
? ? ? ? }
? ? ? ? return PackageManager.PERMISSION_DENIED;
? ? }


AppGlobals的getPackageManager方法實現過程
./base/core/java/android/app/AppGlobals.java
? ? public static IPackageManager getPackageManager() {
? ? ? ? return ActivityThread.getPackageManager();?// 調用ActivityThread的getPackageManager()函數
? ? }


ActivityThread的getPackageManager實現過程
./base/core/java/android/app/ActivityThread.java
? ? public static IPackageManager getPackageManager() {
? ? ? ? if (sPackageManager != null) {
? ? ? ? ? ? //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
? ? ? ? ? ? return sPackageManager;
? ? ? ? }
? ? ? ? IBinder b = ServiceManager.getService("package");
? ? ? ? //Slog.v("PackageManager", "default service binder = " + b);
? ? ? ? sPackageManager = IPackageManager.Stub.asInterface(b);??// 最終獲取的是PackageManagerService的對象
? ? ? ? //Slog.v("PackageManager", "default service = " + sPackageManager);
? ? ? ? return sPackageManager;
? ? }



PackageManagerService的checkUidPermission實現過程
./base/services/core/java/com/android/server/pm/PackageManagerService.java
? ? @Override
? ? public int checkUidPermission(String permName, int uid) {
? ? ? ? synchronized (mPackages) {
? ? ? ? ? ? Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(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;

? ? }


至此權限檢查就已完成


原文地址:?

總結

以上是生活随笔為你收集整理的AndroidL的checkPermission方法详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。