android7.0 点击reset app preferences,后台services关闭

现象:

后台FMservice运行,进入settings---apps ---menu---reset app preferences 或者该应用--permissions,手动关闭权限,后台service自动关闭

提取的部分log

01-01 07:09:23.100   841   854 W PackageManager: Revoke runtime  permission: android.permission.RECORD_AUDIO for package com.android.fmradio
01-01 07:09:23.130   841   854 I ActivityManager: Killing 3783:com.android.fmradio/u0a90 (adj 200): permissions revoked
01-01 07:09:23.130   841   854 D ActivityManager: handleAppDiedLocked: app = ProcessRecord{4850064 3783:com.android.fmradio/u0a90}, app.pid = 3783
01-01 07:09:23.130   841   854 D ActivityManager: cleanUpApplicationRecord -- 3783
01-01 07:09:23.130   841   854 W ActivityManager: Scheduling restart of crashed service com.android.fmradio/.FmService in 1000ms

从log就可以看到,是PackageManager检测到 com.android.fmradio应用权限发生变化,调用ActivityManager中的Killing,直接杀了Killing com.android.fmradio进程

PackageManagerService.java

    public void revokeRuntimePermission(String packageName, String name, int userId) {
        if (!sUserManager.exists(userId)) {
            Log.e(TAG, "No such user:" + userId);
            return;
        }
        Slog.w(TAG, "Revoke runtime  permission: " + name + " for package " + packageName);


        mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS,
                "revokeRuntimePermission");


        enforceCrossUserPermission(Binder.getCallingUid(), userId,
                true /* requireFullPermission */, true /* checkShell */,
                "revokeRuntimePermission");


        final int appId;


        synchronized (mPackages) {
            final PackageParser.Package pkg = mPackages.get(packageName);
            if (pkg == null) {
                throw new IllegalArgumentException("Unknown package: " + packageName);
            }


            final BasePermission bp = mSettings.mPermissions.get(name);
            if (bp == null) {
                throw new IllegalArgumentException("Unknown permission: " + name);
            }


            enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(pkg, bp);


            // If a permission review is required for legacy apps we represent
            // their permissions as always granted runtime ones since we need
            // to keep the review required permission flag per user while an
            // install permission's state is shared across all users.
            /// M: CTA requirement - permission control
            if (Build.isPermissionReviewRequired()
                    && pkg.applicationInfo.targetSdkVersion < Build.VERSION_CODES.M
                    && bp.isRuntime()) {
                return;
            }


            SettingBase sb = (SettingBase) pkg.mExtras;
            if (sb == null) {
                throw new IllegalArgumentException("Unknown package: " + packageName);
            }


            final PermissionsState permissionsState = sb.getPermissionsState();


            final int flags = permissionsState.getPermissionFlags(name, userId);
            if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) != 0) {
                throw new SecurityException("Cannot revoke system fixed permission "
                        + name + " for package " + packageName);
            }


            if (bp.isDevelopment()) {
                // Development permissions must be handled specially, since they are not
                // normal runtime permissions.  For now they apply to all users.
                if (permissionsState.revokeInstallPermission(bp) !=
                        PermissionsState.PERMISSION_OPERATION_FAILURE) {
                    scheduleWriteSettingsLocked();
                }
                return;
            }


            if (permissionsState.revokeRuntimePermission(bp, userId) ==
                    PermissionsState.PERMISSION_OPERATION_FAILURE) {
                return;
            }


            mOnPermissionChangeListeners.onPermissionsChanged(pkg.applicationInfo.uid);


            // Critical, after this call app should never have the permission.
            mSettings.writeRuntimePermissionsForUserLPr(userId, true);


            appId = UserHandle.getAppId(pkg.applicationInfo.uid);
        }


        killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED); //在这里直接kill appid所在的进程
    }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值