java - Binder - 如何从服务器获取调用者的类和方法名?
问题描述
出于研究目的,我正在修改 Android SystemServer 代码。
我想完成什么?
每当有对SystemServer(Binder服务器进程)的调用,我想知道Binder客户端进程上这个调用的来源;更具体地说 - 我的应用程序中的源(例如,文件、类、方法等)。
例如,考虑我的应用程序中的以下代码:
public class ClipboardReaderService extends Service {
private ClipboardManager mClipboardManager;
private ClipboardManager.OnPrimaryClipChangedListener mListener =
new ClipboardManager.OnPrimaryClipChangedListener() {
@Override
public void onPrimaryClipChanged() {
String clipContent = mClipboardManager.getPrimaryClip().
getItemAt(0).getText().toString();
Log.i(TAG, "Clipboard content: " + clipContent);
}
};
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mClipboardManager = (ClipboardManager)
getSystemService(CLIPBOARD_SERVICE);
mClipboardManager.addPrimaryClipChangedListener(mListener);
return START_STICKY;
}
}
使用 Binder,正在调用SystemServer中的相应函数(这是我的代码应该去的地方):
public ClipData getPrimaryClip(String pkg) {
synchronized (this) {
if (mAppOps.noteOp(AppOpsManager.OP_READ_CLIPBOARD,
Binder.getCallingUid(), pkg)
!= AppOpsManager.MODE_ALLOWED || isDeviceLocked()) {
return null;
}
// My code goes here - How can I get the caller method?
addActiveOwnerLocked(Binder.getCallingUid(), pkg);
return getClipboard().primaryClip;
}
}
正如我上面解释的,我有能力更改 SystemServer 中的代码,并且我想在客户端提取调用的来源。
到目前为止我尝试了什么?
到目前为止,我一直在尝试提取客户端调用堆栈,因为我想要的信息应该在它的底部。
- 使用打印堆栈
Thread.currentThread().getStackTrace()
- 当然这不起作用,因为我打印 SystemServer 的堆栈,所以我看不到在 clinet 端进行的调用。 - 使用 - 打印所有活动线程的堆栈跟踪
getAllStackTraces()
- 同样,我看不到客户端线程,因为它们存在于单独的 JVM 中。 - 在ClipboardManager中打印堆栈(即在
setPrimaryClip
函数中) - 它确实按预期打印了客户端调用堆栈。事实上,我可以将调用堆栈作为附加参数传递给 SystemServer,但是我必须为每个服务(例如 NotificationManager)中的每个函数执行此操作,并且我正在寻找更全面的解决方案。 - 使用 /proc/$pid/stack 获取调用者 uid
Binder.getCallingPid()
并从中读取堆栈 - 这也不起作用,因为 /proc/$pid/stack 仅显示内核堆栈。
解决方案
推荐阅读
- objective-c - Objective C 空子类实现
- imagemagick - ImageMagick 仅捕获 mp4 视频的第一帧
- jinja2 - 在气流中分裂 jinja 字符串
- java - 在 java 中添加到 org.apache.poi.xssf.usermodel.XSSFTextBox 的超链接
- angular - 具有多行选择的 Ag-Grid 多行编辑
- google-apps-script - 在 Apps 脚本中获取 Gmail URL ID
- nested - 减少javascript中的嵌套对象数组
- javascript - 值未在 NodeJS 外部定义的变量中设置
- arrays - 比较两个 ByteArrayInputStream 进行常规测试
- linux - 如何强制 automake 将共享对象复制到 /usr/local/lib?