Xposed第四课(微信篇) 朋友圈点赞 (1)

上篇文章有些小伙伴问我怎么去看布局文件的,我这里交代先我分析界面的方法

1、 adb shell dumpsys activity top

QQ截图20180522220405.png

2、 as自带的layout inspector(有些情况无法得到绘制)

QQ截图20180522220927.png

但是显示效果最好

3、 Android Device Monitor 相信以前用eclipse时候adt经常用到的

QQ截图20180522221137.png

好了废话不多说了,以上是我用到的,如果有更好的可以给我留言。😁~

首先terminal输入adb shell dumpsys activity top 如下

QQ截图20180522220405.png

往下继续翻

QQ截图20180522221907.png

然后咱们看看分析分析SnsTimeLineUI里面的代码逻辑

    public void onCreate(Bundle bundle) {
             ...省略N多代码...
            
            this.skT = this.rUA;
            this.slh.a(this.sle, this.jzz, str, str2, this.slf, this.rWo, this.slg);
            //这句话是初始化里面的列表等组建
            this.slh.onCreate();
            ae.byE().init();
            this.mActionBar = getSupportActionBar();
            com.tencent.mm.kernel.g.Ea();
            com.tencent.mm.kernel.g.DX().fUP.a((int) com.tencent.mm.plugin.appbrand.jsapi.bio.face.c.CTRL_INDEX, (e) this);
            com.tencent.mm.kernel.g.Ea();
            com.tencent.mm.kernel.g.DX().fUP.a(682, (e) this);
            com.tencent.mm.kernel.g.Ea();
            com.tencent.mm.kernel.g.DX().fUP.a(218, (e) this);
    
            ...省略N多代码...
    }

通过上面的代码可以找到

com.tencent.mm.plugin.sns.ui.bb

在这个文件里面就有我们刚才在terminal里面看到的很多关联的东西


QQ截图20180522222705.png

所以关联起来可以开始编码了,里面注释的代码都是打印的关键信息,可以在一边调试一边看输出信息

 /**
     * hook 朋友圈
     *
     * @param applicationContext
     * @param classLoader
     */
    private void hookWxMoments(final Context applicationContext, final ClassLoader classLoader) throws Error {
        XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.sns.ui.bb",
                classLoader,
                "onCreate",
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        Field mat = XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "mActivity");
                        final Activity mActivity = (Activity) mat.get(param.thisObject);
                        Field odm = XposedHelpers.findFieldIfExists(param.thisObject.getClass(), "odm");
                        ListView mlv = (ListView) odm.get(param.thisObject);
                        Class<?> mlvSuperClass = mlv.getClass().getSuperclass();
//                        LogUtils.i(mlv.toString(), mlvSuperClass.toString());
                        XposedHelpers.findAndHookMethod(mlvSuperClass,
                                "setAdapter",
                                ListAdapter.class,
                                new XC_MethodHook() {
                                    @Override
                                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                        super.beforeHookedMethod(param);
                                        final ListAdapter adapter = (ListAdapter) param.args[0];
//                                        LogUtils.i(adapter.toString());
                                        XposedHelpers.findAndHookMethod(adapter.getClass(),
                                                "getView",
                                                int.class,
                                                View.class,
                                                ViewGroup.class,
                                                new XC_MethodHook() {
                                                    @Override
                                                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                                                        super.beforeHookedMethod(param);
//                                                        int position = (int) param.args[0];
                                                        final View view = (View) param.args[1];
//                                                        ViewGroup viewGroup = (ViewGroup) param.args[2];
                                                        if (view != null) {
                                                            //fl 第一个view是图片 第二个view是朋友圈内容
                                                            final ViewGroup fl = (ViewGroup) view;
//                                                            StringBuffer sb = new StringBuffer();

//                                                            for (int i = 0; i < fl.getChildCount(); i++) {
//                                                                sb.append(fl.getChildAt(i).toString());
//                                                                sb.append("@");
//                                                                sb.append(fl.getChildAt(i).getId());
//                                                                sb.append("@");
//                                                                sb.append(applicationContext.getResources().getResourceName(fl.getChildAt(i).getId()));
//                                                                sb.append("\n");
//                                                            }

//                                                            LogUtils.i(position, view, sb.toString(), viewGroup, JSON.toJSONString(adapter.getItem(position)), adapter.getItem(position).toString());

                                                            view.setOnLongClickListener(new View.OnLongClickListener() {

                                                                @Override
                                                                public boolean onLongClick(View v) {
                                                                    new AlertDialog.Builder(mActivity)
                                                                            .setTitle("温馨提示")
                                                                            .setMessage("是否对当前消息进行疯狂点赞").setNegativeButton("是的", new DialogInterface.OnClickListener() {
                                                                        @Override
                                                                        public void onClick(DialogInterface dialog, int which) {
                                                                            mActivity.runOnUiThread(new Runnable() {
                                                                                @Override
                                                                                public void run() {
                                                                                    if (fl != null && fl.getChildCount() > 1) {
                                                                                        LinearLayout msgLinear = (LinearLayout) fl.getChildAt(1);
                                                                                        for (int i = 0; i < msgLinear.getChildCount(); i++) {
                                                                                            View mc = msgLinear.getChildAt(i);
                                                                                            String resourceName = applicationContext.getResources().getResourceName(mc.getId());
                                                                                            if (mc instanceof TextView) {
//                                                                                                mc.setVisibility(View.VISIBLE);
//                                                                                                ((TextView) mc).append("看雪论坛,看雪论坛++,看雪论坛+++");
                                                                                                //因为有些gettext 得到的是spanned 调toString会引起shutdown 所以用以下方式打印即可
//                                                                                                LogUtils.i(((TextView) mc).getText());
                                                                                            } else if (mc instanceof ViewStub) {
//                                                                                                ((ViewStub) mc).inflate();
                                                                                            } else if("com.tencent.mm:id/de_".equals(resourceName)){
                                                                                                ViewGroup vg = (ViewGroup)mc;
                                                                                                mc.setVisibility(View.VISIBLE);
                                                                                                if(vg.getChildCount()>0){
                                                                                                    TextView likeView = (TextView) vg.getChildAt(0);
                                                                                                    likeView.append("看雪论坛,看雪论坛++,看雪论坛+++");
                                                                                                    LogUtils.i(likeView.getCompoundDrawables());
                                                                                                }else {
                                                                                                    TextView tv = new TextView(applicationContext);
                                                                                                    tv.setText(",看雪论坛,看雪论坛++,看雪论坛+++");
                                                                                                    tv.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
                                                                                                    vg.addView(tv);
                                                                                                }
                                                                                            }
//                                                                                            LogUtils.i(mc, resourceName, "com.tencent.mm:id/de_");
                                                                                        }
                                                                                    }
                                                                                }
                                                                            });

                                                                        }
                                                                    }).setNeutralButton("不是的", null).show();
                                                                    return false;
                                                                }
                                                            });
                                                        }
                                                    }
                                                });
                                    }
                                });
                    }
                });
    }

最终结果 如下图

去掉上图代码注释效果图 去掉上图代码注释效果图 注释后代码的效果
QQ截图20180522223529.png
QQ截图20180522213753.png
QQ截图20180522223339.png

去掉注释我把所有view都展示出来了,后面过滤注释无用代码后只留下点赞栏目的view即可

这个只是做了ui效果,后面会进行数据库保存记录,保证下次浏览到该条信息能够直接显示点赞数据,并且尽可能实现从好友列表选择点赞人

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容