package cn.edu.buaa.act.sdp.malwaredetector.util; import android.annotation.TargetApi; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Build; import android.os.Environment; import android.util.Log; import android.widget.Toast; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import cn.edu.buaa.act.sdp.malwaredetector.entity.PackageInfoAsAPK; import cn.edu.buaa.act.sdp.malwaredetector.entity.PackageInfoWithSize; /** * Created by yao on 2014/11/5. * application manager */ public class AppManager { private static List<PackageInfoWithSize> list = new ArrayList<PackageInfoWithSize>(); private static List<PackageInfoAsAPK> list2 = new ArrayList<PackageInfoAsAPK>(); private static List<ActivityManager.RunningAppProcessInfo> list3 = new ArrayList<ActivityManager.RunningAppProcessInfo>(); private static List<ActivityManager.RunningServiceInfo> list4 = new ArrayList<ActivityManager.RunningServiceInfo>(); /** * get all installed applications * * @param context * @return installed applications list */ public static List<PackageInfoWithSize> getAllInstalledApps(Context context) { if (list.size() > 0) { return list; } List<PackageInfo> apps = context.getPackageManager().getInstalledPackages(0); for (PackageInfo pkg : apps) { if ((pkg.applicationInfo.flags & pkg.applicationInfo.FLAG_SYSTEM) == 0) { list.add(new PackageInfoWithSize(context, pkg)); } } return list; } /** * 指定APK的路径,获取PackageInfo * * @param context * @param apkPath: APK的路径 * @return */ public static PackageInfo getPackageInfo(Context context, String apkPath) { PackageInfo pkg = context.getPackageManager().getPackageArchiveInfo(apkPath, PackageManager.GET_ACTIVITIES); return pkg; } /** * 搜索整个文件系统查找APK安装包 * * @param context * @return APK安装包的PackageInfo列表 */ public static List<PackageInfoAsAPK> getAllApk(Context context) { if (list2.size() > 0) { return list2; } File file = Environment.getExternalStorageDirectory(); getAllApkDFS(context, file); return list2; } public static void getAllApkDFS(Context context, File file) { if (file.isFile()) { String name = file.getName(); String apkPath = null; if (name.toLowerCase().endsWith(".apk")) { apkPath = file.getAbsolutePath(); Log.d("yao", apkPath); list2.add(new PackageInfoAsAPK(context, apkPath)); } } else { File[] files = file.listFiles(); if (files != null && files.length > 0) { for (File fileInFolder : files) { getAllApkDFS(context, fileInFolder); } } } } public static List<ActivityManager.RunningAppProcessInfo> getRunningAppProcessInfo(Context context) { // if (list3.size() > 0) return list3; ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = activityManager.getRunningAppProcesses(); PackageManager pm = context.getPackageManager(); for (ActivityManager.RunningAppProcessInfo processInfoInfo : runningAppProcessInfos) { try { ApplicationInfo info = pm.getApplicationInfo(processInfoInfo.processName, 0); if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { list3.add(processInfoInfo); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } return list3; } public static List<ActivityManager.RunningServiceInfo> getRunningServices(Context context) { if (list4.size() > 0) return list4; ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningServiceInfo> runningServices = activityManager.getRunningServices(100); PackageManager pm = context.getPackageManager(); for (ActivityManager.RunningServiceInfo serviceInfo : runningServices) { try { ApplicationInfo info = pm.getApplicationInfo(serviceInfo.process, 0); if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { list4.add(serviceInfo); } } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } } return list4; } @TargetApi(Build.VERSION_CODES.KITKAT) public static long getStartTime(final int pid) throws IOException { final String path = "/proc/" + pid + "/stat"; final BufferedReader reader = new BufferedReader(new FileReader(path)); final String stat; try { stat = reader.readLine(); } finally { reader.close(); } final String field2End = ") "; final String fieldSep = " "; final int fieldStartTime = 20; final int msInSec = 1000; try { final String[] fields = stat.substring(stat.lastIndexOf(field2End)).split(fieldSep); final long t = Long.parseLong(fields[fieldStartTime]); final int tckName = Class.forName("libcore.io.OsConstants").getField("_SC_CLK_TCK").getInt(null); final Object os = Class.forName("libcore.io.Libcore").getField("os").get(null); final long tck = (Long) os.getClass().getMethod("sysconf", Integer.TYPE).invoke(os, tckName); return t * msInSec / tck; } catch (final NumberFormatException e) { throw new IOException(e); } catch (final IndexOutOfBoundsException e) { throw new IOException(e); } catch (ReflectiveOperationException e) { throw new IOException(e); } } public static void getLauncherActivity(Context context) { Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.addCategory(Intent.CATEGORY_LAUNCHER); List<ResolveInfo> list = context.getPackageManager().queryIntentActivities(intent, PackageManager.GET_ACTIVITIES); } public static int add(int a, int b) { return a + b; } }