/* * Copyright (C) 2012 www.amsoft.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.yzy.supercleanmaster.utils; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.MemoryInfo; import android.app.ActivityManager.RunningAppProcessInfo; import android.app.ActivityManager.RunningServiceInfo; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.util.DisplayMetrics; import android.view.inputmethod.InputMethodManager; import com.yzy.supercleanmaster.bean.AppProcessInfo; import com.yzy.supercleanmaster.bean.ProcessInfo; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileFilter; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; // TODO: Auto-generated Javadoc /** */ public class AppUtil { public static List<String[]> mProcessList = null; public static String getVersion(Context context) { try { PackageManager manager = context.getPackageManager(); PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); String version = info.versionName; return version; } catch (Exception e) { e.printStackTrace(); return "1.0"; } } public static int getVersionCode(Context context) { try { PackageManager manager = context.getPackageManager(); PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0); int versionCode = info.versionCode; return versionCode; } catch (Exception e) { e.printStackTrace(); return 0; } } /** * 描述:打开并安装文件. * * @param context the context * @param file apk文件路径 */ public static void installApk(Context context, File file) { Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setAction(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); context.startActivity(intent); } /** * 描述:卸载程序. * * @param context the context * @param packageName 包名 */ public static void uninstallApk(Context context, String packageName) { Intent intent = new Intent(Intent.ACTION_DELETE); Uri packageURI = Uri.parse("package:" + packageName); intent.setData(packageURI); context.startActivity(intent); } /** * 用来判断服务是否运行. * * @param context the context * @param className 判断的服务名字 "com.xxx.xx..XXXService" * @return true 在运行 false 不在运行 */ public static boolean isServiceRunning(Context context, String className) { boolean isRunning = false; ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); List<RunningServiceInfo> servicesList = activityManager .getRunningServices(Integer.MAX_VALUE); Iterator<RunningServiceInfo> l = servicesList.iterator(); while (l.hasNext()) { RunningServiceInfo si = (RunningServiceInfo) l.next(); if (className.equals(si.service.getClassName())) { isRunning = true; } } return isRunning; } /** * 停止服务. * * @param context the context * @param className the class name * @return true, if successful */ public static boolean stopRunningService(Context context, String className) { Intent intent_service = null; boolean ret = false; try { intent_service = new Intent(context, Class.forName(className)); } catch (Exception e) { e.printStackTrace(); } if (intent_service != null) { ret = context.stopService(intent_service); } return ret; } /** * Gets the number of cores available in this device, across all processors. * Requires: Ability to peruse the filesystem at "/sys/devices/system/cpu" * * @return The number of cores, or 1 if failed to get result */ public static int getNumCores() { try { // Get directory containing CPU info File dir = new File("/sys/devices/system/cpu/"); // Filter to only list the devices we care about File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { // Check if filename is "cpu", followed by a single digit // number if (Pattern.matches("cpu[0-9]", pathname.getName())) { return true; } return false; } }); // Return the number of cores (virtual CPU devices) return files.length; } catch (Exception e) { e.printStackTrace(); return 1; } } /** * 描述:判断网络是否有效. * * @param context the context * @return true, if is network available */ public static boolean isNetworkAvailable(Context context) { try { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo info = connectivity.getActiveNetworkInfo(); if (info != null && info.isConnected()) { if (info.getState() == NetworkInfo.State.CONNECTED) { return true; } } } } catch (Exception e) { e.printStackTrace(); return false; } return false; } /** * Gps是否打开 需要<uses-permission * android:name="android.permission.ACCESS_FINE_LOCATION" />权限 * * @param context the context * @return true, if is gps enabled */ public static boolean isGpsEnabled(Context context) { LocationManager lm = (LocationManager) context .getSystemService(Context.LOCATION_SERVICE); return lm.isProviderEnabled(LocationManager.GPS_PROVIDER); } /** * 判断当前网络是否是移动数据网络. * * @param context the context * @return boolean */ public static boolean isMobile(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) { return true; } return false; } /** * 导入数据库. * * @param context the context * @param dbName the db name * @param rawRes the raw res * @return true, if successful */ public static boolean importDatabase(Context context, String dbName, int rawRes) { int buffer_size = 1024; InputStream is = null; FileOutputStream fos = null; boolean flag = false; try { String dbPath = "/data/data/" + context.getPackageName() + "/databases/" + dbName; File dbfile = new File(dbPath); // 判断数据库文件是否存在,若不存在则执行导入,否则直接打开数据库 if (!dbfile.exists()) { // 欲导入的数据库 if (!dbfile.getParentFile().exists()) { dbfile.getParentFile().mkdirs(); } dbfile.createNewFile(); is = context.getResources().openRawResource(rawRes); fos = new FileOutputStream(dbfile); byte[] buffer = new byte[buffer_size]; int count = 0; while ((count = is.read(buffer)) > 0) { fos.write(buffer, 0, count); } fos.flush(); } flag = true; } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (Exception e) { } } if (is != null) { try { is.close(); } catch (Exception e) { } } } return flag; } /** * 获取屏幕尺寸与密度. * * @param context the context * @return mDisplayMetrics */ public static DisplayMetrics getDisplayMetrics(Context context) { Resources mResources; if (context == null) { mResources = Resources.getSystem(); } else { mResources = context.getResources(); } // DisplayMetrics{density=1.5, width=480, height=854, scaledDensity=1.5, // xdpi=160.421, ydpi=159.497} // DisplayMetrics{density=2.0, width=720, height=1280, // scaledDensity=2.0, xdpi=160.42105, ydpi=160.15764} DisplayMetrics mDisplayMetrics = mResources.getDisplayMetrics(); return mDisplayMetrics; } /** * 打开键盘. * * @param context the context */ public static void showSoftInput(Context context) { InputMethodManager inputMethodManager = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } /** * 关闭键盘事件. * * @param context the context */ public static void closeSoftInput(Context context) { InputMethodManager inputMethodManager = (InputMethodManager) context .getSystemService(Context.INPUT_METHOD_SERVICE); if (inputMethodManager != null && ((Activity) context).getCurrentFocus() != null) { inputMethodManager.hideSoftInputFromWindow(((Activity) context) .getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); } } /** * 获取包信息. * * @param context the context */ public static PackageInfo getPackageInfo(Context context) { PackageInfo info = null; try { String packageName = context.getPackageName(); info = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_ACTIVITIES); } catch (Exception e) { e.printStackTrace(); } return info; } public static String getPackage(Context context) { try { PackageManager packageManager = context.getPackageManager(); PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0); return packageInfo.packageName; } catch (Exception e) { } return ""; } /** * 描述:获取运行的进程列表. * * @param context * @return */ public static List<AppProcessInfo> getRunningAppProcesses(Context context) { ActivityManager activityManager = null; List<AppProcessInfo> list = null; PackageManager packageManager = null; try { activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); packageManager = context.getApplicationContext() .getPackageManager(); list = new ArrayList<AppProcessInfo>(); // 所有运行的进程 List<RunningAppProcessInfo> appProcessList = activityManager .getRunningAppProcesses(); ApplicationInfo appInfo = null; AppProcessInfo abAppProcessInfo = null; PackageInfo packageInfo = getPackageInfo(context); if (mProcessList != null) { mProcessList.clear(); } mProcessList = getProcessRunningInfo(); for (RunningAppProcessInfo appProcessInfo : appProcessList) { abAppProcessInfo = new AppProcessInfo( appProcessInfo.processName, appProcessInfo.pid, appProcessInfo.uid); appInfo = getApplicationInfo(context, appProcessInfo.processName); // appInfo.flags; if (appInfo != null) { if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { abAppProcessInfo.isSystem = true; } else { abAppProcessInfo.isSystem = false; } Drawable icon = appInfo.loadIcon(packageManager); String appName = appInfo.loadLabel(packageManager) .toString(); abAppProcessInfo.icon = icon; abAppProcessInfo.appName = appName; } else { // :服务的命名 if (appProcessInfo.processName.indexOf(":") != -1) { appInfo = getApplicationInfo(context, appProcessInfo.processName.split(":")[0]); Drawable icon = appInfo.loadIcon(packageManager); abAppProcessInfo.icon = icon; } abAppProcessInfo.isSystem = true; abAppProcessInfo.appName = appProcessInfo.processName; } /* * AbPsRow psRow = getPsRow(appProcessInfo.processName); * if(psRow!=null){ abAppProcessInfo.memory = psRow.mem; } */ ProcessInfo processInfo = getMemInfo(appProcessInfo.processName); abAppProcessInfo.memory = processInfo.memory; abAppProcessInfo.cpu = processInfo.cpu; abAppProcessInfo.status = processInfo.status; abAppProcessInfo.threadsCount = processInfo.threadsCount; list.add(abAppProcessInfo); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 描述:根据进程名返回应用程序. * * @param context * @param processName * @return */ public static ApplicationInfo getApplicationInfo(Context context, String processName) { if (processName == null) { return null; } PackageManager packageManager = context.getApplicationContext() .getPackageManager(); List<ApplicationInfo> appList = packageManager .getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); for (ApplicationInfo appInfo : appList) { if (processName.equals(appInfo.processName)) { return appInfo; } } return null; } /** * 描述:kill进程. * * @param context * @param pid */ public static void killProcesses(Context context, int pid, String processName) { String cmd = "kill -9 " + pid; String Command = "am force-stop " + processName + "\n"; Process sh = null; DataOutputStream os = null; try { sh = Runtime.getRuntime().exec("su"); os = new DataOutputStream(sh.getOutputStream()); os.writeBytes(Command + "\n"); os.writeBytes(cmd + "\n"); os.writeBytes("exit\n"); os.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { sh.waitFor(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // AbLogUtil.d(AbAppUtil.class, "#kill -9 "+pid); L.i(processName); ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); String packageName = null; try { if (processName.indexOf(":") == -1) { packageName = processName; } else { packageName = processName.split(":")[0]; } activityManager.killBackgroundProcesses(packageName); // Method forceStopPackage = activityManager.getClass() .getDeclaredMethod("forceStopPackage", String.class); forceStopPackage.setAccessible(true); forceStopPackage.invoke(activityManager, packageName); } catch (Exception e) { e.printStackTrace(); } } // /** // * // * 描述:执行PS. // */ // public static List<AbPsRow> ps() { // List<AbPsRow> psRowlist = new ArrayList<AbPsRow>(); // String ps = runScript("ps"); // String[] lines = ps.split("\n"); // psRowlist = new ArrayList<AbPsRow>(); // for (String line : lines) { // AbPsRow row = new AbPsRow(line); // if (row.pid != null) psRowlist.add(row); // } // return psRowlist; // } // // /** // * // * 描述:获得这个进程的ps信息. // * @param processName // * @return // */ // public static AbPsRow getPsRow(String processName) { // List<AbPsRow> psRowlist = ps(); // for (AbPsRow row : psRowlist) { // if (processName.equals(row.cmd)) { // return row; // } // } // return null; // } /** * 描述:根据进程名获取CPU和内存信息. * * @param processName * @return */ public static ProcessInfo getMemInfo(String processName) { ProcessInfo process = new ProcessInfo(); if (mProcessList == null) { mProcessList = getProcessRunningInfo(); } String processNameTemp = ""; for (Iterator<String[]> iterator = mProcessList.iterator(); iterator .hasNext(); ) { String[] item = (String[]) iterator.next(); processNameTemp = item[9]; // AbLogUtil.d(AbAppUtil.class, // "##"+item[9]+",NAME:"+processNameTemp); if (processNameTemp != null && processNameTemp.equals(processName)) { // AbLogUtil.d(AbAppUtil.class, // "##"+item[9]+","+process.memory); // Process ID process.pid = Integer.parseInt(item[0]); // CPU process.cpu = item[2]; // S process.status = item[3]; // thread process.threadsCount = item[4]; // Mem long mem = 0; if (item[6].indexOf("M") != -1) { mem = Long.parseLong(item[6].replace("M", "")) * 1000 * 1024; } else if (item[6].indexOf("K") != -1) { mem = Long.parseLong(item[6].replace("K", "")) * 1000; } else if (item[6].indexOf("G") != -1) { mem = Long.parseLong(item[6].replace("G", "")) * 1000 * 1024 * 1024; } process.memory = mem; // UID process.uid = item[8]; // Process Name process.processName = item[9]; break; } } if (process.memory == 0) { L.d(AppUtil.class, "##" + processName + ",top -n 1未找到"); } return process; } /** * 描述:根据进程ID获取CPU和内存信息. * * @param pid * @return */ public static ProcessInfo getMemInfo(int pid) { ProcessInfo process = new ProcessInfo(); if (mProcessList == null) { mProcessList = getProcessRunningInfo(); } String tempPidString = ""; int tempPid = 0; int count = mProcessList.size(); for (int i = 0; i < count; i++) { String[] item = mProcessList.get(i); tempPidString = item[0]; if (tempPidString == null) { continue; } // AbLogUtil.d(AbAppUtil.class, "##"+item[9]+",PID:"+tempPid); tempPid = Integer.parseInt(tempPidString); if (tempPid == pid) { // AbLogUtil.d(AbAppUtil.class, // "##"+item[9]+","+process.memory); // Process ID process.pid = Integer.parseInt(item[0]); // CPU process.cpu = item[2]; // S process.status = item[3]; // thread process.threadsCount = item[4]; // Mem long mem = 0; if (item[6].indexOf("M") != -1) { mem = Long.parseLong(item[6].replace("M", "")) * 1000 * 1024; } else if (item[6].indexOf("K") != -1) { mem = Long.parseLong(item[6].replace("K", "")) * 1000; } else if (item[6].indexOf("G") != -1) { mem = Long.parseLong(item[6].replace("G", "")) * 1000 * 1024 * 1024; } process.memory = mem; // UID process.uid = item[8]; // Process Name process.processName = item[9]; break; } } return process; } /** * 描述:执行命令. * * @param command * @param workdirectory * @return */ public static String runCommand(String[] command, String workdirectory) { String result = ""; L.d(AppUtil.class, "#" + command); try { ProcessBuilder builder = new ProcessBuilder(command); // set working directory if (workdirectory != null) { builder.directory(new File(workdirectory)); } builder.redirectErrorStream(true); Process process = builder.start(); InputStream in = process.getInputStream(); byte[] buffer = new byte[1024]; while (in.read(buffer) != -1) { String str = new String(buffer); result = result + str; } in.close(); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 描述:运行脚本. * * @param script * @return */ public static String runScript(String script) { String sRet = ""; try { final Process m_process = Runtime.getRuntime().exec(script); final StringBuilder sbread = new StringBuilder(); Thread tout = new Thread(new Runnable() { public void run() { BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(m_process.getInputStream()), 8192); String ls_1 = null; try { while ((ls_1 = bufferedReader.readLine()) != null) { sbread.append(ls_1).append("\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }); tout.start(); final StringBuilder sberr = new StringBuilder(); Thread terr = new Thread(new Runnable() { public void run() { BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(m_process.getErrorStream()), 8192); String ls_1 = null; try { while ((ls_1 = bufferedReader.readLine()) != null) { sberr.append(ls_1).append("\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { bufferedReader.close(); } catch (IOException e) { e.printStackTrace(); } } } }); terr.start(); int retvalue = m_process.waitFor(); while (tout.isAlive()) { Thread.sleep(50); } if (terr.isAlive()) terr.interrupt(); String stdout = sbread.toString(); String stderr = sberr.toString(); sRet = stdout + stderr; } catch (Exception e) { e.printStackTrace(); return null; } return sRet; } /** * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) * * @return 应用程序是/否获取Root权限 */ public static boolean getRootPermission(Context context) { String packageCodePath = context.getPackageCodePath(); Process process = null; DataOutputStream os = null; try { String cmd = "chmod 777 " + packageCodePath; // 切换到root帐号 process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeBytes(cmd + "\n"); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (Exception e) { return false; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { e.printStackTrace(); } } return true; } /** * 描述:获取进程运行的信息. * * @return */ public static List<String[]> getProcessRunningInfo() { List<String[]> processList = null; try { String result = runCommandTopN1(); processList = parseProcessRunningInfo(result); } catch (Exception e) { e.printStackTrace(); } return processList; } /** * 描述:top -n 1. * * @return */ public static String runCommandTopN1() { String result = null; try { String[] args = {"/system/bin/top", "-n", "1"}; result = runCommand(args, "/system/bin/"); } catch (Exception e) { e.printStackTrace(); } return result; } // /** // * // * 描述:获取进程运行的信息. // * @return // */ // public static AbCPUInfo getCPUInfo() { // AbCPUInfo CPUInfo = null; // try { // String result = runCommandTopN1(); // CPUInfo = parseCPUInfo(result); // } catch (Exception e) { // e.printStackTrace(); // } // return CPUInfo; // } /** * 描述:解析数据. * * @param info User 39%, System 17%, IOW 3%, IRQ 0% PID PR CPU% S #THR VSS * RSS PCY UID Name 31587 0 39% S 14 542288K 42272K fg u0_a162 * cn.amsoft.process 313 1 17% S 12 68620K 11328K fg system * /system/bin/surfaceflinger 32076 1 2% R 1 1304K 604K bg * u0_a162 /system/bin/top * @return */ public static List<String[]> parseProcessRunningInfo(String info) { List<String[]> processList = new ArrayList<String[]>(); int Length_ProcStat = 10; String tempString = ""; boolean bIsProcInfo = false; String[] rows = null; String[] columns = null; rows = info.split("[\n]+"); // 使用正则表达式分割字符串 for (int i = 0; i < rows.length; i++) { tempString = rows[i]; // AbLogUtil.d(AbAppUtil.class, tempString); if (tempString.indexOf("PID") == -1) { if (bIsProcInfo == true) { tempString = tempString.trim(); columns = tempString.split("[ ]+"); if (columns.length == Length_ProcStat) { // 把/system/bin/的去掉 if (columns[9].startsWith("/system/bin/")) { continue; } // AbLogUtil.d(AbAppUtil.class, // "#"+columns[9]+",PID:"+columns[0]); processList.add(columns); } } } else { bIsProcInfo = true; } } return processList; } /** * * 描述:解析数据. * * @param info * User 39%, System 17%, IOW 3%, IRQ 0% * @return */ // public static AbCPUInfo parseCPUInfo(String info) { // AbCPUInfo CPUInfo = new AbCPUInfo(); // String tempString = ""; // String[] rows = null; // String[] columns = null; // rows = info.split("[\n]+"); // // 使用正则表达式分割字符串 // for (int i = 0; i < rows.length; i++) { // tempString = rows[i]; // //AbLogUtil.d(AbAppUtil.class, tempString); // if (tempString.indexOf("User") != -1 && tempString.indexOf("System") != // -1) { // tempString = tempString.trim(); // columns = tempString.split(","); // for(int j = 0; j < columns.length; j++){ // String col = columns[j].trim(); // String[] cpu = col.split(" "); // if(j == 0){ // CPUInfo.User = cpu[1]; // }else if(j == 1){ // CPUInfo.System = cpu[1]; // }else if(j == 2){ // CPUInfo.IOW = cpu[1]; // }else if(j == 3){ // CPUInfo.IRQ = cpu[1]; // } // } // } // } // return CPUInfo; // } /** * 描述:获取可用内存. * * @param context * @return */ public static long getAvailMemory(Context context) { // 获取android当前可用内存大小 ActivityManager activityManager = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); MemoryInfo memoryInfo = new MemoryInfo(); activityManager.getMemoryInfo(memoryInfo); // 当前系统可用内存 ,将获得的内存大小规格化 return memoryInfo.availMem; } /** * 描述:总内存. * * @param context * @return */ public static long getTotalMemory(Context context) { // 系统内存信息文件 String file = "/proc/meminfo"; String memInfo; String[] strs; long memory = 0; try { FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader, 8192); // 读取meminfo第一行,系统内存大小 memInfo = bufferedReader.readLine(); strs = memInfo.split("\\s+"); for (String str : strs) { L.d(AppUtil.class, str + "\t"); } // 获得系统总内存,单位KB memory = Integer.valueOf(strs[1]).intValue() ; bufferedReader.close(); } catch (Exception e) { e.printStackTrace(); } // Byte转位KB或MB return memory*1024; } }