My Octopress Blog

Rise of the Apes.

通过反射隐藏MX2的SmartBar

由来

SmartBar自打出来便一直引来不少争议,与此同时貌似便是官方与开发者的关于显示与隐藏SmartBar的竞赛,开发者千方百计希望可以隐藏掉SmartBar,而官方则想方设法不让开发者隐藏。

而网上流传的最广的setSystemUiVisibility貌似第一时间就被官方咔掉了,其他能找的资料少之又少,没办法,只能通过反编译学习别人怎么去掉。来个偷师学艺,希望程序员的偷也不算偷。

经过

首先从安装包里面提取出dex文件

使用反编译工具反编译

随后使用jar浏览器查看反编译出来的文件,再逐步查看代码,肯定是优先查看MainActivity的,既然程序的设置里面是有选择关闭SmartBar的,便优先搜索preference

再找到com.weibo.net.s这个类搜索 j(boolean)方法

这样看来便大致可以猜测com.weibo.net.s是个常量类之类的,j(boolean)和w()分别是get/set方法,这样的话,回到MainActivity找到使用了set()方法的地方

一开始我还傻傻的以为setNavigationMode是我要的Key,跑了一遍才发现break才是我要找的,在这里终于见到了long time no see的goto,我的意思是…相信你们懂的,再来一次,搜索label217

这便是我要的结果了……不过217是什么?宿舍号码吗…管他嘞

结果

将代码拿过来优化之后

    try {
        Class ActionBarClass = getActionBar().getClass();
        Class[] parameterTypes = new Class[1];
        parameterTypes[0] = Boolean.TYPE;
        Method setTabsShowAtBottom = ActionBarClass.getMethod(
                "setTabsShowAtBottom", parameterTypes);
        Object[] parameterValues = new Object[1];
        parameterValues[0] = Boolean.valueOf(true);
        setTabsShowAtBottom.invoke(getActionBar(), parameterValues);
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }

不过呢,最后的结果还是需要继续调整的,因为右上角的两个ActionBar图标应该不是你想要的吧。