1. 程式人生 > >Android 8.1 關於應用授權彈框的問題

Android 8.1 關於應用授權彈框的問題

cef 安裝 51cto draw 彈框 eve ring1 device 服務

Android 8.1 關於應用授權彈框的問題

cpp的native服務,例如
services/surfaceflinger/SurfaceFlinger.cpp 和services/sensorservice/SensorService.cpp
會使用
PermissionCache::checkPermission 或者 namespace android 下的checkPermission
這些都最終使用namespace android 下的checkPermission,即android::checkPermission
而native/libs/binder/IServiceManager.cpp 中在namespace android下定義了此checkPermission 函數 bool checkPermission(const String16& permission, pid_t pid, uid_t uid)

進而調用到所有 sp<IPermissionController> pc的pc->checkPermission(permission, pid, uid) , 即允許多個IPermissionController, IPermissionController可以註冊的。關於註冊可以參考base/core/java/android/os/ServiceManagerNative.java中的case IServiceManager.SET_PERMISSION_CONTROLLER_TRANSACTION: setPermissionController(controller);

接上,其中定義在native/libs/binder/IPermissionController.cpp中 class BpPermissionController : public BpInterface<IPermissionController> binder通信,進而調用到

BnPermissionController的bool res = checkPermission(permission, pid, uid);
這個,
作為一個IPermissionController接口實現之一,base/services/core/java/com/android/server/am/ActivityManagerService.java 中的static class PermissionController extends IPermissionController.Stub 就有checkPermission的實現。他調用到mActivityManagerService.checkPermission,即ActivityManagerService::checkPermission
這個又調用到checkComponentPermission,進而調用ActivityManager.checkComponentPermission,即./base/core/java/android/app/ActivityManager.java的checkComponentPermission()
此函數有一個實現:
if (appId == Process.ROOT_UID || appId == Process.SYSTEM_UID) {
return PackageManager.PERMISSION_GRANTED;
}
所以系統app,就直接允許了。

否則調用AppGlobals.getPackageManager()
.checkUidPermission(permission, uid);
會調用到base/services/core/java/com/android/server/pm/PackageManagerService.java的checkUidPermission

而strings.xml中的<string name="permgroupdesc_location">access this device\‘s location</string>之類的安裝或者允許應用時的彈框(讓用戶授權的)
被AndroidManifest.xml中使用
例如:
<!-- Used for permissions that allow accessing the device location. -->
<permission-group android:name="android.permission-group.LOCATION"br/>android:icon="@drawable/perm_group_location"
android:description="@string/permgroupdesc_location"
你搜索permission-group,可以找到:
base/core/res/res/values/attrs_manifest.xml 中有描述如何解析base/core/res/AndroidManifest.xml,例如<declare-styleable name="AndroidManifestPermission" parent="AndroidManifest">
其中base/core/java/android/content/pm/PackageParser.java 就是分析base/core/res/AndroidManifest.xml內容的代碼。
parseBaseApkCommon函數, 這個函數由parsePackage()調用。

base/services/core/java/com/android/server/pm/PackageManagerService.java 這個 會調用到 上面的 parsePackage 從而 彈出授權框。

所以關於對於沒有touch的等輸入的設備,去掉所有授權,直接允許授權,的修改方法:
修改ActivityManager.java的checkComponentPermission函數,直接return PackageManager.PERMISSION_GRANTED;
if (true)
return PackageManager.PERMISSION_GRANTED; //allow everything because we have no input device.

./base/core/java/android/content/PermissionChecker.java 的checkPermission 函數,也是直接 return PERMISSION_GRANTED;
if (true)
return PERMISSION_GRANTED;

另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html

Android 8.1 關於應用授權彈框的問題