当前位置:   article > 正文

车载:Framework添加服务接口_android framework 新增service入口

android framework 新增service入口

注意:源码用的是android10 源码
添加系统服务接口分为两个过程:在framework添加服务及接口,在本地app端添加调用接口
一、framework添加服务及接口
步骤1:添加系统包
在/buildsystem/android/frameworks/base/core/java/android路径下添加文件夹(我自己创建的为lilitest/addapi,包名为android.lilitest.addapi)
在这里插入图片描述
步骤2:新建aidl文件
在/buildsystem/android/frameworks/base/core/java/android/lilitest/addapi文件下新建aidl文件(如:IAddApiTest.aidl)
在这里插入图片描述
注意:包名为“android.lilitest.addapi”

// IAddApiTest.aidl
package android.lilitest.addapi;

// Declare any non-default types here with import statements

interface IAddApiTest {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void setName(String name);
    String getName();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

步骤3:编写系统级服务
在/buildsystem/android/frameworks/base/core/java/android/lilitest/addapi文件下新建service.java文件(如:AddApiTestService.java)
在这里插入图片描述
注意:包名为“android.lilitest.addapi”

package android.lilitest.addapi;



import android.os.RemoteException;

import android.util.Log;



/**

 * @ClassName AddApiTestService

 * @Description //TODO

 * @Author lili

 * @DATE 2022/10/21 15:04

 */

public class AddApiTestService extends IAddApiTest.Stub{

    private String name;

    @Override

    public void setName(String name) throws RemoteException {

        Log.d("AddApiTestService","setName = " + name);

        this.name = name;

    }



    @Override

    public String getName() throws RemoteException {

        return name;

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

步骤4:定义java接口
在注册之前我们先在buildsystem/android/frameworks/base/core/java/android/content/Context.java中添加一个常量

/**
     * liliadd:add API test
     */
    public static final String ADD_API_TEST_SERVICE = "add_api_test";
  • 1
  • 2
  • 3
  • 4

添加常量的目的:就是给服务起一个名字,好比我们再应用层使用服务的时候注册的名字一样,以后使用这个服务的时候都用这个名字就可以了。
在这里插入图片描述
在/buildsystem/android/frameworks/base/core/java/android/lilitest/addapi文件下新建manager.java文件(如:AddApiTestManager.java)将新加的服务及接口暴露到客户端。
在这里插入图片描述
注意:包名为“android.lilitest.addapi”

package android.lilitest.addapi;



import android.content.Context;

import android.os.Build;

import android.os.RemoteException;

import android.os.ServiceManager;





import java.io.PrintStream;



/**

 * @ClassName AddApiTestManager

 * @Description //TODO

 * @Author lili

 * @DATE 2022/10/21 15:54

 */

public class AddApiTestManager {

   private IAddApiTest mService;

   private static AddApiTestManager mInstance;

   private Context mContext;



   public AddApiTestManager() {

       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
           //Context.ADD_API_TEST_SERVICE: add the service name

           mService = IAddApiTest.Stub.asInterface(ServiceManager.getService(Context.ADD_API_TEST_SERVICE));

       }

   }



   public static AddApiTestManager getInstance() {

       if (mInstance == null) {

           synchronized (AddApiTestManager.class) {

               if (mInstance == null) {

                   mInstance = new AddApiTestManager();

               }

           }

       }

       return mInstance;

   }



    public void setName(String name) {

       try {

           mService.setName(name);

       }catch (RemoteException e) {

           e.printStackTrace();

       }

    }



    public String getName() {

       try {

           return mService.getName();

       }catch (RemoteException e) {

           e.printStackTrace();

           return "";

       }

    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110

步骤5:配置aidl
在/buildsystem/android/frameworks/base/Android.bp添加新增的adil文件

"core/java/android/lilitest/addapi/IAddApiTest.aidl",
```![在这里插入图片描述](https://img-blog.csdnimg.cn/1ceebb524f0e43e591091895428fa888.png)
添加好之后,使用make update-api命令,查看buildsystem/android/frameworks/base/api/current.txt文件,新增aidl接口说明,证明aidl配置成功。

```csharp
package android.lilitest.addapi {

  public class AddApiTestManager {
    ctor public AddApiTestManager();
    method public static android.lilitest.addapi.AddApiTestManager getInstance();
    method public String getName();
    method public void setName(String);
  }

  public class AddApiTestService extends android.lilitest.addapi.IAddApiTest.Stub {
    ctor public AddApiTestService();
    method public String getName() throws android.os.RemoteException;
    method public void setName(String) throws android.os.RemoteException;
  }

  public interface IAddApiTest extends android.os.IInterface {
    method public String getName() throws android.os.RemoteException;
    method public void setName(String) throws android.os.RemoteException;
  }

  public static class IAddApiTest.Default implements android.lilitest.addapi.IAddApiTest {
    ctor public IAddApiTest.Default();
    method public android.os.IBinder asBinder();
    method public String getName() throws android.os.RemoteException;
    method public void setName(String) throws android.os.RemoteException;
  }

  public abstract static class IAddApiTest.Stub extends android.os.Binder implements android.lilitest.addapi.IAddApiTest {
    ctor public IAddApiTest.Stub();
    method public android.os.IBinder asBinder();
    method public static android.lilitest.addapi.IAddApiTest asInterface(android.os.IBinder);
    method public static android.lilitest.addapi.IAddApiTest getDefaultImpl();
    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
    method public static boolean setDefaultImpl(android.lilitest.addapi.IAddApiTest);
  }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

步骤6:注册服务
在buildsystem/android/frameworks/base/core/java/android/app/SystemServiceRegistry.java文件中添加如下注册代码:

import android.lilitest.addapi.AddApiTestManager;

//liliadd:221024_10_03 start
        registerService(Context.ADD_API_TEST_SERVICE, AddApiTestManager.class,
                new StaticServiceFetcher<AddApiTestManager>() {
            @Override
            public AddApiTestManager createService() throws ServiceNotFoundException {
                return AddApiTestManager.getInstance();
            }});
        //liliadd:221024_10_03 end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

步骤7:将新增服务添加到SystemServer
在buildsystem/android/frameworks/base/services/java/com/android/server/SystemServer.java文件startOtherServices方法中添加新增服务

import android.lilitest.addapi.AddApiTestService;
import android.util.Log;

//lilitest:add 221024_1045 start
             Log.d("lilitest","start lilitest add_api_test service ");
             traceBeginAndSlog("start lilitest add_api_test service");//log日志
                try {
                    Slog.i(TAG, "add lilitest add_api_test Service");//log日志
                    Log.d("lilitest","add lilitest add_api_test Service ");
                    // Serial port support
                    AddApiTestService addApiService = new AddApiTestService();//创建service
                    ServiceManager.addService(Context.ADD_API_TEST_SERVICE, addApiService);//添加Service
                } catch (Throwable e) {
                    Slog.e(TAG, "add lilitest add_api_test Service SerialService", e);
                    Log.d("lilitest","add lilitest add_api_test Service SerialService");
                }
                Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
            //lilitest:add 221024_1045 end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

在这里插入图片描述
步骤8:权限策略配置
路径:buildsystem/android/system/sepolicy/private/service_contexts;
buildsystem/android/system/sepolicy/prebuilts/api/29.0/private/service_contexts中添加

addapitest                                u:object_r:addapitest_service:s0
  • 1

在这里插入图片描述
路径:buildsystem/android/system/sepolicy/private/service.te;
buildsystem/android/system/sepolicy/prebuilts/api/29.0/private/service.te中添加

type addapitest_service,            system_api_service, system_server_service, service_manager_type;
  • 1

在这里插入图片描述
步骤9:整体编译系统烧录到设备

二、编写应用层调用代码

//AddApiTestManager.java 注意:应用端该文件包名必须与framework服务端AddApiTestManager.java包名相同
package android.lilitest.addapi;

/**
 * @ClassName AddApiTestManager
 * @Description //TODO
 * @Author lili
 * @DATE 2022/10/25 8:42
 */
public class AddApiTestManager {
    private static String TAG = "AddApiTestManager";
    private static AddApiTestManager mInstance = null;
    public static synchronized AddApiTestManager getInstance() {
        throw new RuntimeException("API not supported!");
    }

    public void setName(String name) {
        throw new RuntimeException("API not supported!");
    }

    public String getName() {
        throw new RuntimeException("API not supported!");
    }
}

//MainActivity.java调用
package android.lilitest.addapi;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.annotation.Nullable;

import com.htkj.addapi.R;

/**
 * @ClassName MainActivity
 * @Description //TODO
 * @Author lili
 * @DATE 2022/10/25 8:50
 */
public class MainActivity extends Activity implements View.OnClickListener {
    private Button mBtSetName;
    private Button mBtGetName;
    private AddApiTestManager mAddApiTestManager;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAddApiTestManager = AddApiTestManager.getInstance();

        mBtSetName = findViewById(R.id.bt_setname);
        mBtSetName.setOnClickListener(this);

        mBtGetName = findViewById(R.id.bt_getname);
        mBtGetName.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.bt_setname:
                mAddApiTestManager.setName("addApiTest11111111");
                break;
            case R.id.bt_getname:
                String name = mAddApiTestManager.getName();
                Log.d("mAddApiTestManager","name = " + name);
                break;
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

app签名,adb install 到设备运行结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/273002
推荐阅读
相关标签
  

闽ICP备14008679号