Android中區分系統程式和安裝程式

jia635發表於2014-09-09

在google上輸入以上的關鍵字+ android,可以搜到的程式碼

List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);

雖然,有些程式碼號稱可以過濾掉系統自身的應用程式,但是隻要細看程式碼就會發現,好像裡面的那個布林變數沒有起到什麼過濾的作用。

  方法一:通過獲取的安裝包(包括安裝的與系統自身的應用程式),對其android.content.pm.PackageInfo的packageName 進行過濾,

但是Android與google的包比較容易過濾掉,但需要對不同產商進行適配;

  方法二:列舉 \data\app 資料夾,其下的*.apk檔案 就是本機安裝的軟體,而\system\App下的*.apk檔案就是系統自帶的軟體,

由於普通的程式是無法讀取這兩個資料夾的,需要root許可權吧,因此該方法也行不通(用File.listFiles() + android.permission.FACTORY_TEST 許可權 還是不能列舉出檔案)

雖然不能列舉資料夾 "\data\app\",但我們可以訪問(read)資料夾"\data\app\"下的所有檔案,因此可以用如下的方法來獲取本機上已經安裝的軟體(排除系統的應用程式):

PackageManager pckMan = getPackageManager();
List<PackageInfo> packs = pckMan.getInstalledPackages(0);
count = packs.size();
String name;
int installedNum = 0;
for(int i = 0; i < count; i++) { 
                PackageInfo p = packs.get(i); 
    if (p.versionName == null) 
        continue; 
    
方法三、可以通過uid來過濾系統系統的安裝包,因為android系統中的uid從 1000 ~ 9999 都是給系統程式保留的,所以只要判斷package的uid > 10000即可判定該程式是非系統程式。

if(p.applicationInfo.uid > 10000)
   //非系統程式

uid是程式在安裝的時候由系統分配的。

 方法四:這個方法應該是最優的。在廣告殺手中用的這個區分系統還是第三方軟體

ApplicationInfo appInfo = p.applicationInfo;
    /**
     * Value for {@link #flags}: if set, this application is installed in the
     * device's system image.
     */
if((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0)
    //系統程式
else
    //不是系統程式



相關文章