androidはapkがインストールされているかインストールされていないかの情報を取得します

6489 ワード

apkリソースを取得する際に最も重要なクラスはPackageManagerです.このクラスを通じて、labelやアイコンなどのリソースを含む、インストールされているapkの基本情報を得ることができます.
PackageManager pm = getPackageManager();
List<PackageInfo> apkInfos = pm.getInstalledPackages(0);
ArrayList<String> infos_name =  new ArrayList<String>() ;//    label
ArrayList<Drawable> infos_icon = newArrayList<Drawable>();//    apk      
String name = "";
   Drawable icon;
   PackageInfo apk;
   for (int i = 0; i < apkInfos.size(); )
   {
      apk = apkInfos.get(i);
      i++;
      name = (String) pm.getApplicationLabel(apk.applicationInfo);
      icon = pm.getApplicationIcon(apk.applicationInfo);
      infos_icon.add(icon);
      infos_name.add(name);
   }
次にPackageManagerを使用して、インストールされているapkのactivity、サービスなどを取得します.
List<PackageInfo>packagesInfo =  pm.getInstalledPackages(0);
for (PackageInfo packageInfo : packagesInfo) {
	Log.d("TAG","packageInfo NAME IS :"+packageInfo.packageName);
}


PackageManager pm = getPackageManager();
try {   
//  com.example.pertest   activity,service broadcastreceiver
PackageInfo packageInfo = pm.getPackageInfo("com.example.pertest",
				PackageManager.GET_PERMISSIONS
						| PackageManager.GET_SERVICES
						| PackageManager.GET_RECEIVERS);
	ActivityInfo[] activities = packageInfo.activities;

	if (activities != null) {
		for (ActivityInfo activityInfo : activities) {
			Log.d("TAG", "the activity " + activityInfo.toString()
					+ "==" + packageInfo.versionCode + "==="
					+ packageInfo.versionName);
		}
	} else {
		Log.d("TAG", "the activity is null");
	}
	ServiceInfo[] serviceInfos = packageInfo.services;
	for (ServiceInfo serviceInfo : serviceInfos) {
		Log.d("TAG", "service name is :" + serviceInfo.name);
	}

	activities = packageInfo.receivers;
	for (ActivityInfo activity : activities) {
		Log.d("TAG", "receiver is :" + activity.name);
	}
} catch (NameNotFoundException e) {
	// TODO Auto-generated catch block
	e.printStackTrace();
}

インストールされているapkの基本情報を取得します.次に、未インストールのapkファイルの基本情報を取得する方法を見てみましょう.これはandroidの動的ロードに役立ちます.
apkがインストールされていないアイコンを取得します.
public static Drawable getAppIcon(Context context, String apkFilepath) {
        PackageManager pm = context.getPackageManager();
        PackageInfo pkgInfo = getPackageInfo(context, apkFilepath);
        if (pkgInfo == null) {
            return null;
        }

        ApplicationInfo appInfo = pkgInfo.applicationInfo;
        if (Build.VERSION.SDK_INT >= 8) {
            appInfo.sourceDir = apkFilepath;
            appInfo.publicSourceDir = apkFilepath;
        }
        return pm.getApplicationIcon(appInfo);
    }
インストールされていないapkの名前を取得します.
public static CharSequence getAppLabel(Context context, String apkFilepath) {
        PackageManager pm = context.getPackageManager();
        PackageInfo pkgInfo = getPackageInfo(context, apkFilepath);
        if (pkgInfo == null) {
            return null;
        }
        ApplicationInfo appInfo = pkgInfo.applicationInfo;
        if (Build.VERSION.SDK_INT >= 8) {
            appInfo.sourceDir = apkFilepath;
            appInfo.publicSourceDir = apkFilepath;
        }

        return pm.getApplicationLabel(appInfo);
 }
まだ足りないと感じたら、PackageInfoオブジェクトを得ることができます.このオブジェクトを通じて、apkがインストールされていないactivity、service、broadcastreceiverなどを得ることができます.方法は「インストールされているapkのactivity、serviceを得る」と同じです.コードは以下の通りです.
//  PackageInfo  ,      apk   activity service
public static PackageInfo getPackageInfo(Context context, String apkFilepath) {
        PackageManager pm = context.getPackageManager();
        PackageInfo pkgInfo = null;
        try {
            pkgInfo = pm.getPackageArchiveInfo(apkFilepath, PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES);
        } catch (Exception e) {
            // should be something wrong with parse
            e.printStackTrace();
        }
        return pkgInfo;
    }

Androidが動的にロードされる場合、DexClassLoaderによって実現されます.このようにして、インストールされていないDexClassLoaderオブジェクトを取得します.
String mNativeLibDir = mContext.getDir("pluginlib", Context.MODE_PRIVATE).getAbsolutePath();
 private DexClassLoader createDexClassLoader(String dexPath) {
        File dexOutputDir = mContext.getDir("dex", Context.MODE_PRIVATE);
        dexOutputPath = dexOutputDir.getAbsolutePath();
        DexClassLoader loader = new DexClassLoader(dexPath, dexOutputPath, mNativeLibDir, mContext.getClassLoader());
        return loader;
 }
の最初のパラメータdexPathは、私たちのapkの保存パスです.
2番目のパラメータdexOutPathは、apkファイルに対応するdexファイルの格納パスであり、nullであってはならない.
3番目のパラメータは、ターゲットクラスで使用されるC/C++ライブラリのリストであり、各ディレクトリはFile.pathSeparator である.null。  , 。 DexClassLoader , apk , , :android apk , context, , :
 private AssetManager createAssetManager(String dexPath) {
        try {
            AssetManager assetManager = AssetManager.class.newInstance();
            Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class);
            addAssetPath.invoke(assetManager, dexPath);
            return assetManager;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


private Resources createResources(AssetManager assetManager) {
        Resources superRes = mContext.getResources();
        Resources resources = new Resources(assetManager, superRes.getDisplayMetrics(), superRes.getConfiguration());
        return resources;
}
この時のassetManagerとresourcesはいつものように使えます.