我有一个系统服务KioskService。在此系统服务内部,我这样调用另一个系统服务DpcService:
public class KioskService extends IKioskService.Stub{
private Context mContext;
private IDpcService dpcService;
public KioskService(Context context) {
mContext = context;
}
@Override
public void exitKiosk() {
try{
String[] emptyArray = {""};
dpcService = IDpcService.Stub.asInterface(getBinder("dpc"));
dpcService.setLockTaskPackages(emptyArray);
}
catch(Exception e){
Log.e("TAG","Exit Kiosk Exception",e);
}
}
private IBinder getBinder(String serviceName) {
IBinder serviceBinder;
serviceBinder = ServiceManager.getService(serviceName);
if (serviceBinder == null) {
return null;
}
return serviceBinder;
}
}
但是我收到此错误:
05-06 06:40:00.088 604 604 E SELinux:avc:拒绝{查找} 服务= msi_dpc pid = 5375 uid = 1000 scontext = u:r:kiosk_app:s0 tcontext = u:object_r:dpc_service:s0 tclass = service_manager允许== 0
我想,原因是因为使用Selinux策略,我必须允许信息亭服务使用我的dpc服务。如果是这种情况,我该怎么办?
答案 0 :(得分:0)
是的,您是对的。您试图通过ServiceManager.getService方法调用查找其他Service。因此,您的系统对此搜索操作产生了访问拒绝。可以有多种解决方案。对于我的建议,您必须拥有audit2allow库。(您可以轻松地Google和下载) 但最简单的一个: 首先拉当前系统策略文件;
adb pull /sys/fs/selinux/policy SEPOLICY_FILE
然后使用该SEPOLICY文件执行此命令;
cat /logs/logfile.log | audit2allow -p SEPOLICY_FILE
它给您一些建议。日志文件指示您完整的访问拒绝消息。
我希望它对您有用。