AOSP系统服务与Service的区别

8
我试图更好地理解它们之间的区别,以便评估是否应该实现系统服务或服务。我从文档中找到的差异如下:
系统服务
1. 在SystemServer中启动 2. 添加到ServiceManager 3. 被认为是强制性的,并在失败时软重启设备 4. 更多权限?(不确定它能做什么服务不能做)
服务
1. 使用Intent初始化和启动
除此之外还有其他不同吗?我正在修改AOSP以包括自己的服务,任何额外提供的信息都将有助于帮助我做出决定。
5个回答

4
  1. 所有系统服务都在同一个名为system_server的进程中运行。

  2. 系统服务可以做很多事情,但服务不能。系统服务通常具有更高级别和更特定的sepolicy,正常应用程序将不具备此功能,例如(更改NFC硬件参数)。

因此,如果您想添加自己的系统服务,请注意上述事项,如果您的代码出现死锁,将影响所有系统服务。而且没有sepolicy,则您的服务可能仍无法访问某些资源。


一个系统服务可以做而服务不能做的事情与 sepolicy 有关,对吗? - Taztingo

3

Android服务

Android服务是一种系统组件,允许在不与用户交互的情况下执行较长时间的操作。

Activity一样,Service也在主线程上运行,并具有生命周期,但不同于ActivityService没有UI界面。

任何人都可以使用和创建Service或其直接子类IntentServcice在他们的应用程序中,并且它可以很好地工作。

常见用途包括:播放媒体、从互联网下载文件等。

系统服务

系统服务是SystemService类的直接衍生物。它们位于AOSP树中的com.android.server包中。

enter image description here

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/services/

系统服务也在主线程中运行,因此如果您想执行一些CPU密集型任务,则必须重复使用AOSP的HandlerThread架构。

系统服务与Android服务有何不同?

系统服务由SystemServer启动,因此它们作为系统进程运行,这使它们具有额外的权限,这是普通Android服务永远无法获得的,因此将其命名为SystemService。

例如:您不能使用Instrumentation向除自己的应用程序之外的其他应用程序注入事件,因为您将需要INJECT_EVENT权限,而普通应用程序没有被授予该权限。 SystemService可以执行此操作,因为它们具有提升的访问权限。

系统服务的简单示例:

package com.android.server.appwidget;
import android.content.Context;
import com.android.server.AppWidgetBackupBridge;
import com.android.server.FgThread;
import com.android.server.SystemService;
/**
 * SystemService that publishes an IAppWidgetService.
 */
public class AppWidgetService extends SystemService {
    private final AppWidgetServiceImpl mImpl;
    public AppWidgetService(Context context) {
        super(context);
        mImpl = new AppWidgetServiceImpl(context);
    }
    @Override
    public void onStart() {
        mImpl.onStart();
        publishBinderService(Context.APPWIDGET_SERVICE, mImpl);
        AppWidgetBackupBridge.register(mImpl);
    }
    @Override
    public void onBootPhase(int phase) {
        if (phase == PHASE_ACTIVITY_MANAGER_READY) {
            mImpl.setSafeMode(isSafeMode());
        }
    }
    @Override
    public void onStopUser(int userHandle) {
        mImpl.onUserStopped(userHandle);
    }
    @Override
    public void onSwitchUser(int userHandle) {
        mImpl.reloadWidgetsMaskedStateForGroup(userHandle);
    }
}

2
这真的取决于你想要实现什么。我通常更喜欢添加功能而不是修改Android平台,因此如果可以避免,我不建议修改system_server。
system_server进程以用户1000(也称为系统)运行,但其他进程也可以通过在AndroidManifest中指定该用户来以用户1000身份运行,因此它没有任何其他应用程序无法拥有的特殊selinux功能,假设它们使用平台密钥签名并作为系统运行。 创建系统应用程序 平台项目可以声明自己是持久性的,因此Android永远不会杀死该进程,这可能对您的情况有或没有必要。 Android持久性的用途是什么? 实际上,您可能根本不需要系统权限,只需将应用程序安装为priv-app即可。通常,您只想授予应用程序所需的最高权限。 Android上系统应用和特权应用之间的区别是什么? 因此,请允许我提出一种替代方案:一个持久的内容提供程序。
假设您的应用程序为非特权应用程序提供某种功能,则通过调用方法公开其功能的内容提供程序是一个很好的选择,因为您不需要为其构建aidl文件或将该aidl分发给应用程序,也不需要应用程序绑定到您的服务,并且您不必担心生命周期,因为持久进程永远不会死亡。
您可以在调用方法中检查权限,以确保应用程序声明自己。如果您的进程崩溃,则不会将整个system_server一起带下,当您移动到新版本的Android时,您不必再想办法破解system_server。

1

它们非常不同。它们的高级区别如下:

  • 服务(Service)是一个应用程序组件,类似于没有用户界面的Activity。您可以扩展它以在您的应用程序中创建自己的版本。

  • 系统服务(System Service)是系统服务器(System Server)的一部分。您需要修改AOSP以添加自己的系统服务:提供其API类[MySystem]Manager、其实现类[MySystem]Service、其AIDL文件I[MySystem]Service.aidl等。然后,您可以通过调用Context.getSystemService(...)来访问它。

称它们两者都是服务(Service)有点令人困惑。


0

以下是关于何时使用SystemService和Services的答案

  1. System Services运行在SystemServer进程下
  2. 如果服务与任何特殊硬件组件相关,并且API将要公开
  3. System Services具有不同的Sepolicy,并且比system_app或unknown_app限制更少。
  4. 如果上述条件对您来说是正确的,那么您可以通过对AOSP进行更改(Normal context.getSystemService(NAME)也适用于自定义服务),或者您可以创建自己的应用程序,在其中绑定到Servicemanager。请参考以下链接https://devarea.com/aosp-creating-a-system-service/#.YCV3t_nhXDf

服务

  1. 它是在主线程上运行的非UI组件。
  2. 如果需求范围只能在APP进程上下文中提供,则这是进行更改的最佳位置。为什么要为每个小任务打扰SystemServer呢? :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接