您的位置:首页 > 移动开发 > Android开发

Android中级篇之区分系统程序和安装程序

2011-05-20 21:44 330 查看
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

);


03


count = packs.size();


04


String name;


05


int

installedNum =

0

;


06


for

(

int

i =

0

;i <count;i++){


07



PackageInfo p = packs.get(i);


08



if

(p.versionName ==

null

)


09



continue

;


10




01


 

//判断该软件包是否在/data/app目录下


02



File f1 =

new

File(

"/data/app/"

+  p.packageName +

".apk"

);


03



if

(!f1.exists())

continue

;


04


05



installedNum++;


06



/**


07


 

* 应用程序的名字


08


 

*/


09



name = p.applicationInfo.loadLabel(pckMan).toString();


10


}


方法三
、可以通过uid来过滤系统系统的安装包,因为android系统中的uid从 1000 ~ 9999 都是给系统程序保留的,所以只要判断package的uid >10000即可判定该程序是非系统程序。

1


if

(p.applicationInfo.uid >

10000

)


2



//非系统程序


uid是程序在安装的时候由系统分配的。

方法四:这个方法应该是最优的。

1


ApplicationInfo appInfo = p.applicationInfo;


2



/**


3


 

* Value for {@link #flags}: if set, this application is installed in the


4


 

* device's system image.


5


 

*/


6


if

((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)>

0

)


7



//系统程序


8


else


//不是系统程序

Android源码上的方法
com/android/settings/ManageApplications.java

if (filterOption == FILTER_APPS_THIRD_PARTY){
List<ApplicationInfo>appList =new ArrayList<ApplicationInfo>();
for (ApplicationInfo appInfo : installedAppList){
boolean flag = false;
if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)!= 0){
// Updated system app
flag = true;
} else if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM)== 0){
// Non-system app
flag = true;
}
if (flag){
appList.add(appInfo);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: