查看原文
其他

安卓10源码学习开发定制(24)framework层自定义系统服务开发(1)Android Studio创建自定义系统服务

QDroid88888 卓码星球 2022-05-08



前言


    本文将实现读取"/sys/class/net/wlan0/address"文件的方式获取wifi mac为例实现在安卓10源码中添加framework层自定义系统服务。
    安卓10中由于普通App直读取取"/sys/class/net/wlan0/address"
文件获取wifi mac失败。然而添加系统服务读取可以读取成功,主要是由于安卓10的安全机制中限制了普通app不能读取"/sys/class/net/wlan0/address"文件获取wifi mac
    本文将参考LocationManagerService的实现方式,仿照写一个GetWifiMacService来实现获取wifi mac。
   后续将以三篇文章完整实战操作讲述framework层添加自定义系统服务的过程。

Android Studio开发自定义系统服务

    本文使用的Android Studio版本4.1.1。
1.创建GetWifiMacService工程
   图1选择创建工程:


  图2选择工程模板:

图3配置工程信息:


图4创建工程成功:


2.创建IGetWifiMacInterface.aidl文件

    依次按照如下操作:

图1:


图2:

图3:


图3:


2.创建GetWifiMacServiceManager

     

按照如下图所示的地方创建对应的GetWifiMacServiceManager文件:

 

GetWifiMacServiceManager完整实现代码如下:

package android.wifiex;
import android.content.Context;import android.os.RemoteException;
public class GetWifiMacServiceManager { private final IGetWifiMacInterface mService; private Context mContext;
GetWifiMacServiceManager(Context context,IGetWifiMacInterface service){ mContext = context; mService = service; } public String getWifiMac(){ try{ return mService.getWifiMac(); }catch (RemoteException ex){
} return null; }}

    


3.创建GetWifiMacService

    在安卓系统中各种java层系统服务文件主要放在源码路径"/frameworks/base/services/core/java/com/android/server/"下面,为了后面直接将创建的服务拷贝过去,在Android Studio创建的GetWifiMacService服务的源文件包名以"com.android.server"为前缀。按照以下依次创建GetWifiMacService服务的源代码文件。

 图1:

  最好提前rebuild一下工程,使aidl文件生成对应的java文件。

GetMacService完整实现代码如下:

package com.android.server.wifiex;import android.os.Binder;import android.os.RemoteException;import android.util.Log;import android.wifiex.IGetWifiMacInterface;

import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;
public class GetWifiMacService extends IGetWifiMacInterface.Stub{ private static final String TAG=GetWifiMacService.class.getSimpleName(); @Override public String getWifiMac() throws RemoteException { Log.d(TAG,"getWifiMac call for pid:"+ Binder.getCallingPid()+" uid:"+Binder.getCallingUid()); return getWifiMacFromFile(); }
   //获取wifi mac private String getWifiMacFromFile(){ String mypath="/sys/class/net/wlan0/address"; String line = ""; try { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(mypath))));
line = bufferedReader.readLine(); if(line==null) { line=""; } bufferedReader.close(); }catch (Exception eeee) {
} return line; }}

 

总结

  •   创建aidl文件的时候先创建好包名,然后再指定包名下面右键菜单去新建aidl文件。Android Studio会自动生成aidl目录以及对应包名的aidl文件。

  • 创建系统服务源文件之前最好rebuild一下工程,使Android Studio自动生成aidl文件对应的java文件。不然创建的系统服务类继承的时候找不到如IGetWifMacInterface.Stub的类。




 点击屏末 | 阅读原文 | 获取更多文章列表信息



扫描下方二维码关注公众号



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存