androidはapkがインストールされているかインストールされていないかの情報を取得します
apkリソースを取得する際に最も重要なクラスはPackageManagerです.このクラスを通じて、labelやアイコンなどのリソースを含む、インストールされているapkの基本情報を得ることができます.
インストールされているapkの基本情報を取得します.次に、未インストールのapkファイルの基本情報を取得する方法を見てみましょう.これはandroidの動的ロードに役立ちます.
apkがインストールされていないアイコンを取得します.
Androidが動的にロードされる場合、DexClassLoaderによって実現されます.このようにして、インストールされていないDexClassLoaderオブジェクトを取得します.
2番目のパラメータdexOutPathは、apkファイルに対応するdexファイルの格納パスであり、nullであってはならない.
3番目のパラメータは、ターゲットクラスで使用されるC/C++ライブラリのリストであり、各ディレクトリは
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はいつものように使えます.