AppOps命令分析

本文主要介绍了Android系统的AppOps功能,它用于应用程序的操作权限管理。文章详细讲解了AppOps命令的使用,包括命令格式和命令列表,并深入剖析了权限设置的详细流程,涉及到AppOpsCommand类和AppOpsService的交互过程。

1, 概述

AppOps全称是 Application Operations,类似平时常说的应用程序的操作(权限)管理。AppOps是Google原生Android包含的功能,但是Google在每次版本更新时都会隐藏掉AppOps的入口。

 

2, AppOps命令

命令格式:

Appops <command>

 

命令列表:

命令

功能

实现方法

set allow

允许 权限

appOpsService.setMode

set deny

拒绝

appOpsService.setMode

set ignore

忽略

appOpsService.setMode

set default

默认

appOpsService.setMode

get

获取

appOpsService.getOpsForPackage

reset

重置

appOpsService.resetAllModes

 

3, 详细流程

所有adb命令的AppOps方法最后都会通过AppOpsCommand.java执行,然后通过跨进程

调用AppOpsService的方法完成,至于android系统中的AppOps原理在此就不论述了。

   AppOpsCommand的main方法如下,

public static void main(String[] args) {
        new AppOpsCommand().run(args);
}

调用父类的run方法,然后调用onRun方法, onRun方法如下,

@Override
    public void onRun() throws Exception {
        String command = nextArgRequired();
        switch (command) {
            case COMMAND_SET:
                runSet();
                break;

            case COMMAND_GET:
                runGet();
                break;

            case COMMAND_RESET:
                runReset();
                break;

            default:
                System.err.println("Error: Unknown command: '" + command + "'.");
                break;
        }
}

3个不同的指令分别对应不同的方法,例如, set命令会调用runSet方法, runSet方法如下,

private void runSet() throws Exception {
        String packageName = null;
        String op = null;
        String mode = null;
        int userId = UserHandle.USER_CURRENT;
        for (String argument; (argument = nextArg()) != null;) {
            if (ARGUMENT_USER.equals(argument)) {
                userId = Integer.parseInt(nextArgRequired());
            } else {
                if (packageName == null) {
                    packageName = argument;
                } else if (op == null) {
                    op = argument;
                } else if (mode == null) {
                    mode = argument;
                } else {
                    System.err.println("Error: Unsupported argument: " + argument);
                    return;
                }
            }
        }

        if (packageName == null) {
            System.err.println("Error: Package name not specified.");
            return;
        } else if (op == null) {
            System.err.println("Error: Operation not specified.");
            return;
        } else if (mode == null) {
            System.err.println("Error: Mode not specified.");
            return;
        }

        final int opInt = strOpToOp(op);
        if (opInt < 0) {
            return;
        }
        final int modeInt;
        switch (mode) {
            case MODE_ALLOW:
                modeInt = AppOpsManager.MODE_ALLOWED;
                break;
            case MODE_DENY:
                modeInt = AppOpsManager.MODE_ERRORED;
                break;
            case MODE_IGNORE:
                modeInt = AppOpsManager.MODE_IGNORED;
                break;
            case MODE_DEFAULT:
                modeInt = AppOpsManager.MODE_DEFAULT;
                break;
            default:
                System.err.println("Error: Mode " + mode + " is not valid,");
                return;
        }

        // Parsing complete, let's execute the command.

        if (userId == UserHandle.USER_CURRENT) {
            userId = ActivityManager.getCurrentUser();
        }

        final IPackageManager pm = ActivityThread.getPackageManager();
        final IAppOpsService appOpsService = IAppOpsService.Stub.asInterface(
                ServiceManager.getService(Context.APP_OPS_SERVICE));
        final int uid = pm.getPackageUid(packageName, userId);
        if (uid < 0) {
            System.err.println("Error: No UID for " + packageName + " in user " + userId);
            return;
        }
        appOpsService.setMode(opInt, uid, packageName, modeInt);
    }

最后调用AppOpsService 的setMode方法完成权限的设置

08-11 19:09:35.455 1000 2184 3602 E AppOps : Bad call made by uid 1001. Package "com.android.phone" does not belong to uid 10167. 08-11 19:09:35.455 1000 2184 5535 D WindowManager: updateSystemBarAttributes displayId: 0 Window{650ea3 u0 NotificationShade} 08-11 19:09:35.456 1000 2184 3602 E AppOps : Cannot noteOperation 08-11 19:09:35.456 1000 2184 3602 E AppOps : java.lang.SecurityException: Specified package "com.android.phone" under uid 10167 but it is not 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.verifyAndGetBypass(AppOpsService.java:5236) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.verifyAndGetBypass(AppOpsService.java:5081) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.noteOperationUnchecked(AppOpsService.java:3487) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.noteOperationImpl(AppOpsService.java:3474) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.-$$Nest$mnoteOperationImpl(Unknown Source:0) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService$CheckOpsDelegateDispatcher.$r8$lambda$eTKLGbByFLiOzK62QHhpSvtx4do(Unknown Source:0) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda0.apply(D8$$SyntheticClass:0) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.policy.AppOpsPolicy.noteOperation(AppOpsPolicy.java:254) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService$CheckOpsDelegateDispatcher.noteOperation(AppOpsService.java:8065) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.server.appop.AppOpsService.noteOperation(AppOpsService.java:3421) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at com.android.internal.app.IAppOpsService$Stub.onTransact(IAppOpsService.java:586) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at android.os.Binder.execTransactInternal(Binder.java:1428) 08-11 19:09:35.456 1000 2184 3602 E AppOps : at android.os.Binder.execTransact(Binder.java:1372) 是什么意思
最新发布
08-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值