处理系统服务的传统方式是拥有一个 Manager 和一个 ManagerService。这样做的原因是 Manager 封装了您希望用户可用的所有功能。PackageManager 和 ActivityManager 是很好的例子,但范围很大。对于一个较小的例子,我会看看DevicePolicyManager和DevicePolicyManagerService
您可以看到 Manager 并没有真正做任何事情,除了包装丑陋的 try catch 语句并使事情看起来更好一点。它还很好地包装了所有暴露给开发人员的功能。这基本上就是您从 Manager 中得到的全部内容。
如果您查看 Manager 调用的任何方法(在服务中),您将看到此enforceCrossUserPermission(userhandle)方法。它自己的服务正在进行权限检查。虽然开发人员可以通过 Stub 手动获取服务的句柄,但如果它正在执行安全检查,它仍然无法使用服务提供的任何方法。
通过这种方式,服务可以很丰富并为系统提供很多功能,但您仍然可以将服务的某些部分公开给用户。只要您对不希望任何随机用户使用的方法执行安全检查,该功能就会严格地保留为系统的一部分。
总而言之,如果您打算为您的 mod 公开一个公共 SDK,那么您真的应该遵循该模式以使用户的生活更轻松。但是,如果您只想为系统提供服务,则可以按照我上面链接的方式进行一些权限检查,并将您的功能保持在系统本地。
请记住,您不执行安全检查的任何功能本质上都是向用户公开的,并且可以按照用户的意愿使用。