怎么隐藏一个app的显示呢?方法十多种多样的。
1 、PackageManager.getComponentEnabledSettingge 跟setComponentEnabledSetting 这两个办法是可行的。当然有他的优缺点,可以试试
2、直接注释掉mainfest里面的入口category android:name=
"”android.intent.category.LAUNCHER”"
></category>
,这个是Android提供的一个隐式启动app的方法
3、上面的方法都是直接利用改了Android 现有的api去改的。
其实有更加灵活的修改的方法。那就是直接去修改packagemanagerservice
public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) {//vincent
final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false, "get installed packages");
// writer
synchronized (mPackages) {
ArrayList<PackageInfo> list;
if (listUninstalled) {
list = new ArrayList<PackageInfo>(mSettings.mPackages.size());
for (PackageSetting ps : mSettings.mPackages.values()) {
PackageInfo pi;
if (ps.pkg != null) {
pi = generatePackageInfo(ps.pkg, flags, userId);
} else {
pi = generatePackageInfoFromSettingsLPw(ps.name, flags, userId);
}
if (pi != null) {
if(标志位){
list.add(pi);
}
}
}
} else {
list = new ArrayList<PackageInfo>(mPackages.size());
for (PackageParser.Package p : mPackages.values()) {
PackageInfo pi = generatePackageInfo(p, flags, userId);
if (pi != null) {
if(标志位){
list.add(pi);
}
}
}
}
还有另外一个地方:
@Override
public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) {//vincent
if (!sUserManager.exists(userId)) return null;
final boolean listUninstalled = (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
// writer
synchronized (mPackages) {
ArrayList<ApplicationInfo> list;
if (listUninstalled) {
list = new ArrayList<ApplicationInfo>(mSettings.mPackages.size());
for (PackageSetting ps : mSettings.mPackages.values()) {
ApplicationInfo ai;
if (ps.pkg != null) {
ai = PackageParser.generateApplicationInfo(ps.pkg, flags,
ps.readUserState(userId), userId);
} else {
ai = generateApplicationInfoFromSettingsLPw(ps.name, flags, userId);
}
if (ai != null) {
if(标志位){
list.add(ai);
}
}
}
} else {
list = new ArrayList<ApplicationInfo>(mPackages.size());
for (PackageParser.Package p : mPackages.values()) {
if (p.mExtras != null) {
ApplicationInfo ai = PackageParser.generateApplicationInfo(p, flags,
((PackageSetting)p.mExtras).readUserState(userId), userId);
if (ai != null) {
list.add(ai);
}
}
}
}
}
return new ParceledListSlice<ApplicationInfo>(list);
}
}
需要隐藏那个app,又或者需要做其他什么操作,都可以在代码块的标志位里面进行修改。
当然。所有通过这两个api获取的地方,app都会被隐藏掉。如果还想做深入的隐藏。例如data/app ,就需要对整个文件系统进行屏蔽,对busybox 脚本命令进行过滤
。来来回回,其实套路都是那么个样。。。。。。。你懂的。