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;
}
}