如何在root用户手机上以编程方式停止系统服务?

问题描述 投票:0回答:1

我正在开发一个androd bluetooth telnet(?)服务器,它通过蓝牙OPP获取命令。我的计划是监控传入的Opp推送,检查它是否来自某个用户,然后启动实际执行给定工作的工作服务。

所以我研究了有关接收蓝牙传入OPP的信息,我发现杀死BluetoothOppService是这个SO thread的关键点。所以我写下面的代码来接受传入的OPP推送。

private void KillOriginalService()
    {
        java.lang.Process suProcess=null;
        int pid;
        try
    {
                String[] command = {
                    "/system/bin/sh",
                    "-c",
                    "ps|grep com.android.bl"
                };
                suProcess = Runtime.getRuntime().exec(command);
                DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());
                DataInputStream osRes = new DataInputStream(suProcess.getInputStream());
                if (null != os && null != osRes)
            {
                    String line;
                    while (osRes.available() > 0)
                    {
                        line = osRes.readLine();
                        if (line.contains("1002"))
                        {
                            String[] words=line.split(" ");
                            //pid=Integer.parseInt(words[0]);
                        final String p=words[0];
                        new ExecuteAsRootBase(){
                            @Override
                            protected ArrayList<String> getCommandsToExecute()
                            {
                                // TODO: Implement this method
                                ArrayList<String> list=new ArrayList<String>();
                                list.add("system/bin/kill -9 " + p);
                                return list;
                            }
                        }.execute();
                        Log.v(TAG,"Success kill");
                        return;
                    }
                }
            }   
        }
        catch (IOException e)
        {
            Log.e(TAG, "error occured trying to kill opp service ",e);
        }
    }

以下代码获取ServerSocket。

private void getServerSocket()
    {
        boolean fail = true;
        while (fail)
        {
            try
            {
                serversocket = null; 
                Log.v(TAG, "trying to get serverSocket");
                serversocket = mBluetoothAdapter.listenUsingInsecureRfcommWithServiceRecord("OPP Listener", UUID.fromString("00001105-0000-1000-8000-00805f9b34fb"));   
                if(serversocket!=null)
                    fail = false;
            }
            catch (IOException e)
            {
                fail = true;
                Log.e(TAG, "Failed to get serversocket " , e);
            }

            if (fail)
            {
                KillOriginalService();
            }           
        }
        //return serversocket;
    }

并且此代码有效,但有时会不断忽略输入连接,直到我手动重新启动服务,导致原始服务接受连接,拒绝它(因为传入文件的mime类型为null)。此外,原始服务获得完整的唤醒锁,显着消耗我的设备的电池。即使我的接受连接,在我接受连接而不是原始服务之前,我必须失败大约2次。我读了logcat输出,发现原来的BtOppService重启后我杀了它打印OnStartCommand logcat。

我通过Administration screenoff api解决了电池消耗问题。但第一个问题没有解决。如何才能使我的服务而不是原始服务接收每个传入的连接?

(我目前正在使用看门狗线程自动重启我的服务来解决这个问题。)

附:我有一个root设备,su工作正常。

android android-service root android-bluetooth
1个回答
0
投票

我终于找到了一种以编程方式停止系统服务的方法:挂钩系统服务!

由于我有一个root设备,我可以安装XPosed Framework和模块。我可以创建一个附加到目标服务的模块,然后返回而不是START_STICKY可以防止它重新启动。

然而,事实证明这是一个XY问题。我终于将我的实现改为不杀死系统服务,而是与它一起生活。

我创建了一个文件观察器来检查系统是否收到了一个文件。收到文件后,它启动了相应的服务。

它与Auto-Accept创造协同效应,使手机接受每个蓝牙OPP文件传输请求,而无需询问用户(没有提示!)。

© www.soinside.com 2019 - 2024. All rights reserved.