温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Android 8.1 关于应用授权弹框的问题

发布时间:2020-07-22 03:06:59 来源:网络 阅读:1556 作者:GaoNeil 栏目:移动开发

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);。 即允许增加PermissionController。

接上,其中定义在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"android:icon="@drawable/perm_group_location"
br/>android:icon="@drawable/perm_group_location"
br/>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;

需要注意的是,上面直接return PERMISSION_GRANTED只会使普通应用安装时不弹框,但是实际setting查看应用权限,其实没有获取授权。
真正获取授权,还是应该改为另外如下实现方式:
1)方式一:
packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/handheld/ReviewPermissionsFragment.java

packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/wear/ReviewPermissionsWearFragment.java
模拟onClick中confirm执行的
confirmPermissionsReview();
executeCallback(true);
activity.finish();
操作,并隐藏掉框的show,直接执行上面的操作。

2)方式二:
adb install -g xxx.apk 安装后,从data/system/users/0/runtime-permissions.xml 取得runtime-permissions.xml,后面写个脚本,并判断是否第一次启动,如果是,则覆盖data/system/users/0/runtime-permissions.xml,并重启系统,即可授权了。后面启动不用再覆盖和重启了。

3)修改PackageManagerService.java的
checkPermission
checkUidPermission
修改此两个函数,然后
if (true)
return PERMISSION_GRANTED;

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html

我的新的更多优惠的打包课程链接如下:
https://edu.51cto.com/sd/0a9d4

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI