就是单纯来记录面试被问到的问题1.车机的流量有限但是要确保系统里几个很重要的服务要优先有网络这个内容应该怎么修改2.内存泄漏的检查逻辑3.ANR 那种可以通过 traces 能直接看到死锁的这种好改如果看到那种看不到死锁的怎么去定位第一个问题其实我脑子里就是在想networkrequest 然后给到 ConnectivityService后再去做修改但是总觉得面试官就是在给我下陷阱肯定要留意别的修改点想了想估计要路由但是路由表我本来就是不太会写直接露馅第二个问题哥们真没改过那么多内存泄漏的问题好多都是更新so文件就完事了或者帮忙客户看一下代码就完事了这里确实需要整理了第三个问题没遇到过所以没有一点思路出现问题不冤写个答案后续也好整理ai的答案是这样的举例普通默认网络wlan0核心服务网络rmnet_data0核心服务 UID10086、10087专用路由表100mark0x1001. 给蜂窝网络建专用路由表ip route add 10.20.30.0/24 dev rmnet_data0 scope link src 10.20.30.2 table 100ip route add default via 10.20.30.1 dev rmnet_data0 table 1002. 按 UID 给核心服务流量打 markiptables -t mangle -A OUTPUT -m owner --uid-owner 10086 -j MARK --set-mark 0x100iptables -t mangle -A OUTPUT -m owner --uid-owner 10087 -j MARK --set-mark 0x1003. 根据 mark 选择路由表ip rule add fwmark 0x100/0x100 table 100 priority 10000为了防止看不懂ip route add default via 网关 dev 网口 table 表号ip rule add fwmark mark/mask table 表号 priority 优先级UID 10086 发包↓命中 ip rule uidrange 10086↓查 table 100↓table 100 有 default via rmnet_data0↓可以走蜂窝网络好这是第一题第二题是内存泄漏的检查逻辑首先内存泄漏先看现象比如是系统长期运行后内存持续上升GC后不回落、应用或者System_server 的PSS持续增长最终出现卡顿频繁GCLMKD杀进程甚至系统重启然后我会区分是java堆泄漏native 堆泄漏还是图形内存binder文件句柄等资源。java层主要通过dumpsys meminfoheap dump、MAT、LeakCanary、或者Android studio Profiler 看对象是不是被异常引用native层会看 native heapmalloc info heapprofdmemtracksmaps必要时结合tombstone addresssanitizer或者malloc debug核心逻辑还是看对象或者内存块在业务结束后是否还被GC Root、静态变量、Handler、线程、单例、Listener、Binder callback 等长期引用导致无法释放首先先看到底是不是泄漏业务反复执行↓内存持续上涨↓触发 GC 后仍然不下降↓多轮操作后基线越来越高第一种方法首先可以通过 android studio的 profiler 工具然后点击 memory 面版来查看尤其是现在Android studio 有 那个强行回收的按钮可以按一下看看有时候按一下内存也没什么变化十有八九就是内存泄漏了第二种方法呢就是用命令行来看其实就是一直 执行 dumpsys meminfo 来观察而已 来看接下来就是各种泄漏的点1.是java堆泄漏静态变量持有 ContextHandler 延迟消息持有 Activity匿名内部类持有外部类单例持有 View / ActivityListener 注册后没有反注册BroadcastReceiver 没有 unregisterServiceConnection 没有 unbindCursor 没关闭集合缓存无限增长2.native 内存泄漏C/C malloc 后没 freenew 后没 deleteJNI NewGlobalRef 没 DeleteGlobalRefNative buffer 没释放Bitmap / GraphicBuffer / HardwareBuffer 泄漏HAL 层资源没 close文件描述符没 close3.图形泄漏Surface 没 releaseSurfaceTexture 没 releaseBitmap 过多GraphicBuffer 没释放ImageReader acquire 后没 closeCamera buffer 没归还MediaCodec buffer 没释放第三个问题traces 看不到死锁时先看 main thread 在干什么有几种情况1main 线程在 Binder 调用里2main 线程在等锁但是不是明显 deadlock3main 线程在 wait / sleep4main 线程在 IO / 数据库 / 文件操作ok记录第一次后面记录第二次的
Android framework 面试复盘
发布时间:2026/7/4 4:00:30
就是单纯来记录面试被问到的问题1.车机的流量有限但是要确保系统里几个很重要的服务要优先有网络这个内容应该怎么修改2.内存泄漏的检查逻辑3.ANR 那种可以通过 traces 能直接看到死锁的这种好改如果看到那种看不到死锁的怎么去定位第一个问题其实我脑子里就是在想networkrequest 然后给到 ConnectivityService后再去做修改但是总觉得面试官就是在给我下陷阱肯定要留意别的修改点想了想估计要路由但是路由表我本来就是不太会写直接露馅第二个问题哥们真没改过那么多内存泄漏的问题好多都是更新so文件就完事了或者帮忙客户看一下代码就完事了这里确实需要整理了第三个问题没遇到过所以没有一点思路出现问题不冤写个答案后续也好整理ai的答案是这样的举例普通默认网络wlan0核心服务网络rmnet_data0核心服务 UID10086、10087专用路由表100mark0x1001. 给蜂窝网络建专用路由表ip route add 10.20.30.0/24 dev rmnet_data0 scope link src 10.20.30.2 table 100ip route add default via 10.20.30.1 dev rmnet_data0 table 1002. 按 UID 给核心服务流量打 markiptables -t mangle -A OUTPUT -m owner --uid-owner 10086 -j MARK --set-mark 0x100iptables -t mangle -A OUTPUT -m owner --uid-owner 10087 -j MARK --set-mark 0x1003. 根据 mark 选择路由表ip rule add fwmark 0x100/0x100 table 100 priority 10000为了防止看不懂ip route add default via 网关 dev 网口 table 表号ip rule add fwmark mark/mask table 表号 priority 优先级UID 10086 发包↓命中 ip rule uidrange 10086↓查 table 100↓table 100 有 default via rmnet_data0↓可以走蜂窝网络好这是第一题第二题是内存泄漏的检查逻辑首先内存泄漏先看现象比如是系统长期运行后内存持续上升GC后不回落、应用或者System_server 的PSS持续增长最终出现卡顿频繁GCLMKD杀进程甚至系统重启然后我会区分是java堆泄漏native 堆泄漏还是图形内存binder文件句柄等资源。java层主要通过dumpsys meminfoheap dump、MAT、LeakCanary、或者Android studio Profiler 看对象是不是被异常引用native层会看 native heapmalloc info heapprofdmemtracksmaps必要时结合tombstone addresssanitizer或者malloc debug核心逻辑还是看对象或者内存块在业务结束后是否还被GC Root、静态变量、Handler、线程、单例、Listener、Binder callback 等长期引用导致无法释放首先先看到底是不是泄漏业务反复执行↓内存持续上涨↓触发 GC 后仍然不下降↓多轮操作后基线越来越高第一种方法首先可以通过 android studio的 profiler 工具然后点击 memory 面版来查看尤其是现在Android studio 有 那个强行回收的按钮可以按一下看看有时候按一下内存也没什么变化十有八九就是内存泄漏了第二种方法呢就是用命令行来看其实就是一直 执行 dumpsys meminfo 来观察而已 来看接下来就是各种泄漏的点1.是java堆泄漏静态变量持有 ContextHandler 延迟消息持有 Activity匿名内部类持有外部类单例持有 View / ActivityListener 注册后没有反注册BroadcastReceiver 没有 unregisterServiceConnection 没有 unbindCursor 没关闭集合缓存无限增长2.native 内存泄漏C/C malloc 后没 freenew 后没 deleteJNI NewGlobalRef 没 DeleteGlobalRefNative buffer 没释放Bitmap / GraphicBuffer / HardwareBuffer 泄漏HAL 层资源没 close文件描述符没 close3.图形泄漏Surface 没 releaseSurfaceTexture 没 releaseBitmap 过多GraphicBuffer 没释放ImageReader acquire 后没 closeCamera buffer 没归还MediaCodec buffer 没释放第三个问题traces 看不到死锁时先看 main thread 在干什么有几种情况1main 线程在 Binder 调用里2main 线程在等锁但是不是明显 deadlock3main 线程在 wait / sleep4main 线程在 IO / 数据库 / 文件操作ok记录第一次后面记录第二次的