自从入了魅族魅蓝E3的坑，等了一年也没等到BootLoader解锁的方法，也受够了那个没几秒就一次的WiFi断流。苦苦寻觅，终于找到价格在2k上下，性能过得去，非异形屏，非背面指纹，拍照还可以，最重要一点，可以解锁BootLoader，可以装xposed的机子 -- 二手 华为 Mate 10。机子到手随即在深水宝让人给解锁BootLoader了，开启了Magisk->Root->Xposed的折腾之路。或许是距离我太久没碰过华为手机了（上一台华为手机还是C8850），发现刷入Magisk，安装Xposed的方法跟其他机型有很大区别，爬文了解了之后，算是把Magisk+Root+Xposed搞定了。装上最熟悉的Nova Launcher却发现不能设置为默认桌面，华为什么脑残设定嘛！心想祭出冰箱冻结就好了，没想到事情却没这么简单，使用冰箱添加支付宝扫码快捷方式后，发现没有任何反应，冰箱的快捷方式权限已经给了啊!再去论坛爬文，发现还是华为脑残设定。。。这下子没这么好办了，冰箱管不到这块了。爬文良久没找到解决办法，只能硬着头皮自己来了。既然默认应用设置把第三方桌面灰了不让我点，那就从这里入手，用开发者助手找出这里的资源ID，包名，将系统设置的apk传到Mac上JEB静态反编译走起。拿着0x7f0a07a8就到JEB去搜索，找到位于com.android.settings.applications.PreferredSettings这个类的onCreateView方法里，但是这个方法看不出什么有价值的线索，JEB字体太小，看的眼睛都疼了，还是把dex拉出来，用jadx直接把dex还原成Java源文件吧。庆幸的是，这些代码并没有做混淆，还原成Java源文件后，方法名和变量名都是原始命名，这样看起来就容易多了。用IntelliJ IDEA打开源码看，舒服多了，翻翻这个类，发现PreferredSettings.buildPreferredActivitiesList这个方法有点嫌疑，build什么List，可惜jadx反编译失败了，还是要回到jeb去看。Jeb反编译也不算很好，出来一堆goto,耐着性子找亮点。发现这有重大嫌疑，Anti?Protection?Launcher?进去看看呗！在这个类里，看到了华为桌面的包名com.huawei.android.launcher了，先写个hook，把AntiMalProtectionUtils.checkLauncherPermisson始终返回true试试！XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("com.android.settings.AntiMalProtectionUtils"), "checkLauncherPermisson", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult(true); } });重启一看，红色提示文字消失了，第三方桌面可以选择了，但是应用快捷方式还是添加不了，常规返回Home时，还是回到的华为桌面。难道跟AntiMalProtectionUtils.getHwDefLauncherPkg这个方法有关?public static String getHwDefLauncherPkg() { return "com.huawei.android.launcher"; }改成返回Nova桌面的包名试试？XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("com.android.settings.AntiMalProtectionUtils"), "getHwDefLauncherPkg", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { param.setResult("com.teslacoilsw.launcher"); } });结果还是不行，再仔细看AntiMalProtectionUtils.checkLauncherPermisson这个方法，按照它的正常流程走的话，ActivityManager.checkUidPermission应该要返回0,那就hook这个方法试试吧！XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("android.app.ActivityManager"), "checkUidPermission", new XC_MethodHook() { @Override protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { if (param.args[0] == "com.huawei.permission.sec.SDK_LAUNCHER") param.setResult(0); } });重启一试，成了！！！反手就把华为桌面丢冰箱里了，没想到的是，这个老流氓，重启后竟然自动解冻了，还又成了默认桌面了！这下就尴尬了，难道每次重启都要手动重新选一次桌面？这用户体验极差啊！依稀记得看到过什么Launcher disabled之类的方法的，再翻翻去~~~看到这个方法，解法很明显了，int res = this.mPm.getApplicationEnabledSetting(hwDefLauncherPkg);中res的返回值不是2和3就好了。XposedBridge.hookAllMethods(loadPackageParam.classLoader.loadClass("android.app.ApplicationPackageManager"), "getApplicationEnabledSetting", new XC_MethodHook() { @Override protected void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable { if (param.args[0] == "com.huawei.android.launcher") param.setResult(1); } });重启，设置Nova为默认桌面，冻结华为桌面，再重启，华为桌面没解冻了，默认桌面还是Nova，终于搞定了！然而还是高兴的太早，屏幕手势的底部上滑失效了。。。算了，我投降了。我不冻结华为桌面了，你一边凉快去吧。。。最终达成效果：自由选择第三方桌面，自由使用Android 7开始的应用快捷方式。 完整Xposed源码在此