(四)为Android系统的Application Frameworks层增加硬件访问服务

请根据学习目录进行学习:android平台硬件驱动原理学习(总)

一、在Android系统中,硬件服务一般是运行在一个独立的进程中为各种应用程序提供服务。因此,调用这些硬件服务的应用程序与这些硬件服务之间的通信需要通过代理来进行。为此,我们要先定义好通信接口。进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件:

      USER-NAME@MACHINE-NAME:~/Android$ cd frameworks/base/core/java/android/os

      USER-NAME@MACHINE-NAME:~/Android/frameworks/base/core/java/android/os$ vi IHelloService.aidl

      IHelloService.aidl定义了IHelloService接口:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package android.os;  
  2.    
  3. interface IHelloService {  
  4.     void setVal(int val);  
  5.     int getVal();  
  6. }  

IHelloService接口主要提供了设备和获取硬件寄存器val的值的功能,分别通过setVal和getVal两个函数来实现。

二、返回到frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加IHelloService.aidl源文件:

## READ ME: ########################################################

   ##

   ## When updating this list of aidl files, consider if that aidl is

   ## part of the SDK API. If it is, also add it to the list below that

   ## is preprocessed and distributed with the SDK. This list should

   ## not contain any aidl files for parcelables, but the one below should

   ## if you intend for 3rd parties to be able to send those objects

   ## across process boundaries.

   ##

   ## READ ME: ########################################################

   LOCAL_SRC_FILES += /

   ....................................................................

   core/java/android/os/IVibratorService.aidl /

   core/java/android/os/IHelloService.aidl /

   core/java/android/service/urlrenderer/IUrlRendererService.aidl /

   .....................................................................

三、编译IHelloService.aidl接口:
     USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base

   这样,就会根据IHelloService.aidl生成相应的IHelloService.Stub接口。

四、进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.android.server;  
  2. import android.content.Context;  
  3. import android.os.IHelloService;  
  4. import android.util.Slog;  
  5. public class HelloService extends IHelloService.Stub {  
  6.     private static final String TAG = "HelloService";  
  7.     HelloService() {  
  8.         init_native();  
  9.     }  
  10.     public void setVal(int val) {  
  11.         setVal_native(val);  
  12.     }     
  13.     public int getVal() {  
  14.         return getVal_native();  
  15.     }  
  16.       
  17.     private static native boolean init_native();  
  18.         private static native void setVal_native(int val);  
  19.     private static native int getVal_native();  
  20. };  

   HelloService主要是通过调用JNI方法init_native、setVal_native和getVal_native(见(二)在Android硬件抽象层增加接口模块访问硬件驱动程序)来提供硬件服务。

五、修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码:

     @Override

     public void run() {

     ....................................................................................

            try {

                  Slog.i(TAG, "DiskStats Service");

                  ServiceManager.addService("diskstats", new DiskStatsService(context));

            } catch (Throwable e) {

                  Slog.e(TAG, "Failure starting DiskStats Service", e);

            }

            try {

                  Slog.i(TAG, "Hello Service");

                  ServiceManager.addService("hello", new HelloService());

            } catch (Throwable e) {

                  Slog.e(TAG, "Failure starting Hello Service", e);

            }

     ......................................................................................

     }      

六、编译HelloService和重新打包system.img:

     USER-NAME@MACHINE-NAME:~/Android$ mmm frameworks/base/services/java

     USER-NAME@MACHINE-NAME:~/Android$ make snod

     这样,重新打包后的system.img系统镜像文件就在Application Frameworks层中包含了我们自定义的硬件服务HelloService了,并且会在系统启动的时候,自动加载HelloService。这时,应用程序就可以通过Java接口来访问Hello硬件服务了。我们将在下一篇文章中描述如何编写一个Java应用程序来调用这个HelloService接口来访问硬件


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Android中,可以使用以下步骤在框架中增加一个带有自定义权限的服务: 1. 定义权限:定义一个新的权限,可以在AndroidManifest.xml文件中添加一个新的权限声明,例如: ``` <permission android:name="com.example.myapp.MY_PERMISSION" android:label="@string/my_permission" android:description="@string/my_permission_description" android:protectionLevel="dangerous" /> ``` 这里声明了一个名为 "com.example.myapp.MY_PERMISSION" 的自定义权限,并设置了其标签、描述和保护级别。 2. 定义服务:定义一个新的服务并将其添加到AndroidManifest.xml文件中,例如: ``` <service android:name=".MyService" android:permission="com.example.myapp.MY_PERMISSION" /> ``` 这里定义了一个名为 "MyService" 的服务,并将其权限设置为 "com.example.myapp.MY_PERMISSION"。 3. 实现服务:创建一个新的服务类并在其中实现服务的逻辑,例如: ``` public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在此处添加服务逻辑 return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { // 如果服务需要绑定,则返回一个 IBinder 实例 return null; } } ``` 在这个示例中,我们创建了一个名为 "MyService" 的服务,并在其中实现了 onStartCommand() 方法。可以在这个方法中添加服务的逻辑。 4. 请求权限:在应用程序中请求自定义权限,例如: ``` if (ContextCompat.checkSelfPermission(this, "com.example.myapp.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{"com.example.myapp.MY_PERMISSION"}, REQUEST_CODE); } ``` 这里使用了 ContextCompat.checkSelfPermission() 方法检查应用程序是否具有 "com.example.myapp.MY_PERMISSION" 权限。如果没有该权限,则使用 ActivityCompat.requestPermissions() 方法请求该权限。 以上就是在Android框架中增加一个带有自定义权限的服务的步骤和示例。需要注意的是,在添加自定义权限时需要遵循一定的命名规范,并且在请求权限时需要向用户解释权限的目的。 ### 回答2: 在Android frameworks增加一个带有自定义权限的服务,可以按照以下步骤进行: 1. 创建权限: - 在AndroidManifest.xml文件中添加自定义权限标签,例如: <permission android:name="com.example.custompermission.MY_PERMISSION" android:protectionLevel="dangerous" /> - 在权限标签中设置权限的名称和保护级别。 2. 创建服务: - 创建一个继承自android.app.Service类的自定义服务,例如: public class CustomService extends Service { ... } - 在服务类中实现自定义的功能逻辑。 3. 添加权限到服务: - 在服务类的onCreate()方法中检查是否授权,例如: @Override public void onCreate() { super.onCreate(); if (checkCallingOrSelfPermission("com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Permission denied"); } ... } - 在服务类中的其他方法中使用权限来控制访问限制,例如: public void performCustomAction() { if (checkCallingOrSelfPermission("com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { throw new SecurityException("Permission denied"); } ... } 4. 注册服务: - 在AndroidManifest.xml文件中注册自定义服务,例如: <service android:name=".CustomService" android:permission="com.example.custompermission.MY_PERMISSION" /> 5. 请求权限: - 在应用程序的代码中请求自定义权限,例如: if (ContextCompat.checkSelfPermission(this, "com.example.custompermission.MY_PERMISSION") != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[] {"com.example.custompermission.MY_PERMISSION"}, REQUEST_CODE); } - 当权限请求被用户确认或拒绝后,可以在Activity的onRequestPermissionsResult()方法中处理权限请求结果。 以上就是在Android frameworks中添加一个带有自定义权限的服务的步骤和示例。通过创建权限、服务和对权限的控制,可以有效地管理和限制应用程序的功能和资源的访问。 ### 回答3: 要在Android frameworks增加一个带有自定义权限的服务,可以按照以下步骤进行操作: 1. 在Android源码目录中找到frameworks/base/目录。在该目录下,创建一个新的文件夹,用于存放自定义服务的源代码和相关文件。 2. 在新创建的文件夹中,创建一个Java类作为自定义服务的实现。该类需要继承自android.app.Service类,并实现相关的方法。 3. 修改AndroidManifest.xml文件,在其中注册自定义服务。在<application>标签内添加以下代码: ```xml <service android:name=".CustomService" android:permission="com.example.custom_permission" /> ``` 其中,“CustomService”是自定义服务的类名,“com.example.custom_permission”是自定义权限的名称。 4. 在系统的权限文件中添加自定义权限。在frameworks/base/core/res/目录下的AndroidManifest.xml文件中的<permission>标签内添加以下代码: ```xml <permission android:name="com.example.custom_permission" android:protectionLevel="normal" /> ``` 其中,“com.example.custom_permission”是自定义权限的名称,“normal”是权限的保护级别。可以根据实际需要修改保护级别。 5. 在自定义服务的代码中,可以通过使用Context的checkPermission()方法来检查调用者是否拥有自定义权限。例如: ```java if (checkPermission("com.example.custom_permission", Binder.getCallingPid(), Binder.getCallingUid()) == PackageManager.PERMISSION_GRANTED) { // 执行服务的逻辑 } else { // 没有权限,抛出SecurityException throw new SecurityException("Permission denied"); } ``` 通过以上步骤,就可以在Android frameworks增加一个带有自定义权限的服务了。在使用该服务的应用程序中,需要在AndroidManifest.xml文件中声明使用自定义权限,并在运行时进行权限检查,以确保调用者具有相应的权限。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值