使我的 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 中的应用程序属性上不可用。
我的问题是...
- 如何在 xamarin 中将 testOnly 属性 添加到我的清单中?
- 还有其他方法可以让我的 DeviceAdminReceiver 可移动吗?
以下是“设置”->“安全”->“设备管理员”菜单中的屏幕截图。
- 显示我的 DeviceAdminReceiver 已成功激活。
- 为我的 DeviceAdminReceiver 显示灰色的删除选项。
- 在我的设备上显示了一个不同的 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>
~~~
我正在为 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 中的应用程序属性上不可用。
我的问题是...
- 如何在 xamarin 中将 testOnly 属性 添加到我的清单中?
- 还有其他方法可以让我的 DeviceAdminReceiver 可移动吗?
以下是“设置”->“安全”->“设备管理员”菜单中的屏幕截图。
- 显示我的 DeviceAdminReceiver 已成功激活。
- 为我的 DeviceAdminReceiver 显示灰色的删除选项。
- 在我的设备上显示了一个不同的 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>
~~~