Android增加一个System Service

本文详细介绍如何在Android系统中创建并使用AIDL (Android Interface Definition Language) 定义的服务。从创建AIDL文件到实现服务并与之交互的全过程均有涉及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 增加一个aidl文件:frameworks/base/core/java/android/os/ITestWslService.aidl

package android.os;
interface ITestWslService {
  /**
  * {@hide}
  */
  void setValue(int val);
}

2. 把aidl写到/frameworks/base/Android.mk,注意是加到 “LOCAL_SRC_FILES += \ ” 下面
如:core/java/android/os/ITestWslService.aidl \

3. 在frameworks/base/services/java/com/android/server/ 新建要增加的service,
如:


package com.android.server;

import android.content.Context;
import android.os.Handler;
import android.os.ITestWslService;
import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.util.Log;

public class TestWslService extends ITestWslService.Stub {
  private static final String TAG = "TestWslService";
  private TestWslWorkerThread mWorker;
  private TestWslWorkerHandler mHandler;
  private Context mContext;

  public TestWslService(Context context) {
    super();
    mContext = context;
    mWorker = new TestWslWorkerThread("TestWslServiceWorker");
    mWorker.start();
    Log.i(TAG, "Spawned worker thread");
  }

  public void setValue(int val)
  {
    Log.i(TAG, "setValue " + val);
    Message msg = Message.obtain();
    msg.what = TestWslWorkerHandler.MESSAGE_SET;
    msg.arg1 = val;
    mHandler.sendMessage(msg);
  }

  private class TestWslWorkerThread extends Thread{
    public TestWslWorkerThread(String name) {
      super(name);
    }

    public void run() {
      Looper.prepare();
      mHandler = new TestWslWorkerHandler();
      Looper.loop();
    }
  }

  private class TestWslWorkerHandler extends Handler {
    private static final int MESSAGE_SET = 0;

    @Override
    public void handleMessage(Message msg) {
      try {
        if (msg.what == MESSAGE_SET) {
          Log.i(TAG, "set message received: " + msg.arg1);
        }
      } catch (Exception e) {
        // Log, don't crash!
        Log.e(TAG, "Exception in TestWslWorkerHandler.handleMessage:", e);
      }
    }
  }
}

4. 将该service增加到Systemserver中,SystemService.java的目录是frameworks/base/services/java/com/android/server/SystemServer.java,增加代码如下:


ServiceManager.addService("testwsl", new TestWslService(context));

5.新建一个TestWslManager类,用于管理TestWslService,
首先在/frameworks/base/core/java/下新建一个package,命名为android.testwsl;
然后在该目录下新建一个TestWslManager类,具体代码如下:



package android.testwsl;

import android.os.ITestWslService;
import android.os.RemoteException;
import android.util.Log;

public class AnromCertManager {
        ITestWslService service;
       
        public AnromCertManager(ITestWslService service) {
                this.service = service;
        }
       
        public void setValue(int val) {
                try {
                             service.setValue(val);
                } catch (RemoteException e) {
                             Log.d("anromwsl" , "setvalue fail");
                        e.printStackTrace();
                }
        }
}

6. 在ContextImpl中注册该service,ContextImpl.java的目录是/frameworks/base/core/java/android/app/ContextImpl.java,具体代码如下:


        registerService(TESTWSL_SERVICE, new ServiceFetcher() {
                        public Object getService(ContextImpl ctx) {
                                IBinder b = ServiceManager.getService(TESTWSL_SERVICE);
                                ITestWslService service = ITestWslService.Stub.asInterface(b);
                                return new TestWslManager(service);
                        }
        });
// TESTWSL_SERVICE 为TestWslService注册在SystemServer中的别名,在Context中定义

7. 新建一个Android工程,测试TestWslService


        TestWslManager ad = null;      
        ad = (TestWslManager)getSystemService("testwsl");
        ad.setValue(7);


到这基本就OK了!


<think>好的,用户问的是Android SystemService如何检测应用安装的机制。我需要先回忆一下Android系统的相关知识。记得Android系统中有PackageManagerService(PMS),它是负责管理应用安装、卸载等操作的核心服务。当用户安装或卸载应用时,PMS应该会处理这些事件,并通知其他组件。 首先,用户安装应用通常通过PackageInstaller,这个应用会触发安装流程。安装过程中,PMS会解析APK的AndroidManifest.xml,检查权限和包信息。安装完成后,PMS会更新自己的内部状态,记录新安装的应用信息。这时候,系统可能需要广播一个应用安装完成的Intent,比如ACTION_PACKAGE_ADDED,这样其他应用或服务就能接收到这个广播,从而知道有新应用被安装了。 不过,从Android 8.0(API 26)开始,静态注册的广播接收器对某些系统事件可能不再有效,所以可能需要动态注册或者使用其他方式。另外,系统服务可能不会直接监听广播,而是通过注册回调或者观察PMS的内部状态变化。例如,PMS可能会发送通知给已注册的监听器,比如IPackageInstallObserver,这样SystemService可以直接接收到安装完成的事件。 还需要考虑安装的不同场景,比如adb安装、应用商店安装,或者静默安装。PMS在这些情况下都应该有统一的处理流程。此外,系统服务可能需要检查安装的应用是否具有某些特定权限或属性,从而执行相应的操作,比如启动服务或更新配置。 记得引用中提到的Android Q中的通知建议,虽然和安装检测无关,但说明系统服务可能会根据应用安装后的信息生成建议操作。可能涉及到Intent的处理和系统服务的协作。 总结一下,检测应用安装的主要机制应该包括:PMS处理安装事件,发送广播,其他服务监听广播或注册回调。需要详细说明PMS的角色,Intent广播的类型,以及监听方式的变化,特别是Android版本更新带来的限制。</think>Android SystemService(特别是`PackageManagerService`)通过以下机制检测应用安装: ### 1. 安装事件触发 当应用通过`PackageInstaller`或adb工具安装时,系统会触发以下流程: - APK文件被复制到`/data/app`目录 - 执行包解析和验证操作,解析$AndroidManifest.xml$ - 创建应用数据目录(`/data/user/<userid>/<package>`) ### 2. 系统服务监听机制 PackageManagerService通过以下方式通知状态变化: $$ onPackageInstalled(String packageName, int returnCode, String msg, Bundle extras) $$ $$ onPackageDeleted(String packageName, int returnCode, String msg) $$ ### 3. 广播通知机制 系统会发送标准广播: - `ACTION_PACKAGE_ADDED` - `ACTION_PACKAGE_REPLACED` - `ACTION_PACKAGE_REMOVED` 广播示例格式: ```java Intent.ACTION_PACKAGE_ADDED → "android.intent.action.PACKAGE_ADDED" ``` ### 4. 监听器注册 系统服务通过以下方式注册监听: ```java IPackageInstallObserver2 installObserver = new IPackageInstallObserver2.Stub() { @Override public void onUserActionRequired(Intent intent) {} @Override public void onPackageInstalled(String basePackageName, int returnCode, String msg, Bundle extras) { // 处理安装完成事件 } }; ``` ### 5. 版本适配注意 - Android 8.0+限制隐式广播接收,需使用显式注册[^1] - Android 11+需要声明`<queries>`元素才能检测第三方应用安装
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值