wxg客户端面经

上岸了,回馈社会
更新中

一面(约1h)
拷打项目
你的登录怎么做的(WebView回调检测登录成功,html提取用户信息)
经过实习你有没有学到别的方法(F12抓包,走一遍登录流程看发了什么请求,返回了什么数据,里面可能有token)
之前贴吧中有人发一个链接,用户点击后会自动发一个逆天评论,怎么解决这个问题(请求中带token)
token怎么来(登录时服务端返回,保存用户信息,过期时间等信息,可以用token+refresh的双token模式)

拷打实习
介绍一下实习
为什么用到Native Hook(监听登录)
Native Hook方式?(PLT hook, inline hook)
inline hook原理?(改指令,跳转到代理函数)
PLT Hook的原理?(修改GOT表)
改什么?(目标函数的绝对地址)
PLT Hook使用条件(目标函数为外部引用)
怎么保证一定能Hook到?也就是你要在实际执行前hook。(Hook dlopen,加载目标so的时候自动hook)
Hook时机?(attachBaseContext)
讲讲Java层Hook?(反射修改ClassLoader,优先加载自己的dex)

场景题
native层怎么监控数组越界(写一个数组工具类)
那已有的代码呢(hook malloc)
hook了怎么改(不知道,提示了mprotect后说把分配内存后面的区域设为不可访问,这样越界会有异常,能被捕获)
设置多大的范围?(不知道)

八股
安卓中内存泄漏了解吗(Service,ThreadLocal,长生命周期持有短生命周期引用)

算法题
解决memcpy覆盖的问题

二面(约1h30min)
拷打实习
讲讲替换ClassLoader实习hook的细节
PLT Hook的原理
有哪些先决条件(外部引用)
为什么同一个so里的Hook不到(调用不走PLT和GOT表)
还有哪些Hook方式(Inline Hook)
什么原理(插跳转指令)
还有什么方法(不知道)
外部引用地址是怎么填到GOT表中的(加载so的时候会记录已加载函数的地址)
so函数地址是怎么来的(支支吾吾)
ELF加载过程(dlopen把so加载进内存解析,具体啥结构不记得了)
改符号导出表可以吗(哦哦可以,dlsym应该就是通过这个获取函数地址的)
编译打包优化展开讲讲
AB实验了解吗(没有了解)
AB实验原理是什么(对照实验)
对照实验原理是什么(控制变量观察结果)
观察到B比A点击率高0.1%,可以认为B比A好吗(不能,有偶然性)
那要百分之多少才没有偶然性(不知道)

拷打项目
有啥难点吗(没啥难点)
为什么用的人这么多(口口相传)

八股
请求到服务器到返回结果,经历了哪些事情
DNS解析是谁做的(操作系统)

场景
用过微信网页传输助手吗,怎么做一个消息收发的功能(可以用WebSocket)
服务端你会怎么设计(保存最近几十条消息,带id)
客户端呢(长轮询,服务端收到消息后如果对方在轮询中就返回消息,客户端上线主动同步消息,告诉服务器本地最新消息id,然后服务器推送后续消息)
你是怎么想到的,了解过吗(没了解过,yy出来的)

闲聊
为什么没转正
准备读研吗,为什么不读

算法题
第k大
数位和再数位和

三面(约1h 45min)
看你简历很优秀,奖项排满了,学习成绩怎么样(一般)
为什么不转正
在腾讯实习才系统学安卓?(是的)
你做了笔记?看看(内部维基上)
学了安卓有什么收获?(学到很多,也更了解kotlin了)
你提到了kotlin,那说说kotlin协程和线程的区别(语言级线程,有3个调度器决定协程)
用Main调度器会创建线程吗(不会)
对比普通线程处理上下文,协程是怎么处理的?(也有上下文,但比线程少点)
你有没有研究过kotlin协程的底层原理(io操作或suspend函数时通过挂起让出cpu)
会挂起线程吗(不会)
怎么挂起的(也是保存上下文吧)

讲讲怎么实习优化编译打包速度的
你觉得实习做的最有挑战的事是什么(native hook)
展开讲讲
你用PLT Hook的时候也顺便把inline hook也了解了吗(是的,安卓的Hook方式都了解了)
有写文章吗(有)(投屏展示)
有遇到困难吗(cpp编译成elf时函数名字改写)
再讲讲替换ClassLoader的Hook方式?

知道Apk包含哪些内容吗(classes.dex,lib,res,assets,resource.arsc索引)
有没有用打印log去看过arsc索引文件有哪些东西(有,用mt看过,包含各种id和路径,以及color和string)
从你的角度为什么要用这种方式去组织资源(便于访问,图片方便快速定位,color和string这种用的多的每次都从文件里读就慢了)
他不会一次性读出来吧,你知道他怎么读的吗(不知道)

场景题
微信14亿用户信息,不用数据库,设计一个用纯文件去保存的方案(目录+数据)
如果要修改信息呢(可以用链表存kv对)
你得分页吧,基于这种分页结构,你还会怎么去完善它(同一个用户的信息尽量在同一页)
这样每页都会有碎片,你不能每次都开一个新页吧,太浪费了,怎么找空页(用一个链表按顺序记录有碎片的页)
这是一个好的设计。那并发读写效率差怎么解决(分表)
怎么分(每一百万个用户一个文件)

你对flutter的掌握程度怎么样(偏使用)
有遇到卡顿的情况吗(有,ListView滑动卡)
有没有去优化(没有)
你项目中图片上传怎么处理的(压缩)
只考虑size吗(是)
微信图片考虑的就多了
继续挖了点细节。

闲聊
讲讲竞赛经历
玩什么游戏
除了竞赛,还有什么能证明你的能力(逆向破解暴力薅某个软件的羊毛)

智力题
8个球有1个重量不一样要称几次能找出来(2次)
如果是n个呢(log3(n))

很多公司给你发offer,你会怎么考虑(优先微信)
我估计微信给你发offer问题不大。

面委(待更新)
全部评论
nb
2 回复 分享
发布于 2024-12-30 18:22 河南
tql佬
1 回复 分享
发布于 2024-12-30 15:12 美国
佬实习做的这些是什么语言方向的呢,看着已经偏离表面的Android业务了😢
1 回复 分享
发布于 2024-12-29 18:35 广东
感觉实习经历的hook比较底层,实习生一般不是接触不到嘛
1 回复 分享
发布于 2024-12-29 18:32 广东
佬,有面委会面经嘛
点赞 回复 分享
发布于 04-03 12:11 广东
这就是wxg吗,答不上来几个😂😅😅
点赞 回复 分享
发布于 2024-12-28 12:33 广东
佬是上岸字节还是微信了
点赞 回复 分享
发布于 2024-12-28 03:35 江苏
祝好
点赞 回复 分享
发布于 2024-12-27 20:23 广东

相关推荐

会员标识
04-17 20:20
已编辑
电子科技大学 算法工程师
发点面经希望能求求好运~4.7早面,两天后挂了,面了1h无手撕。面试官人还是不错的。另外面试官那边说在招的都是ue的项目,主要就问基础知识了(八股盛宴)自我介绍略。-----------1.说一下多态√(静态多态函数重载和模板,动态多态派生类和虚函数2.说一下虚函数怎么实现和调用√ (虚表,虚表指针)3.虚表什么时候初始化√(虚表编译时,虚表指针new的时候)4.多继承几个虚表指针,内存分布?√(子类继承了几个基类就有几个虚表,和对应的虚表指针)5.定义一个空的class,编译器默认会帮我生成哪些函数??(回答的是构造、析构、拷贝构造、)(---实际应该还有赋值运算符和两种取址运算符)6.默认生成的构造和析构是虚的吗?√(构造不是虚的,析构没有子类的话默认也不是虚的,但如果是有子类那父类必须得是虚的)7.刚刚提到默认生成的拷贝构造,那么它是一个深拷贝的实现还是浅拷贝实现??(没准备到,一开始说了浅,但是想到浅只是新指针指向,如果两个指向同一个资源,delete两次就坏了,于是说了深。这里面试官还引导我说一下深浅拷贝的概念。)(---实际默认实现是浅拷贝!!但确实也存在上面的那个隐患,所以需要人为的重载)8.说一下C++的内存分区,以及各个区的功能√9.静态成员变量,在那个分区?√ (静态存储区)10.函数内的静态变量或者CPP文件下的静态变量√(都是静态存储区,前者即使作用域消失也还会在内存中存在,只是没法访问;后者可以文件内访问,只是没法跨文件)11.那它们三的初始化的时机是一样的吗?√(C++中的类静态成员变量和cpp文件下的是main执行前,函数的局部静态变量是首次调用函数时。12.New和malloc的区别√13.什么场景使用new什么场景用malloc?(这里说了需要构造对象用new,需要分配内存给基本类型又不需要构造的时候用malloc14.New和Malloc分配的时候,释放时的方式?√(delete/free)15.Malloc申请内存的释放,可以只释放一部分吗?√(free我记得只能释放完整的内存吧)(---如果想动态调整倒是可以用realloc??这个不太清楚)16.指针引用区别√17.class里有三个int,用sizeof给这个class的引用和指针取值,他们的值是多少,一样的吗?√(不一样,引用就是class原大小12,指针就是4or8)18.指针变量所指向的地址不能改变,应该哪里加const?int * const19.内容不能改变呢?const int * (---其实还有int const * )20.四种类型转换,每个的作用√21.static_cast相比C语言用括号进行转换,好处是什么?X(只说了更安全会有类型检查……)(---实际还有,C语言只用于值类型,static_cast能用于指针、引用以及类)22.现在对两个无关的类型,用static_cast进行转换,会得到什么?√(说了编译时就会报错)23.两个无继承关系的类型,用dynamic_cast进行转换,会得到什么??(说了运行时报错)24.运行时报错的具体表现??(指针类型的转换失败,就会抛出nullptr,引用类型的异常,抛出bad_cast(---背倒是背了,但是答的时候没有注意大前提……无继承类型的话,是编译时报错……转换失败才是上面这两种……)25.智能指针说一下√26.shared_ptr作为函数的参数传递时,会增加引用计数吗?√(值传递会调用shared_ptr的拷贝构造,引用计数会加,但是引用传递就不会)27.如果是我用拷贝的方式来传递,他是在什么时候把加一给减掉了?√(函数执行完,局部变量生命周期结束时,拷贝的那个shared_ptr对象自己的析构调用时减128.Unique指针,可以写一个函数,它的返回值是unique指针吗?X(我说要分情况,如果一个函数里局部变量的unique指针,不能这样返回,如果全局的就可以)(---这里应该是完全没答到点上。函数返回值直接用unique_ptr是恰当的用法,临时对象直接通过移动语义传递独占所有权。)------数据结构篇-----29.说一下栈和队列,应用场景√(函数调用,回溯算法//BFS,FIFO策略)30.如果在C++里自己实现队列(不用STL),有那些方式?√(链表队列,数组用循环队列)31.用数组的方式来实现的缺点是什么??(会有空间的浪费,队列最大长度也有限)32.现在我把队列改造成一个带优先级的优先队列,我现在我向里边插入一个元素,它大概的流程是怎样的?X (这里当作成了OS里的那个多级队列,直接超级大爆,后面面试官甚至提醒了我堆排序也没唤起记忆)33.计算哈希值有哪些常用方法(说了MD5码,SHA256,简单的话就取模)34.遇到冲突怎么解决?√(链地址,开放地址法)35.链地址法怎样来解决哈希冲突。而且使用这种方法,最后查找的时候是怎样来查找?√(指针数组,取模后找对应槽位的链表进行遍历,顺便提了一下链地址如果长了,负载因子高了也需要动态扩容并调整哈希函数)36.用哈希表实现的容器?√37.红黑树相比于二叉平衡树的优点?√(只说了平衡的严格程度,插入和删除效率也更高,虽然同为O(logn)但红黑树所需要的旋转更少)-----根据项目问八股环节---------38.“从操作系统层面考虑序列化,中间大概发生那些流程,把内存的数据转换成硬盘中的数据?”X (文件IO忘了,只说了转换为流文件再写入磁盘)39.这个过程它会涉及到操作系统里边用户态和内核态的切换吗?X(一开始说了不能,爆了,下面面试官再问的时候才说能)40.用户态和内核态就是他设计出来的主要目的是什么?A:内核态可以访问调度各种资源数据,包括外围设备,用户态只能访问分配的资源。41.游戏的存档IO这一步,可以在主线程进行吗?他会不会导致游戏就是卡住了,比如你写的东西很多A:有可能42.那你会考虑怎么实现和解决?A:可以考虑协程43.我们先说协程,它本质上是开了一个新的线程,还是用其他的方式来实现?√(说了一下协程的原理)44.稍微发散一点,如果我现在很多数据量很大的需要写入到硬盘中,并不一定是游戏存档。你来写程序的话,会写一个多线程的方式的程序,还是写一个多进程的方式的程序更好一些。A:认为多线程好一些,会共享内存且线程切换开销小一些,但是要注意写入时的保护(感觉是一个开放性问题,还有什么可以说的吗?)45.那有哪些线程同步的方式?A:临界区,互斥锁,信号量46.假设我们用信号量的方式,简化一下,比如就两个线程,一个写的,一个读的,这个信号量大概是怎样来操作的?A:我说可以允许多个读线程并发,读与读之间可以不互斥,但写线程要和所有其他读写线程互斥(感觉答的不对口)47.UI相关有用到什么设计模式吗?A:我回答了UI管理器用了单例,然后一些其他对象触发UI逻辑更新时会用到观察者------没有手撕------反问问了面试官部门现在的工作内容?然后实习生进去一般是做什么?问了如果Unity转UE有什么建议还是说工作室会有什么指导?#牛客AI配图神器#
点赞 评论 收藏
分享
评论
25
53
分享

创作者周榜

更多
牛客网
牛客企业服务