自从入了魅族魅蓝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源码在此