0

我有一个系统服务 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: denied { find } for service=msi_dpc pid=5375 uid=1000 scontext=u:r:kiosk_app:s0 tcontext=u:object_r:dpc_service:s0 tclass=service_manager许可=0

我想,原因是因为使用 Selinux 策略,我必须允许我的 kiosk 服务使用我的 dpc 服务。如果是这种情况,我该怎么做?

4

1 回答 1

0

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

adb pull /sys/fs/selinux/policy SEPOLICY_FILE

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

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

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

我希望这个对你有用。

于 2019-05-14T12:15:54.553 回答