最近想对Android进行改造一番,不想让系统默认的Launcher被替换掉,即按HOME键后一直是返回系统默认的主界面,而后其安装的Launcher(如Go Launcher等)则不会成为主界面,即按HOME键后不会返回安装的Launcher,也不会弹出主界面选择框。
在网上找了一些参考资料,后来想想,直接在安装的时候绕过吧,将问题消灭在萌芽阶段吧,就直接修改了frameworks/base/core/java/android/content/pm/PackageParser.java文件,在private boolean parseIntent函数里的else if (nodeName.equals("category"))分支的XmlUtils.skipCurrentTag(parser);和outInfo.addCategory(value);中间添加如下代码:
if ((Intent.CATEGORY_HOME + ".XINU").equals(value)) { value = Intent.CATEGORY_HOME;} else if (Intent.CATEGORY_HOME.equals(value)) { value = "HOME_XINU_IGNORE";}
再修改packages/apps/Launcher2/AndroidManifest.xml文件,将
android.intent.category.HOME
修改为
android.intent.category.HOME.XINU
然后编译烧录,再次运行,发现HOME键用不了了,为什么会这样呢?直接在上面加上如下语句:
Slog.w(TAG,"Xinu Value="+value);
再次编译烧录后发现,HOME_XINU_IGNORE这个值打印了3次,而CATEGORY_HOME打印了1次,可能启动时会有其他也使用到CATEGORY_HOME而被过滤掉了,故而加了如下处理,用于绕过在烧录后第一次启动加载时不进行上面的过滤处理:
在上面的PackageParser.java文件添加的判断语句再用一个判断语句来包含:
if (android.os.SystemProperties.get("persist.xinu.boot_flag","true").equals("false")) { "上面添加的语句"}
然后在frameworks/base/services/java/com/android/server/EntropyService.java文件中的如下语句:
Slog.w(TAG, "unable to load initial entropy (first boot?)", e);
前添加如下语句:
android.os.SystemProperties.set("persist.xinu.boot_flag","true");
接下来来修改init.rc文件,添加如下语句:
on property:init.svc.bootanim=stopped setprop persist.xinu.boot_flag false
至此,再次编译烧录后,无论安装什么其他的Launcher,按HOME键均会回到系统默认的Launcher,如果要替换为我们自己的Launcher,必须将其放至/system/app目录下打包,如果该APK有库,那需要把库放至/system/lib目录下。
该实现非常适合于品牌厂商ODM产品,这样无论如何都能返回自己的主界面了。(上面修改基于Android4.0.4)END