package cm.android.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.annotation.TargetApi; import android.app.ActivityManager; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.ActivityManager.RunningServiceInfo; import android.app.ActivityManager.RunningTaskInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ResolveInfo; import android.os.Debug; import android.os.Environment; import android.os.StatFs; import android.text.TextUtils; import android.text.format.Formatter; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import cm.java.util.IoUtil; import cm.java.util.ReflectUtil; import cm.java.util.Utils; /** * 系统环境Util类 */ public class SystemUtil { private static final Logger logger = LoggerFactory.getLogger(SystemUtil.class); /** * 判断进程是否正在运行 * * @param name 运行的进程名 */ @TargetApi(3) public static boolean isProcessRunning(Context ctx, String name) { ActivityManager am = (ActivityManager) ctx .getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> apps = am.getRunningAppProcesses(); for (RunningAppProcessInfo app : apps) { if (app.processName.equals(name)) { return true; } } return false; } public static boolean isMainProcess(Context context) { String processName = SystemUtil.getCurProcessName(context); if (context.getApplicationInfo().processName.equals(processName)) { return true; } return false; } @TargetApi(3) public static boolean isTopActivity(Context ctx) { ActivityManager am = (ActivityManager) ctx.getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> list = am .getRunningAppProcesses(); if (Utils.isEmpty(list)) { return false; } for (ActivityManager.RunningAppProcessInfo process : list) { if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && process.processName.equals(ctx.getPackageName())) { return true; } } return false; } /** * 判断Service是否正在运行 * * @param serviceName service名 * @param processName 该service所在进程名 */ public static boolean isServiceRunning(Context ctx, String serviceName, String processName) { ActivityManager manager = (ActivityManager) ctx .getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager .getRunningServices(Integer.MAX_VALUE)) { if (serviceName.equals(service.service.getClassName()) && processName.equals(service.process)) { return true; } } return false; } /** * 获取栈顶activity */ public static String getTopActivityPackageName(Context context) { RunningTaskInfo taskInfo = getFirstRunningTaskInfo(context); if (taskInfo == null) { return ""; } String packageName = taskInfo.topActivity.getPackageName(); return packageName; } /** * 获取正在运行的进程列表 */ @TargetApi(3) public static List<RunningAppProcessInfo> getRunningProcess(Context ctx) { ActivityManager am = (ActivityManager) ctx .getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> apps = am.getRunningAppProcesses(); return apps; } /** * 获取应用下所有Activity */ @TargetApi(4) public static ArrayList<String> getActivities(Context ctx) { ArrayList<String> result = new ArrayList<String>(); Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.setPackage(ctx.getPackageName()); for (ResolveInfo info : ctx.getPackageManager().queryIntentActivities( intent, 0)) { result.add(info.activityInfo.name); } return result; } @TargetApi(5) public static Debug.MemoryInfo getRunningProcessMemoryInfo(Context context, String packageName) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> list2 = am.getRunningAppProcesses(); for (RunningAppProcessInfo ti : list2) { // if (ti.processName.equals("system") // || ti.processName.equals("com.android.phone")) { // continue; // } if (ti.processName.equals(packageName)) { int[] pids = new int[]{ti.pid}; Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(pids); return memoryInfos[0]; } } return null; } /** * 根据processName获得RunningAppProcessInfo */ @TargetApi(3) public static RunningAppProcessInfo getRunningAppProcessInfo( Context context, String processName) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> list2 = am.getRunningAppProcesses(); for (RunningAppProcessInfo ti : list2) { if (ti.processName.equals(processName)) { return ti; } } return null; } public static boolean isRunningInEmulator() { Process process = null; DataOutputStream os = null; BufferedReader in = null; try { process = Runtime.getRuntime().exec("getprop ro.kernel.qemu"); os = new DataOutputStream(process.getOutputStream()); in = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); os.writeBytes("exit\n"); os.flush(); process.waitFor(); // getprop ro.kernel.qemu == 1 在模拟器 // getprop ro.product.model == "sdk" 在模拟器 // getprop ro.build.tags == "test-keys" 在模拟器 int value = Integer.parseInt(in.readLine()); boolean qemuKernel = (value != 0); return qemuKernel; } catch (Exception e) { logger.error(e.getMessage(), e); return true; } finally { cm.java.util.IoUtil.closeQuietly(os); cm.java.util.IoUtil.closeQuietly(in); if (process != null) { process.destroy(); } } } /** * 判断手机是否root,不弹出root请求框<br/> */ public static boolean isRoot() { String binPath = "/system/bin/su"; String xBinPath = "/system/xbin/su"; if (new File(binPath).exists() && isExecutable(binPath)) { return true; } if (new File(xBinPath).exists() && isExecutable(xBinPath)) { return true; } return false; } private static boolean isExecutable(String filePath) { Process p = null; BufferedReader in = null; try { p = Runtime.getRuntime().exec("ls -l " + filePath); // 获取返回内容 in = new BufferedReader(new InputStreamReader(p.getInputStream(), Charset.defaultCharset())); String str = in.readLine(); logger.info("str = " + str); if (str != null && str.length() >= 4) { char flag = str.charAt(3); if (flag == 's' || flag == 'x') { return true; } } } catch (IOException e) { logger.error(e.getMessage(), e); } finally { IoUtil.closeQuietly(in); if (p != null) { p.destroy(); } } return false; } public static boolean isAppForeground(Context paramContext, String paramString) { if (TextUtils.isEmpty(paramString)) { return false; } String topPackageName = getTopPackageNameCompat(paramContext); if (Utils.isEmpty(topPackageName)) { return false; } return TextUtils.equals(topPackageName, paramString); } public static ActivityManager.RunningTaskInfo getFirstRunningTaskInfo(Context paramContext) { List localList = ((ActivityManager) paramContext.getSystemService(Context.ACTIVITY_SERVICE)) .getRunningTasks(1); if ((Utils.isEmpty(localList))) { return null; } return (ActivityManager.RunningTaskInfo) localList.get(0); } public static String getTopActivityName(Context context) { List<ActivityManager.RunningTaskInfo> taskInfos; // 判断程序是否处于桌面 ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); taskInfos = am.getRunningTasks(1); String activityName = taskInfos.get(0).topActivity.getClassName(); return activityName; } private static String getCurProcessName2(Context context) { int pid = android.os.Process.myPid(); ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : am.getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess.processName; } } return ""; } // public static String getCurProcessName() { //// String[] cmd = new String[]{ //// "cat", "/proc/" + android.os.Process.myPid() + "/cmdline" //// }; //// String processName = CmdExecute.exec(cmd); // String processName = Shell.exec("cat /proc/" + android.os.Process.myPid() + "/cmdline"); // if (Utils.isEmpty(processName)) { // return ""; // } // return processName.trim(); // } public static String getCurProcessName(Context context) { String processName = getCurProcessName(); if (Utils.isEmpty(processName)) { processName = getCurProcessName2(context); } return processName; } public static String getCurProcessName() { byte[] data = IoUtil.readFile(new File("/proc/self/cmdline")); if (data == null) { return ""; } String processName = new String(data); if (Utils.isEmpty(processName)) { return ""; } return processName.trim(); } public static String getTopPackageNameCompat(Context context) { if (context == null) { return null; } if (!EnvironmentUtil.SdkUtil.hasLollipop()) { String pkgName = getTopActivityPackageName(context); return pkgName; } int START_TASK_TO_FRONT = 2; ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appList = am.getRunningAppProcesses(); if (appList == null || appList.isEmpty()) { return null; } for (RunningAppProcessInfo app : appList) { if (app.importance != RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { continue; } Integer state = null; try { state = ReflectUtil.getFieldValue(app, "processState"); } catch (Exception e) { return null; } if (state == null || state != START_TASK_TO_FRONT) { continue; } String[] pkgList = app.pkgList; if (pkgList != null && pkgList.length > 0) { return pkgList[0]; } } return null; } @TargetApi(18) public static String getRomAvailableSize(Context context) { StatFs statFs = new StatFs(Environment.getDataDirectory().getPath()); if (EnvironmentUtil.SdkUtil.hasJellyBeanMr2()) { return Formatter.formatFileSize(context, statFs.getBlockSizeLong() * statFs.getAvailableBlocksLong()); } return Formatter.formatFileSize(context, statFs.getBlockSize() * statFs.getAvailableBlocks()); } @TargetApi(18) public static String getRomTotalSize(Context context) { StatFs statFs = new StatFs(Environment.getDataDirectory().getPath()); if (EnvironmentUtil.SdkUtil.hasJellyBeanMr2()) { return Formatter.formatFileSize(context, statFs.getBlockSizeLong() * statFs.getBlockCountLong()); } return Formatter.formatFileSize(context, statFs.getBlockSize() * statFs.getBlockCount()); } }