在framework层,有时候,需要获取调用接口的包名,来针对apk做一些不同的处理逻辑。今天遇到通过PID来获取包名,结果不对,写这段代码的同事说这个他测试是正常的。
让我们来看下这段代码

    private String getCallerProcessName() {        if (null == mContext) {            return "";        }        int pid = Binder.getCallingPid();        ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE);        for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {            if (processInfo.pid == pid) {                Log.d(TAG, "processName: " + processInfo.processName);                return processInfo.processName;            }        }        return "";    }

基本上就是通过获取调用者的PID,通过遍历当前运行的app,来得到包名。而实际上,这段代码是有问题的,因为一个apk,并不一定只有一个进程,也即可能有多个PID。针对我测试的那种情况,调用的进程是app_process,所以遍历过后,并不能得到apk的包名,而我的同事的情况刚好只有一个进程,那自然就没问题了。

怎么修改呢?更准确的方法是使用UID来进行判断,我们知道,在android中,每一个进程都有且只有一个UID。

    private String getCallerProcessName() {        int uid = Binder.getCallingUid();        String callingApp = mContext.getPackageManager().getNameForUid(uid);        Log.d(TAG, "callingApp: " + callingApp);        if(callingApp != null){            return callingApp;        }        return "";    }   

更多相关文章

  1. android source code的获取及make
  2. Android获取系统播放音乐信息
  3. windows通过git获取 android 源代码
  4. android获取网络图片的用法 BitmapFactory.decodeByteArray 返回
  5. android传感器学习之获取传感器的值
  6. android 6.0 logcat机制(二)logcat从logd中获取log保存到文件中
  7. Android(安卓)自定义adapter的getView中的ViewGroup parent的宽
  8. IPC 机制(上)
  9. android根目录获取

随机推荐

  1. Unity的春天
  2. Android多媒体学习一:Android中Image的简
  3. 收紧 Android(安卓)控制权,Google 或强制
  4. Android新手入门 FAQ
  5. Android视频采集
  6. 手把手的教你成为Android高手(视频+源码+
  7. Android(安卓)UI开发(一)初识安卓
  8. c++11 + SDL2 + ffmpeg +OpenAL + java =
  9. Android高手进阶教程(四)之----Android(
  10. Android(安卓)高工面试必考题(二):Android的