在android framework中添加自定义系统服务

  • 添加系统服务需要添加aidl,service,manager文件,需要修改SystemServer,Context,ContextImpl
  • 下面举例进行说明,主要添加一个服务,用于获取系统时间和版本号


1.在frameworks/base/core/java/android/app/下添加aidl文件

frameworks/base/core/java/android/app/ISystemStatusManager.aidl
package android.app;

interface ISystemStatusManager
{
    String[] getSystemStatus();
}


2.修改frameworks/base/Android.mk文件,将aidl加到该文件中,这样才可以被编译到,否则编译不过

将core/java/android/app/ISystemStatusManager.aidl \加到LOCAL_SRC_FILES后面


3.在frameworks/base/services/core/java/com/android/server/下添加service文件

frameworks/base/services/core/java/com/android/server/SystemStatusManagerService.java
package com.android.server;

import android.app.ISystemStatusManager;
import android.content.Context;
import android.os.Build;
import android.util.Slog;

import java.text.SimpleDateFormat;
import java.util.Date;

public class SystemStatusManagerService extends ISystemStatusManager.Stub {
    private Context mContext;

    public SystemStatusManagerService(Context context) {
        mContext = context;

        Slog.d("SystemStatus", "Date:" + getDateTime() + "\nVersion:" + getVersion());
    }

    @Override
    public String[] getSystemStatus() {
        String[] infos = new String[2];

        infos[0] = "Date:" + getDateTime();
        infos[1] = "Version:" + getVersion();

        return infos;
    }

    private String getDateTime() {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-DD-mm HH:mm:s");
        Date date = new Date(System.currentTimeMillis());

        return format.format(date);
    }

    private String getVersion() {
        return Build.DISPLAY;
    }
}


4.在frameworks/base/core/java/android/app/下添加manager

frameworks/base/core/java/android/app/SystemStatusManager.java
package android.app;

import android.content.Context;
import android.os.RemoteException;
import android.util.Slog;

public class SystemStatusManager {
    Context mContext;
    ISystemStatusManager mService;

    public SystemStatusManager(Context context, ISystemStatusManager service) {
        mContext = context;
        mService = service;
    }

    public String[] getSystemStatus() {
        if (mService != null) {
            try {
                return mService.getSystemStatus();
            } catch (RemoteException e) {
                Slog.e("SystemStatus", "RemoteException " + e);
                return null;
            }
        }

        return null;
    }
}

5.在frameworks/base/core/java/android/content/Context.java中添加service名称定义

public static final String SYSTEM_STATUS_SERVICE = "system_status_service";


6.在frameworks/base/services/java/com/android/server/SystemServer.java中添加服务

  • 在startOtherServices()方法中添加如下代码
try {
    ServiceManager.addService(Context.SYSTEM_STATUS_SERVICE, new SystemStatusManagerService(context));
} catch (Throwable e) {
    Slog.e(TAG, "Failure starting System Status Service ", e);
}


7.在frameworks/base/core/java/android/app/ContextImpl.java中注册服务

  • 在static {}中添加如下代码
registerService(SYSTEM_STATUS_SERVICE, new ServiceFetcher() {
    public Object createService(ContextImpl ctx) {
        IBinder b = ServiceManager.getService(SYSTEM_STATUS_SERVICE);
        return new SystemStatusManager(ctx, ISystemStatusManager.Stub.asInterface(b));
    }
});


8.编译framework.jar和services.jar,push到手机,重启手机

  • 重启手机后就会输出如下log:
D/SystemStatus(  910): Date:2017-01-00 00:00:13
D/SystemStatus(  910): Version:xxx


9.如果系统app需要使用该service,可以通过如下方式调用

SystemStatusManager mManager = (SystemStatusManager) getSystemService(Context.SYSTEM_STATUS_SERVICE);
try {
    String[] infos = mManager.getSystemStatus();
    Log.i("SystemStatus", "SystemStatus Date:" + infos[0] + "\nVersion:" + infos[1]);
} catch (Exception e) {
    e.printStackTrace();
}
Android Framework 添加自定义库,可以通过以下步骤实现: 1. 将自定义库的源代码添加Android Framework ,通常情况下位于 `frameworks/base/core/java` 或 `frameworks/base/services/core/java` 目录下。 2. 在 `frameworks/base/core/res` 或 `frameworks/base/services/core/res` 目录下添加自定义库的资源文件,比如布局文件、字符串资源等。 3. 在 Android.mk 文件添加自定义库的编译配置信息,包括源代码的编译和资源文件的打包。 4. 在 AndroidManifest.xml 文件注册自定义库,以便系统可以识别和加载该库。 5. 在 Java 代码使用 `import` 语句导入自定义库的类,并在代码调用该类的方法。 需要注意的是,自定义需要在 APK 进行引用才能被 APK 调用。可以通过以下步骤将自定义库引用到 APK : 1. 在 APK 的 build.gradle 文件添加依赖库的引用,例如: ``` dependencies { implementation project(':mylibrary') } ``` 其 `mylibrary` 是自定义库的名称。 2. 在 APK 的 AndroidManifest.xml 文件添加自定义库的使用权限,例如: ``` <uses-library android:name="mylibrary" android:required="true" /> ``` 其 `mylibrary` 是自定义库的名称。 完成以上步骤后,自定义库就可以被 APK 调用了。需要注意的是,自定义库只能被具有相应权限的应用调用。如果需要让所有应用都能调用该库,可以考虑将库打包成系统级别的 APK,并将其放置到 `/system/app` 目录下。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值