调用"privileged"方法的自定义 AOSP 系统服务



我想创建一个自定义的AOSP映像(基于Android 11),其中包括修改,修改核心操作系统功能的行为(想想家长控制)。

由于我是AOSP新手,作为概念证明,我创建了一个自定义系统服务(与其他AOSP系统服务一起在framework/base/services/core/java/com/android/server/*中编译)。它通过SystemServiceRegistry在startBootstrapServices中启动。无论如何,该服务公开了一个方法,该方法将尝试锁定屏幕(特权操作)。代码示例如下:

public class PocService extends IPocServiceManagerAidlInterface.Stub {
private final static String LOG_TAG = "PocService";
private final Context mContext;
PocService(Context context) {
mContext = context;
}
@Override
public void lock() throws RemoteException {
Slog.i(LOG_TAG,"PocService UID: " + android.os.Process.myUid());
DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(DevicePolicyManager.class);
dpm.lockNow();
}
}

我的用户应用程序获得系统服务并像这样调用方法:

...
PocServiceManager pocServiceManager = (PocServiceManager)getSystemService(Context.POC_SERVICE);
pocServiceManager.lock();
...

这会导致以下相关部分出现异常:

...
Caused by: java.lang.SecurityException: No active admin owned by uid 10136 for policy #3
...
...
Caused by: android.os.RemoteException: Remote stack trace:
...
at com.android.server.devicepolicy.DevicePolicyManagerService.getActiveAdminOrCheckPermissionForCallerLocked(DevicePolicyManagerService.java:3326)
at com.android.server.devicepolicy.DevicePolicyManagerService.lockNow(DevicePolicyManagerService.java:6053)
...

POC系统服务的UID为1000(日志打印),用户app为10136。

是否有一种方法可以在我的自定义aosp系统服务中调用特权操作,从而我可以向我的用户应用程序公开API以能够使用?

你应该在调用"privileged"之前调用Binder.clearCallingIdentity()方法,并在此之后恢复它。这解释了为什么应该清除调用标识

@Override
public void lock() throws RemoteException {
Slog.i(LOG_TAG,"PocService UID: " + android.os.Process.myUid());
final long origId = Binder.clearCallingIdentity();
DevicePolicyManager dpm = (DevicePolicyManager) mContext.getSystemService(DevicePolicyManager.class);
dpm.lockNow();
Binder.restoreCallingIdentity(origId);
}

最新更新