如何实现禁止开机启动以及如何使应用失效

导读: 本文介绍了如何实现禁止开机启动以及如何使应用失效。

希望大家不要制造各种流氓软件或病毒

 

这一期我们来关注以下某些优化软件的开机优化功能

禁止开机启动和禁止

 

很多软件都有开机优化功能,比如360,金山,海卓……

我觉得海卓页面还不错,所以就截一张海卓的图片吧


点击右边的小旗,会有一些选项,这里只说两个

开机启动

程序状态

 

在android 4.1(jelly bean)版本中,settings中查看应用信息的地方有一个disable按钮,如下图


disable掉这个应用之后,在launcher列表中是查询不到的,也就是说,你无法启动这个应用了,也合理,但是如果你想enable就有些麻烦了。你得在settings中的应用列表中找到这个应用(一般出厂的手机,都有几十个应用,再加上自己安装的,应用数量很容易就100+了),然后再enable,这时候,launcher中就能再次看到这个应用了

(ps:还可以控制是否显示通知,这个功能估计大家都喜欢)

 

但是4.0及其之前的版本是没有disable这个功能的,但是如果root了手机,那么我们是可以实现这个功能的。

首选我们先看看手机中应用哪些是enabled的

Shell代码   收藏代码
  1. $ pm list package -e  
  2. package:android  
  3. package:cn.buding.coupon  
  4. package:cn.buding.moviecoupon  
  5. package:cn.chinabus.main  
  6. package:cn.chinabus.metro.main  
  7. package:cn.com.fetion  
  8. ……  

我看了一下我的手机,居然有249个enabled的程序,汗!

Shell代码   收藏代码
  1. $ pm list package -e | busybox wc -l                           
  2. 249  

查看disabled的应用改下选项就可以了

Java代码   收藏代码
  1. $ pm list package -d  

我们先来看看pm都能做些什么

Java代码   收藏代码
  1. pm list packages: prints all packages, optionally only  
  2.   those whose package name contains the text in FILTER.  Options:  
  3.     -f: see their associated file.  
  4.     -d: filter to only show disbled packages.  
  5.     -e: filter to only show enabled packages.  
  6.     -s: filter to only show system packages.  
  7.     -3: filter to only show third party packages.  
  8.     -u: also include uninstalled packages.  
  9.   
  10.   
  11. pm enable, disable, disable-user: these commands change the enabled state  
  12.   of a given package or component (written as "package/class").  

这里只截取了一部分,详情请自行查看pm帮助

 

大家可以拿一个无关紧要的程序试试,disable再enable,看看launcher有什么变化(需要root权限,之前的查询是不需要root权限的) ,比如:

Java代码   收藏代码
  1. pm disable cn.eoe.wiki  
  2. pm enable cn.eoe.wiki  

注:切换到root用户时,执行pm可能会出现段错误(android 4.0+)

 

Shell代码   收藏代码
  1. shell@android:/ # pm  
  2. [1] + Stopped (signal)     pm   
  3. shell@android:/ # pm                                                             
  4. [2] + Stopped (signal)     pm   
  5. [1] - Segmentation fault   pm   

 

我们在执行pm之前,export一下LD_LIBRARY_PATH即可

 

Shell代码   收藏代码
  1. export LD_LIBRARY_PATH=/vendor/lib:/system/lib  

 

我们可以查看一下这个变量

 

Java代码   收藏代码
  1. echo $LD_LIBRARY_PATH  

在我机器上面,普通用户是设置了这个变量的,切换到root的时候,这个变量就空了,所以需要重新export一下

 

 

第一个功能程序状态 讲解就结束了。

 

其实大多数人关心的是第二个功能开机启动 问题

首选,我们需要明确的是:我们需要知道哪些应用具有开机启动功能。

其实精确到应用还不可以,因为我们不是要把应用禁止掉,而是要把接收开机启动的Intent的receiver禁止掉,所以我们需要精确到class

首先我们来看看接收BOOT_COMPLETED的receiver在manifest中如何注册的

Xml代码   收藏代码
  1. <receiver android:name=".BootReceiver" android:enabled="true">  
  2.     <intent-filter>      
  3.         <action android:name="android.intent.action.BOOT_COMPLETED"/>   
  4.     </intent-filter>  
  5. </receiver>  

这里有一点是需要特别注意的: android:enabled="true"

enabled这个属性,大多数情况下我们是不显式写在这里的,当然,默认值就为true

禁止开机启动,其实就是设置接收BOOT_COMPLETED的receiver状态为disabled,即android:enabled="false"

首先要解决的就是如何获得所有接收BOOT_COMPLETED的receiver

开始我也搜索了一下,发现网上的很多方法都不可用,这里给大家说明一下:

错误方法1

 

Java代码   收藏代码
  1. Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);  
  2. List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_RESOLVED_FILTER);  

这里返回的list都是enabled的receiver

 

错误方法2

Java代码   收藏代码
  1. List<ApplicationInfo> allAppsList = mPackageManager.getInstalledApplications(0);  
  2. int allAppsListSize = allAppsList.size();  
  3. for (int i = 0; i < allAppsListSize; i++) {  
  4.     ApplicationInfo applicationInfo = allAppsList.get(i);  
  5.     PackageInfo packageInfo = mPackageManager.getPackageInfo(applicationInfo.packageName, PackageManager.GET_RECEIVERS);  
  6.     ActivityInfo[] receivers = packageInfo.receivers;  
  7.     if(receivers != null) {  
  8.             ……  
  9.     }  
  10. }  

这里获得的也都是enable的

 

错误方法3

有的人使用下面代码片断

 

Java代码   收藏代码
  1. if (PackageManager.PERMISSION_GRANTED == mPackageManager.checkPermission("android.permission.RECEIVE_BOOT_COMPLETED", app.packageName))  

检查package干什么?!

 

其实android原生给我们提供了如何获得所有component的api(enabled+disabled)

int android.content.pm.PackageManager.GET_DISABLED_COMPONENTS = 512 [0x200]

PackageInfo flag: include disabled components in the returned info.

 

这样,我们使用如下代码就可以了

Java代码   收藏代码
  1. Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED);  
  2. List<ResolveInfo> resolveInfoList = mPackageManager.queryBroadcastReceivers(intent, PackageManager.GET_DISABLED_COMPONENTS);  

然后我们需要知道组件的状态,disabled还是enabled

Java代码   收藏代码
  1. ComponentName mComponentName = new ComponentName(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.name);  
  2. Log.d(TAG, "COMPONENT_ENABLED_STATE:" + mPackageManager.getComponentEnabledSetting(mComponentName) + "\tpackageName:" + resolveInfo.activityInfo.packageName);  

接下来的事情就简单了,如果你想禁止包名为package的应用开机启动,那么只需在上面list中,找到所有此包下的receiver,然后

Shell代码   收藏代码
  1. pm disable package/class  
  2. pm enable package/class  

即可

 http://su1216.iteye.com/blog/1675800

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值