前言
最近有越来越多的开发者关注MDM(Mobile Device Management)相关的开发内容,MDM在iOS和Android端上大量应用在企业内部的设备管控。因此,下文会为大家介绍如何开发一个MDM管理应用。
开发环境
系统版本: OpenHarmony 5.0.0.27
DevEco Studio版本: OpenHarmony: DevEco Studio 4.1 Release(build: 4.1.0.400)
SDK版本: OpenHarmony: 4.1.7.7
开发流程
新建工程
打开IDE,依次点击File -> New -> Create Project -> Application -> [OpenHarmony]Empty Ability -> Next -> Finish,创建一个默认的OpenHarmony Api11应用工程。
新增MDM配置
在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为EnterpriseExtAbility。
在EnterpriseExtAbility目录,右键选择“New > ArkTS File”,新建一个文件并命名为EnterpriseExtAbility.ets。
打开EnterpriseExtAbility.ets文件,导入EnterpriseAdminExtensionAbility模块,自定义类继承EnterpriseAdminExtensionAbility并加上需要的应用通知回调方法,如onAdminEnabled()、onAdminDisabled()等回调方法。当设备管理员应用被激活或者去激活时,则可以在对应回调方法中接受系统发送通知。
src/main/ets/EnterpriseExtAbility/EnterpriseExtAbility.ets
import EnterpriseAdminExtensionAbility from '@ohos.enterprise.EnterpriseAdminExtensionAbility';
export default class EnterpriseAdminAbility extends EnterpriseAdminExtensionAbility {
onAdminEnabled() {
console.info("onAdminEnabled");
}
onAdminDisabled() {
console.info("onAdminDisabled");
}
onBundleAdded(bundleName: string) {
console.info("EnterpriseAdminAbility onBundleAdded bundleName:" + bundleName);
}
onBundleRemoved(bundleName: string) {
console.info("EnterpriseAdminAbility onBundleRemoved bundleName" + bundleName);
}
};
在工程Module对应的module.json5配置文件中注册ServiceExtensionAbility,type标签需要设置为“enterpriseAdmin”,srcEntry标签表示当前ExtensionAbility组件所对应的代码路径。
"extensionAbilities": [ { "name": "MDMExtensionAbility", "type": "enterpriseAdmin", "exported": true, "srcEntry": "./ets/EnterpriseExtAbility/EnterpriseExtAbility.ets" } ],
在工程Module对应的module.json5配置文件中添加MDM相关权限。
"requestPermissions": [ { "name": "ohos.permission.MANAGE_ENTERPRISE_DEVICE_ADMIN", }, { "name": "ohos.permission.ENTERPRISE_SUBSCRIBE_MANAGED_EVENT" } ]
签名
修改SDK下的11\toolchains\lib\UnsgnedReleasedProfileTemplate.json
文件
···
"app-distribution-type":"enterprise_mdm",
···
依次点击 File -> Project Structure -> Project -> Signing Configs -> Automatically generate signature -> Apply -> OK,在build-profile.json5
里确认签名完成。
编译构建预置
通过以下指令
hdc file recv /system/etc/app/install_list.json D:\install_list.json
导出
install_list.json
配置文件。在
install_list.json
新增MDM应用配置:{ "app_dir" : "/system/app/com.winslei.mdmmanager", "removable" : true }
通过以下指令
hdc shell "mount -o remount,rw /" hdc file send D:\install_list.json /system/etc/app/install_list.json
将
install_list.json
替换到设备里。依次点击 Build -> Build Hap(s)/APP(s) -> Build Haps(s),待编译完成后可看到构建好的包
entry\build\default\outputs\default\entry-default-signed.hap
。通过以下指令
hdc shell "mount -o remount,rw /" hdc shell "rm -rf /data/*" hdc file send entry-default-signed.hap /system/app/com.winslei.mdmmanager/MDM.hap hdc shell "reboot"
将构建好的hap替换到设备里并重启,可看到桌面上已正常安装MDM应用。
FAQ
安装时报错install failed due to grant request permissions failed
Question:
Install Failed: error: failed to install bundle.
code:9568289
error: install failed due to grant request permissions failed.
Answer: 使用了https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/AccessToken/permissions-for-mdm-apps.md里的权限时必须按照签名的操作进行p7b的重签,应用安装时会检测签名里的应用类型是否为enterprise_mdm。
安装时报错install permission denied
Question:
Install Failed: error: failed to install bundle.
code:9568266
error: install permission denied.
error hilog:
E C01120/BundleMgrService: [bundle_permission_mgr.cpp(VerifyCallingPermissionForAll:295)]permission ohos.permission.INSTALL_ENTERPRISE_MDM_BUNDLE denied, callerToken : 805820136
E C01120/BundleMgrService: [bundle_install_checker.cpp(VaildEnterpriseInstallPermission:315)]enterprise normal/mdm bundle can not be installed by shell
Answer: MDM应用无法通过hdc安装,hdc没有安装MDM应用的所需要的权限,如ohos.permission.INSTALL_ENTERPRISE_MDM_BUNDLE
、ohos.permission.INSTALL_SELF_BUNDLE
等,只能通过编译构建预置来由系统安装。