正在检索 AIDL 消费者的 Java 包名称

Retrieving Java package name of AIDL consumer

我正在通过 AIDL 机制公开一些 API。客户端需要绑定到 AIDL 并同步调用方法。有什么方法可以检索客户端的 Java 包名称?

例如,如果我将方法 boolean isFooAvailable() 公开为 AIDL API,在 isFooAvalable 的实现中,我能否确定绑定到的应用程序的 Java 包名称AIDL 服务?

是的,您可以从实现中找到包名,如下所示:

IAidl.Stub mBinder = new IAidl.Stub() {

    @Override
    public boolean isFooAvailable() throws RemoteException {

       String pkgName = "";
        int pid = Binder.getCallingPid();

        ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> processes = am.getRunningAppProcesses();

        for (ActivityManager.RunningAppProcessInfo proc : processes) {

            if (proc.pid == pid) {

                pkgName = proc.processName;
            }
        }
       // package name of calling application package
       Log.e("Package Name", pkgName);
       return false;
    }
}

与 UID 相比,通过 PID 查找包名是最好的方法。

扩展 CommonsWare 给出的评论,在你的 Service 中你可以使用

PackageManager packageManager = context.getPackageManager();
String callingName = packageManager.getNameForUid(Binder.getCallingUid());

如果您试图限制对呼叫者的访问,您还应该检查呼叫应用程序的证书。

PackageInfo callingPackageInfo = packageManager
  .getPackageInfo(callingPackage, PackageManager.GET_SIGNATURES);
// Make sure to check there is only one signature, or you may run into a security
// vulnerability: https://androidvulnerabilities.org/vulnerabilities/Fake_ID
verify(callingPackageInfo.signatures);