adb 设置设备管理者失败

调试APK时尝试用adb指令设置设备管理者
adb shell dpm set-device-owner xxx.xxx.xxx/.AdminReceiver

但是遇到以下错误

adb shell dpm set-device-owner xxx.xxx.xxx/.AdminReceiver
java.lang.RuntimeException: Can't set package ComponentInfo{xxx.xxx.xxx/xxx.xxx.xxx.AdminReceiver} as device owner.
        at com.android.commands.dpm.Dpm.runSetDeviceOwner(Dpm.java:204)
        at com.android.commands.dpm.Dpm.onRun(Dpm.java:115)
        at com.android.internal.os.BaseCommand.run(BaseCommand.java:56)
        at com.android.commands.dpm.Dpm.main(Dpm.java:41)
        at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
        at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:338)

根据报错信息跟源码找到frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
setDeviceOwner()方法,发现mHasFeature是false

public boolean setDeviceOwner(ComponentName admin, String ownerName, int userId) {
        if (!mHasFeature) {
        	Log.d("debug by moyujun", "mHasFeature is false...");
            return false;
        }
        \\...
}

然后找到mHasFeature怎么赋值的

mHasFeature = mInjector.hasFeature();

查看内部类

static class Injector {
\\...
public boolean hasFeature() {
            return getPackageManager().hasSystemFeature(PackageManager.FEATURE_DEVICE_ADMIN);
        }
\\...
}

找到frameworks/base/core/java/android/content/pm/PackageManager.java类 查看FEATURE_DEVICE_ADMIN值

/**
     * Feature for {@link #getSystemAvailableFeatures} and
     * {@link #hasSystemFeature}: The device supports device policy enforcement via device admins.
     */
    @SdkConstant(SdkConstantType.FEATURE)
    public static final String FEATURE_DEVICE_ADMIN = "android.software.device_admin";

feature文件一般是放在vendor/etc/permissions/目录,用调试检查后发现没有这个feature,然后新建了一个android.software.device_admin.xml,再push到vendor/etc/permissions/目录,重启机器(这里很重要,不然会不生效)

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <feature name="android.software.device_admin" />
</permissions>

再执行adb shell dpm set-device-owner xxx.xxx.xxx/.AdminReceiver,就成功啦
随后输入adb shell dumpsys device_policy指令验证当前设备管理者

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值