Selinux:如何在系统服务中获取另一个系统服务

时间:2019-05-06 07:48:34

标签: android selinux system-services

我有一个系统服务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服务。如果是这种情况,我该怎么办?

1 个答案:

答案 0 :(得分:0)

是的,您是对的。您试图通过ServiceManager.getService方法调用查找其他Service。因此,您的系统对此搜索操作产生了访问拒绝。可以有多种解决方案。对于我的建议,您必须拥有audit2allow库。(您可以轻松地Google和下载) 但最简单的一个: 首先拉当前系统策略文件;

adb pull /sys/fs/selinux/policy SEPOLICY_FILE

然后使用该SEPOLICY文件执行此命令;

cat /logs/logfile.log | audit2allow -p SEPOLICY_FILE

它给您一些建议。日志文件指示您完整的访问拒绝消息。

我希望它对您有用。