使我的 DeviceAdminReceiver 可移动

Make My DeviceAdminReceiver Removable

我正在为 android 编写一个 xamarin 应用程序,它使用设备管理员 api 来实现 "kiosk mode"。为此,我实现了 DeviceAdminReceiver 的一个子类,并通过 adb 命令“dpm set-device-owner”将该组件设置为设备管理员。我能够成功地做到这一点。

但是,在我将应用程序设置为设备管理员之后,我无法在不执行工厂擦除的情况下删除该应用程序,这使得调试成为真正的皮塔饼。 dpm 命令帮助输出表明,如果在应用程序清单中声明了 android:testOnly,则可以使用 remove_active_admin 子命令删除设备管理员。我试图通过 Application 属性来做到这一点,例如

[Application(Debuggable = true, TestOnly = true )]
public class MyApp: Application
{
}

但是 TestOnly 属性 在 xamarin 中的应用程序属性上不可用。

我的问题是...

  1. 如何在 xamarin 中将 testOnly 属性 添加到我的清单中?
  2. 还有其他方法可以让我的 DeviceAdminReceiver 可移动吗?

以下是“设置”->“安全”->“设备管理员”菜单中的屏幕截图。

  1. 显示我的 DeviceAdminReceiver 已成功激活。
  2. 为我的 DeviceAdminReceiver 显示灰色的删除选项。
  3. 在我的设备上显示了一个不同的 DeviceAdminReceiver,并启用了删除选项。

谢谢!

更新

非常感谢 SushiHangover 的回答。我想补充一点,如果你在你的清单中设置这个标志,当你调试项目时,apk 将不再正确安装。相反,您必须使用 adb pm 命令来安装包。我制作了以下脚本来简化安装/删除 apk。旁注,如果根命名空间以 capital 字母开头,dpm 命令对我来说失败。

安装

adb push com.bla.myproject.apk /sdcard/app.apk
adb shell pm install -t /sdcard/app.apk
adb shell dpm set-device-owner com.bla.myproject/com.bla.myproject.AdminRx

删除

adb shell dpm remove-active-admin com.bla.myproject/com.bla.myproject.AdminRx
adb shell pm uninstall com.bla.myproject

只需手动编辑并将其添加到项目 Properties 文件夹中的现有清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.sushihangover.Android_BottomBar">
    <uses-sdk android:minSdkVersion="16" />
    <application android:testOnly="true" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light.DarkActionBar">
    </application>
</manifest>

连同你的ApplicationAtrributes

#if DEBUG
    [Application(Debuggable = true, AllowBackup = false, Icon = "@mipmap/icon_debug")]
#else
    [Application(Debuggable = false, AllowBackup = true, Icon = "@mipmap/icon")]
#endif
    public class App : Application
    {
       ~~~

它们将在构建过程中合并在一起并成为:

~~~
<application android:testOnly="true" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light.DarkActionBar" android:allowBackup="false" android:debuggable="true" android:icon="@mipmap/icon_debug" android:name="md59b195add2a2dc8f3ae98a691cd945df5.App">
    ~~~
</application>
~~~