首页 > 解决方案 > 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 中的代码,并且我想在客户端提取调用的来源。

到目前为止我尝试了什么?

到目前为止,我一直在尝试提取客户端调用堆栈,因为我想要的信息应该在它的底部。

标签: javaandroidandroid-sourceandroid-binder

解决方案


推荐阅读