调试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指令验证当前设备管理者