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

时间:2018-02-23 05:42:35

标签: android android-service root android-bluetooth

我正在开发一个通过蓝牙OPP获取命令的androd bluetooth telnet(?)服务器。我的计划是监控传入的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;
    }

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

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

(我目前正在通过使用自动重启我的服务的监视程序线程解决此问题。)

P.S。我有一个root设备,su工作正常。

1 个答案:

答案 0 :(得分:0)

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

当我拥有根设备时,可以安装XPosed Framework和模块。我可以创建一个连接到目标服务的模块,然后不返回START_STICKY可以阻止其重新启动。

但是,事实证明这是一个XY问题。最后,我改变了主意,不再杀死系统服务,而是继续使用它。

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

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