1。http://blog.csdn.net/qinjuning/article/details/6867806 此人博客寫的不錯,有待研究啊html
2。http://blog.csdn.net/liranke/article/details/17717571 簡直就是超級大神!java
3。下面來看我們的案例android
PackageManager pm = getPackageManager();ios
下面是獲取當前應用的基本信息:git
//圖標github
Drawable app_icon =pm.getApplicationIcon(getApplicationInfo());api
// 獲取名稱
String app_name = (String) pm.getApplicationLabel(getApplicationInfo());app
PackageInfopackageInfo = pm.getPackageInfo(getPackageName(), PackageManager.GET_UNINSTALLED_PACKAGES);ide
mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
//mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
mAppInfo.setVersionName(packageInfo.versionName);
mAppInfo.setVersionCode(packageInfo.versionCode);
mAppInfo.setPackageName(packageInfo.packageName);
mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);this
下面是獲取手機中應用的基本信息:
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
AppInfo mAppInfo = new AppInfo();
mAppInfo.setAppLabel((String) packageInfo.applicationInfo.loadLabel(pm));
//mAppInfo.setAppIcon(packageInfo.applicationInfo.loadIcon(pm));
mAppInfo.setVersionName(packageInfo.versionName);
mAppInfo.setVersionCode(packageInfo.versionCode);
mAppInfo.setPackageName(packageInfo.packageName);
mAppInfo.setFirstInstallTime(packageInfo.firstInstallTime);
mAppInfo.setLastUpdateTime(packageInfo.lastUpdateTime);
// Only display the non-system app info
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
// 若是非系統應用,則添加至appList
mAppInfos.add(mAppInfo);
}
}
下面是獲取手機桌面上應用的基本信息:
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);
for (ResolveInfo resolveInfo : queryIntentActivities) {
AppInfo mAppInfo = new AppInfo();
mAppInfo.setAppIcon(resolveInfo.loadIcon(pm));
mAppInfo.setAppLabel((String)resolveInfo.loadLabel(pm));
mAppInfo.setPackageName(resolveInfo.activityInfo.packageName);
mAppInfos.add(mAppInfo);
}
效果如圖:
關於apk的安裝路徑和大小:
豌豆莢
10-04 03:38:02.178: I/System.out(2458): sourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): dataDir:/data/data/com.wandoujia.phoenix2
10-04 03:38:02.178: I/System.out(2458): publicSourceDir:/data/app/com.wandoujia.phoenix2-1.apk
10-04 03:38:02.178: I/System.out(2458): 豌豆莢的apk大小:5.13MB
API Demos
10-04 03:38:02.002: I/System.out(2458): sourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.006: I/System.out(2458): dataDir:/data/data/com.example.android.apis
10-04 03:38:02.006: I/System.out(2458): publicSourceDir:/data/app/com.example.android.apis-1.apk
10-04 03:38:02.026: I/System.out(2458): API Demos的apk大小:4.58MB
電話
10-04 03:38:01.802: I/System.out(2458): sourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.802: I/System.out(2458): dataDir:/data/data/com.android.voicedialer
10-04 03:38:01.802: I/System.out(2458): publicSourceDir:/system/app/VoiceDialer.apk
10-04 03:38:01.810: I/System.out(2458): Voice Dialerapk的大小:124KB
鬧鐘
10-04 03:38:02.202: I/System.out(2458): sourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): dataDir:/data/data/com.android.deskclock
10-04 03:38:02.202: I/System.out(2458): publicSourceDir:/system/app/DeskClock.apk
10-04 03:38:02.202: I/System.out(2458): Clockapk大小:2.14MB
代碼實現:
List<ApplicationInfo> installedApplications = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
for (ApplicationInfo applicationInfo : installedApplications) {
String sourceDir=applicationInfo.sourceDir;//安裝路徑
String dataDir=applicationInfo.dataDir;
String publicSourceDir=applicationInfo.publicSourceDir;
System.out.println("sourceDir:"+sourceDir);
System.out.println("dataDir:"+dataDir);
System.out.println("publicSourceDir:"+publicSourceDir);
int size = Integer.valueOf((int) new File(publicSourceDir).length());
System.out.println(applicationInfo.loadLabel(pm)+"的apk大小:"+Formatter.formatFileSize(this, size));
}
這個大小和茄子快傳,快牙,閃傳,豌豆莢上的軟件管理中顯示的是一致的
應用程序的大小:
豌豆莢
10-04 03:58:18.234: I/System.out(2538): cacheSize:28.00KB,codeSize:11.11MB,dataSize:8.96MB
10-04 03:58:18.238: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.238: I/System.out(2538): 豌豆莢的總大小:20.10MB
API Demos
10-04 03:58:18.122: I/System.out(2538): cacheSize:12.00KB,codeSize:6.43MB,dataSize:0.00B
10-04 03:58:18.122: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.122: I/System.out(2538): API Demos的總大小:6.44MB
電話
10-04 03:58:18.310: I/System.out(2538): cacheSize:12.00KB,codeSize:60.00KB,dataSize:12.00KB
10-04 03:58:18.310: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:18.310: I/System.out(2538): Voice Dialer的總大小:84.00KB
鬧鐘
10-04 03:58:17.818: I/System.out(2538): cacheSize:12.00KB,codeSize:392KB,dataSize:60.00KB
10-04 03:58:17.862: I/System.out(2538): externalCacheSize:0.00B,externalCodeSize:0.00B,externalDataSize:0.00BexternalMediaSize:0.00B,externalObbSize:0.00B
10-04 03:58:17.866: I/System.out(2538): Clock的總大小:464KB
目錄結構以下:
介紹一篇aidl的文章:http://www.cnblogs.com/rookietong/archive/2013/03/16/2962623.html
android.content.pm,這個包及包下的全部東西都是死的,是系統的aidl文件,這些文件能夠在github上下載。
IPackageDataObserver.aidl:
package android.content.pm;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageDataObserver {
void onRemoveCompleted(in String packageName, boolean succeeded);
}
IPackageStatsObserver.aidl:
package android.content.pm;
import android.content.pm.PackageStats;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageStatsObserver {
void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}
PackageStats.aidl:
package android.content.pm;
parcelable PackageStats;
軟件包的大小封裝在PackageStats這個類中,要獲取這個類不能用構造方法獲取,這一點也不知道爲何。他是經過PackageManager的hide方法getPackageSizeInfo()來獲得,可是要調用這個hide方法就要用java的反射機制,否則pm.不出來。應用aidl的代碼以下:
List<ResolveInfo> queryIntentActivities = pm.queryIntentActivities(intent, 0);
for (final ResolveInfo resolveInfo : queryIntentActivities) {
try {
Method getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, resolveInfo.activityInfo.packageName, new IPackageStatsObserver.Stub() {
@Override
public void onGetStatsCompleted(PackageStats packageStats, boolean succeeded) throws RemoteException {
// TODO Auto-generated method stub
Long cacheSize=packageStats.cacheSize;
Long codeSize=packageStats.codeSize;
Long dataSize=packageStats.dataSize;
Long externalCacheSize=packageStats.externalCacheSize;
Long externalCodeSize=packageStats.externalCodeSize;
Long externalDataSize=packageStats.externalDataSize;
Long externalMediaSize=packageStats.externalMediaSize;
Long externalObbSize=packageStats.externalObbSize;
System.out.println("cacheSize:" + Formatter.formatFileSize(getApplication(), cacheSize) + ",codeSize:" + Formatter.formatFileSize(getApplication(), codeSize) + ",dataSize:" + Formatter.formatFileSize(getApplication(), dataSize));
System.out.println("externalCacheSize:" + Formatter.formatFileSize(getApplication(), externalCacheSize) + ",externalCodeSize:" + Formatter.formatFileSize(getApplication(), externalCodeSize) + ",externalDataSize:" + Formatter.formatFileSize(getApplication(), externalDataSize)+
"externalMediaSize:"+Formatter.formatFileSize(getApplication(), externalMediaSize) + ",externalObbSize:" + Formatter.formatFileSize(getApplication(), externalObbSize) );
String totalSize=Formatter.formatFileSize(getApplication(), (packageStats.cacheSize + packageStats.codeSize +packageStats.dataSize)/*/(1024*1024)*/);
System.out.println((String) resolveInfo.loadLabel(pm)+"的總大小:" + totalSize /*+"M"*/);
}
});
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
這個大小是和獵豹清理大師軟件管理中的大小是一致的
點擊item啓動應用程序:
啓動另外的一個應用程序的Activity:
http://www.apkbus.com/android-43480-1-1.html
http://gundumw100.iteye.com/blog/1138158 (其中這個比較好)
代碼實現:
lv.setAdapter(adapter);
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String packageName = (String) items.get(position).get( "packageName");
//取到點擊的包名
Intent i = pm.getLaunchIntentForPackage(packageName);
//若是該程序不可啓動(像系統自帶的包,有不少是沒有入口的)會返回NULL
if (i != null)
startActivity(i);
}
});