【Android】获取当前进程名的四种方法及效率对比

四种获取方式

public static String getProcessName_1() {
    
    
        try {
    
    
            File file = new File("/proc/" + android.os.Process.myPid() + "/" + "cmdline");
            BufferedReader mBufferedReader = new BufferedReader(new FileReader(file));
            String processName = mBufferedReader.readLine().trim();
            mBufferedReader.close();
            return processName;
        } catch (Exception e) {
    
    
            e.printStackTrace();
            return null;
        }
    }

public static String getProcessName_2(Context context) {
    
    
    // 获取此进程的标识符
    int pid = android.os.Process.myPid();
    // 获取活动管理器
    ActivityManager activityManager = (ActivityManager)
            context.getSystemService(Context.ACTIVITY_SERVICE);
    // 从应用程序进程列表找到当前进程,是:返回当前进程名
    for (ActivityManager.RunningAppProcessInfo appProcess :
            activityManager.getRunningAppProcesses()) {
    
    
        if (appProcess.pid == pid) {
    
    
            return appProcess.processName;
        }
    }
    return null;
}


public static String getProcessName_3() {
    
    
    String processName = null;
    try {
    
    
        final Method declaredMethod = Class.forName("android.app.ActivityThread", false, Application.class.getClassLoader())
                .getDeclaredMethod("currentProcessName", (Class<?>[]) new Class[0]);
        declaredMethod.setAccessible(true);
        final Object invoke = declaredMethod.invoke(null, new Object[0]);
        if (invoke instanceof String) {
    
    
            processName = (String) invoke;
        }
    } catch (Throwable e) {
    
    
    }
    return processName;
}

@RequiresApi(api = Build.VERSION_CODES.P)
private String getProcessName_4() {
    
    
    return Application.getProcessName();
}

执行效率对比

对比下四种方式:
在这里插入图片描述
1和2的耗时相差不大,1的耗时图如下
在这里插入图片描述
1的耗时主要集中在字符串的拼接、FileReader的创建和File文件的读取,这3项耗时占比80%
在这里插入图片描述
方法2的耗时集中在跨进程通信,耗时占比90%

方法4是当之无愧的冠军,但是对系统版本有要求。

最优解

融合方法3和方法4:

 public String processName(){
    
    
     
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    
    
       return getProcessName_4();
     }else{
    
    
       return getProcessName_3();
     }

 }

参考:
看我一波,Android获取进程名函数,代码优化到极致的操作
android:process 的坑,你懂吗

猜你喜欢

转载自blog.csdn.net/qq_23049111/article/details/126097443
今日推荐