Android中級篇之區分系統程式和安裝程式
2011-05-20 21:37:08
出處:http://www.cnblogs.com/mengshu-lbq/archive/2010/09/09/1822237.html
在google上輸入以上的關鍵字+ android,可以搜到的代碼:
1
|
List<PackageInfo> packs = getPackageManager().getInstalledPackages(
0
);
|
雖然,有些代碼號稱可以過濾掉系統自身的應用程式,但是只要細看代碼就會發現,好像裡面的那個布爾變數沒有起到什麼過濾的作用。
方法一
:通過擷取的安裝包(包括安裝的與系統自身的應用程式),對其android.content.pm.PackageInfo的packageName 進行過濾,
但是Anrodi與google的包比較容易過濾掉,但需要對不同產商進行適配;
方法二
:枚舉 /data/app 檔案夾,其下的*.apk檔案 就是本機安裝的軟體,而/system/App下的*.apk檔案就是系統內建的軟體,
由於普通的程式是無法讀取這兩個檔案夾的,需要root許可權吧,因此該方法也行不通(用File.listFiles() + android.permission.FACTORY_TEST 許可權 還是不能枚舉出檔案)
雖然不能枚舉檔案夾 "/data/app/",但我們可以訪問(read)檔案夾"/data/app/"下的所有檔案,因此可以用如下的方法來擷取本機上已經安裝的軟體(排除系統的應用程式):
01
|
PackageManager pckMan = getPackageManager();
|
02
|
List<PackageInfo> packs = pckMan.getInstalledPackages(
0
);
|
06
|
for
(
int i =
0
; i < count; i++) {
|
07
|
PackageInfo p = packs.get(i);
|
08
|
if (p.versionName ==
null
)
|
01
|
//判斷該軟體包是否在/data/app目錄下
|
02
|
File f1 =
new File(
"/data/app/" + p.packageName +
".apk"
);
|
03
|
if
(!f1.exists())
continue
;
|
09
|
name = p.applicationInfo.loadLabel(pckMan).toString();
|
方法三
、可以通過uid來過濾系統系統的安裝包,因為android系統中的uid從 1000 ~ 9999 都是給系統程式保留的,所以只要判斷package的uid > 10000即可判定該程式是非系統程式。
1
|
if
(p.applicationInfo.uid >
10000
)
|
uid是程式在安裝的時候由系統分配的。
方法四:這個方法應該是最優的。
1
|
ApplicationInfo appInfo = p.applicationInfo;
|
3
|
* Value for {@link #flags}: if set, this application is installed in the
|
4
|
* device's system image.
|
6
|
if
((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) >
0
)
|
//不是系統程式
Android源碼上的方法
com/android/settings/ManageApplications.java
if (filterOption == FILTER_APPS_THIRD_PARTY) {<br /> List<ApplicationInfo> appList =new ArrayList<ApplicationInfo> ();<br /> for (ApplicationInfo appInfo : installedAppList) {<br /> boolean flag = false;<br /> if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {<br /> // Updated system app<br /> flag = true;<br /> } else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {<br /> // Non-system app<br /> flag = true;<br /> }<br /> if (flag) {<br /> appList.add(appInfo);<br /> }<br /> }