微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 手机设计讨论 > MTK手机平台交流 > 6735 L Android连接系统socket服务出现权限错误

6735 L Android连接系统socket服务出现权限错误

时间:10-02 整理:3721RD 点击:
系统socket服务在init.project.rc中的配置  :service southdaemon /system/bin/southdaemon        class core
        user root
        group system system
        socket southSDK stream 777 system system
        oneshot       
southdaemon.c部分代码:
#define  SOCKET_SOUTHSDK "southsdk"
int main (void)
{
                int lsocket, s, err, fd;
                struct sockaddr addr;
    socklen_t alen = sizeof(addr);
            printf("Reading the buffccy2 is   by  ccy3\n");       
                lsocket = android_get_control_socket(SOCKET_SOUTHSDK);
    if (lsocket < 0) {
        SOU_ERR("fail to get socket fROM environment: %s\n",strerror(errno));
        printf("Reading the buffccy2 is   by  ccy2\n");
        exit(1);
    }
    if (listen(lsocket, 10)) {
        SOU_ERR("listen on socket failed: %s\n", strerror(errno));
        exit(1);
    }
   printf("Reading the buffccy2 is  by  ccy1\n");
    while(1)
                {
                        s = accept(lsocket, &addr, &alen);
                        if (s < 0) {
         SOU_ERR("Accept failed! :%s\n", strerror(errno));
         continue;
                                }
                                fcntl(s, F_SETFD, FD_CLOEXEC);//
                               
                                if (epoll_init(s)) {
         SOU_ERR("epoll_init: %d (%s)\n", errno, strerror(errno));
         exit(1);
      }
      SOU_MSG("new connection\n");
      for (;;) {
            err = process();
            if (err == ERR_REMOTE_HANGUP) {
                SOU_ERR("remote hangup (cleanup?), wait for new connection\n");
                break;
            } else if (errno == EINTR) {
                continue;
            } else if (err) {
                SOU_ERR("process data error: %d (%s)\n", errno, strerror(errno));
            }
       }
       SOU_MSG("closing connection\n");        
       close(s);
       epoll_destroy();
                }
                SOU_MSG("exit southdaemon \n!");
       
        return 0;
}

在adb shell下 ps 可以看到系统服务 southdaemon有运行
root      233   1     10540  752   0084c478 7f17cba4 S /system/bin/southdaemon
现在Android连接服务报权限异常:
Android源码:
package com.example.gpssocket;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
        private final String    DEBUG_TAG  = "ccy";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.Layout.activity_main);
               
                LocalSocket sock = new LocalSocket();
                LocalSocketAddress sockaddr;
                sockaddr = new LocalSocketAddress("southsdk", LocalSocketAddress.Namespace.RESERVED);
                       
                byte[] send = {'1', '2', '3', '4','0'};
               
                //String str = "121323232";
                //send[1] = int2OneByte(flag);
                try {
                        sock.connect(sockaddr);                               
                        OutputStream out = sock.getOutputStream();               
                        out.write(send);
                        Thread.sleep(300);
                        out.close();
                        sock.close();               
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        Log.e(DEBUG_TAG, e.toString());
                        e.printStackTrace();
                } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }               
        }
}

有高手可以帮帮忙吗   怎么解决 谢谢!   错误提示权限问题






高手人呢

你这是在以前4.4上移植过来的对吗?
这个应该是selinux导致的权限问题,
你可以试着在adb  shell里面执行 setenforce 0
这个命令把selinux关掉,不要重启再测试。

多谢提醒 我先试下   

好的, 有问题请继续跟贴,没问题请结贴,谢谢!

现在已经确认是selinux权限的问题了 ,请问下在selinux te权限要加哪几个文件 、怎么加 ?

问题已解决  下面是一个demo, 方便大家参考.
定义一个init 启动的service, demo_service, 对应的执行档是/system/bin/demo.
(1). 创建一个demo.te 在/device/mediatke/common/sepolicy 目录下, 然后在
/device/mediatke/common/BoardConfig.mk 的BOARD_SEPOLICY_UNION 宏中新增 demo.te (注意: M
版本后取消了BOARD_SEPOLICY_UNION 宏,不需要再修改了,添加了文件即可)
(2). 定义demo 类型,init 启动service 时类型转换, demo.te 中
type demo, domain;
type demo_exec, exec_type, file_type;
init_daemon_domain(demo)
(3). 绑定执行档 file_context 类型
/system/bin/demo ubject_r:demo_exec:s0
(4). 根据demo 需要访问的文件以及设备, 定义其它的权限在demo.te 中.
如果大家需要更加深入理解SELinux ,可以参考:
MTK Online SELinux Topic, 没有比这更加完整的文档了.

好的,解决了就好!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top