[{"data":1,"prerenderedAt":695},["ShallowReactive",2],{"navigation_docs":3,"-interview-flutter-interview2":173,"-interview-flutter-interview2-surround":690},[4,22,29,36,107,138,145,161],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"博客","i-lucide-pen-line","\u002Fblog","0.blog",[10,12,17],{"title":5,"path":7,"stem":11,"icon":6},"0.blog\u002Findex",{"title":13,"path":14,"stem":15,"icon":16},"创建基于 UIKit 的原生 iOS 项目","\u002Fblog\u002Fcreate-uikit-ios-project","0.blog\u002F01.create-uikit-ios-project","i-lucide-app-window",{"title":18,"path":19,"stem":20,"icon":21},"Lockify：把账号和密码留在自己的手机里","\u002Fblog\u002Flockify","0.blog\u002F02.lockify","i-lucide-lock",{"title":23,"path":24,"stem":25,"children":26,"icon":28},"年度总结","\u002Fannual-review","1.annual-review\u002Findex",[27],{"title":23,"path":24,"stem":25,"icon":28},"i-lucide-git-commit",{"title":30,"path":31,"stem":32,"children":33,"icon":35},"故事","\u002Fstories","2.stories\u002Findex",[34],{"title":30,"path":31,"stem":32,"icon":35},"i-lucide-feather",{"title":37,"icon":38,"path":39,"stem":40,"children":41},"Android","i-simple-icons-android","\u002Fandroid","3.android",[42,44,49],{"title":37,"path":39,"stem":43,"icon":38},"3.android\u002Findex",{"title":45,"path":46,"stem":47,"icon":48},"初探Navigation","\u002Fandroid\u002Fcompose-navigation","3.android\u002F01.compose-navigation","i-lucide-route",{"title":50,"icon":51,"path":52,"stem":53,"children":54},"安卓代码加固","i-lucide-shield","\u002Fandroid\u002Fhidden-hardening","3.android\u002F02.hidden-hardening\u002Findex",[55,58,62,67,72,77,82,87,92,97,102],{"title":56,"path":52,"stem":53,"icon":57},"安卓代码加固：总览","i-lucide-map",{"title":59,"path":60,"stem":61,"icon":21},"安卓代码加固（1）：加密DEX","\u002Fandroid\u002Fhidden-hardening\u002Fencrypt-dex","3.android\u002F02.hidden-hardening\u002F01.encrypt-dex",{"title":63,"path":64,"stem":65,"icon":66},"安卓代码加固（2）：Native解密","\u002Fandroid\u002Fhidden-hardening\u002Fnative-decrypt","3.android\u002F02.hidden-hardening\u002F02.native-decrypt","i-lucide-cpu",{"title":68,"path":69,"stem":70,"icon":71},"安卓代码加固（3）：内存加载","\u002Fandroid\u002Fhidden-hardening\u002Fmemory-load","3.android\u002F02.hidden-hardening\u002F03.memory-load","i-lucide-memory-stick",{"title":73,"path":74,"stem":75,"icon":76},"安卓代码加固（4）：指令分发","\u002Fandroid\u002Fhidden-hardening\u002Fopcode-dispatch","3.android\u002F02.hidden-hardening\u002F04.opcode-dispatch","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"安卓代码加固（5）：XOR混淆","\u002Fandroid\u002Fhidden-hardening\u002Fxor-obfuscate","3.android\u002F02.hidden-hardening\u002F05.xor-obfuscate","i-lucide-shuffle",{"title":83,"path":84,"stem":85,"icon":86},"安卓代码加固（6）：密钥外置","\u002Fandroid\u002Fhidden-hardening\u002Fkey-external","3.android\u002F02.hidden-hardening\u002F06.key-external","i-lucide-key",{"title":88,"path":89,"stem":90,"icon":91},"安卓代码加固（7）：依赖隔离","\u002Fandroid\u002Fhidden-hardening\u002Fdep-isolate","3.android\u002F02.hidden-hardening\u002F07.dep-isolate","i-lucide-layers",{"title":93,"path":94,"stem":95,"icon":96},"安卓代码加固（8）：构建校验","\u002Fandroid\u002Fhidden-hardening\u002Fbuild-verify","3.android\u002F02.hidden-hardening\u002F08.build-verify","i-lucide-shield-check",{"title":98,"path":99,"stem":100,"icon":101},"安卓代码加固（9）：防录屏","\u002Fandroid\u002Fhidden-hardening\u002Fflag-secure","3.android\u002F02.hidden-hardening\u002F09.flag-secure","i-lucide-eye-off",{"title":103,"path":104,"stem":105,"icon":106},"安卓代码加固（10）：ABI门禁","\u002Fandroid\u002Fhidden-hardening\u002Fabi-gate","3.android\u002F02.hidden-hardening\u002F10.abi-gate","i-lucide-git-compare",{"title":108,"icon":109,"path":110,"stem":111,"children":112},"iOS","i-simple-icons-apple","\u002Fios","4.ios",[113,115,120,125,129,133],{"title":108,"path":110,"stem":114,"icon":109},"4.ios\u002Findex",{"title":116,"path":117,"stem":118,"icon":119},"iOS面试题1","\u002Fios\u002Fios-interview1","4.ios\u002F01.ios-interview1","i-lucide-sparkles",{"title":121,"path":122,"stem":123,"icon":124},"设置启动图","\u002Fios\u002Fset-launch-screen","4.ios\u002F02.set-launch-screen","i-lucide-image",{"title":126,"path":127,"stem":128,"icon":48},"路由管理","\u002Fios\u002Frouting","4.ios\u002F03.routing",{"title":130,"path":131,"stem":132,"icon":91},"状态管理","\u002Fios\u002Fstate-management","4.ios\u002F04.state-management",{"title":134,"path":135,"stem":136,"icon":137},"事件传递","\u002Fios\u002Fevent-delivery","4.ios\u002F05.event-delivery","i-lucide-pointer",{"title":139,"path":140,"stem":141,"children":142,"icon":144},"Flutter","\u002Fflutter","5.flutter\u002Findex",[143],{"title":139,"path":140,"stem":141,"icon":144},"i-simple-icons-flutter",{"title":146,"icon":147,"path":148,"stem":149,"children":150,"page":160},"面试","i-lucide-graduation-cap","\u002Finterview","6.interview",[151,156],{"title":152,"path":153,"stem":154,"icon":155},"Flutter面试题1","\u002Finterview\u002Fflutter-interview1","6.interview\u002F01.flutter-interview1","i-lucide-boxes",{"title":157,"path":158,"stem":159,"icon":66},"Flutter面试题2","\u002Finterview\u002Fflutter-interview2","6.interview\u002F02.flutter-interview2",false,{"title":162,"icon":163,"path":164,"stem":165,"children":166},"算法学习","i-lucide-binary","\u002Falgorithm","7.algorithm",[167,169],{"title":162,"path":164,"stem":168,"icon":163},"7.algorithm\u002Findex",{"title":170,"path":171,"stem":172},"算法基础1：复杂度分析","\u002Falgorithm\u002Ftime-space-complexity","7.algorithm\u002F01.time-space-complexity",{"id":174,"title":157,"body":175,"description":674,"extension":675,"links":676,"meta":678,"navigation":685,"path":158,"seo":686,"stem":159,"__hash__":689},"docs\u002F6.interview\u002F02.flutter-interview2.md",{"type":176,"value":177,"toc":662},"minimark",[178,187,191,214,262,270,274,317,328,332,362,368,371,375,422,425,428,431,440,479,482,485,491,530,571,577,581,584,604,608,612,615,632,659],[179,180,181,182,186],"p",{},"和 ",[183,184,185],"a",{"href":153},"高频面试题 1"," 重叠的概念，这里只写引擎 \u002F 工程视角。",[188,189,190],"h2",{"id":190},"一帧怎么上屏",[192,193,194,202,208],"ul",{},[195,196,197,201],"li",{},[198,199,200],"strong",{},"三棵树："," Widget 是配置，Element 是实例，RenderObject 做布局和绘制指令。",[195,203,204,207],{},[198,205,206],{},"一帧："," build → layout → paint（只记指令）→ composite → raster 上屏。",[195,209,210,213],{},[198,211,212],{},"和原生差别："," Flutter 默认自绘。PlatformView 是例外。",[215,216,217,232],"table",{},[218,219,220],"thead",{},[221,222,223,226,229],"tr",{},[224,225],"th",{},[224,227,228],{},"布局 \u002F 绘制",[224,230,231],{},"合成 \u002F GPU",[233,234,235,247],"tbody",{},[221,236,237,241,244],{},[238,239,240],"td",{},"对应",[238,242,243],{},"DevTools UI 条",[238,245,246],{},"Raster 条",[221,248,249,252,255],{},[238,250,251],{},"贵在",[238,253,254],{},"树深、build 范围大",[238,256,257,261],{},[258,259,260],"code",{},"saveLayer","、大图、离屏",[263,264,265,266,269],"note",{},"面试点：Widget → Element → RenderObject → Layer → GPU。",[258,267,268],{},"paint"," 不等于已经上屏。",[188,271,273],{"id":272},"vsync-和-schedulerbinding","vsync 和 SchedulerBinding",[192,275,276,282,300],{},[195,277,278,281],{},[198,279,280],{},"vsync："," 对齐刷新。60Hz 约 16.6ms，超时掉帧。",[195,283,284,287,288,291,292,295,296,299],{},[198,285,286],{},"调度："," 动画用 ",[258,289,290],{},"Ticker","；画帧走 ",[258,293,294],{},"drawFrame","；量尺寸用 ",[258,297,298],{},"addPostFrameCallback","。",[195,301,302,309,310,313,314,299],{},[198,303,304,305,308],{},"别用 ",[258,306,307],{},"Timer"," 做动画："," 对不齐刷新。跟的是屏，类似 ",[258,311,312],{},"CADisplayLink"," \u002F ",[258,315,316],{},"Choreographer",[263,318,319,320,323,324,327],{},"面试点：不要在 ",[258,321,322],{},"build"," 里量 size，用 ",[258,325,326],{},"LayoutBuilder"," 或帧后再读。",[188,329,331],{"id":330},"ui-isolate-和引擎线程","UI Isolate 和引擎线程",[192,333,334,344,350,356],{},[195,335,336,339,340,343],{},[198,337,338],{},"UI Isolate："," Widget、",[258,341,342],{},"setState","、业务、Channel 的 Dart 回调",[195,345,346,349],{},[198,347,348],{},"Platform："," Activity \u002F AppDelegate、plugin",[195,351,352,355],{},[198,353,354],{},"IO："," 网络、部分解码",[195,357,358,361],{},[198,359,360],{},"Raster："," Layer → 像素（旧称 GPU 线程）",[179,363,364,367],{},[258,365,366],{},"Isolate.run"," 是再开一个 Dart 堆，不是 Raster。DevTools：UI 条长查 Dart，Raster 条长查绘制。",[263,369,370],{},"面试点：卡 UI 和卡 GPU 不是同一根条。",[188,372,374],{"id":373},"三种-channel","三种 Channel",[215,376,377,392],{},[218,378,379],{},[221,380,381,383,386,389],{},[224,382],{},[224,384,385],{},"MethodChannel",[224,387,388],{},"EventChannel",[224,390,391],{},"BasicMessageChannel",[233,393,394,408],{},[221,395,396,399,402,405],{},[238,397,398],{},"语义",[238,400,401],{},"一次问一次答",[238,403,404],{},"持续推流",[238,406,407],{},"双向消息",[221,409,410,413,416,419],{},[238,411,412],{},"典型",[238,414,415],{},"支付、权限",[238,417,418],{},"传感器",[238,420,421],{},"自定义协议",[179,423,424],{},"Pigeon 不是第四种通道，只是给 Method 这类 RPC 生成类型。大图传路径或纹理 id，别传像素。",[263,426,427],{},"面试点：先选语义，再说 codec。都要过主线程和序列化。",[188,429,430],{"id":430},"卡顿怎么分层",[179,432,433,434,181,437,439],{},"先看 DevTools 的 ",[198,435,436],{},"UI 条",[198,438,246],{},"，没分层不谈优化。",[192,441,442,458,470],{},[195,443,444,447,448,450,451,454,455],{},[198,445,446],{},"UI 长："," ",[258,449,342],{}," 太高、列表没 ",[258,452,453],{},"builder","、layout 太深、",[258,456,457],{},"Intrinsic*",[195,459,460,447,463,466,467,469],{},[198,461,462],{},"Raster 长：",[258,464,465],{},"Opacity","、裁剪、阴影、",[258,468,260],{},"、超大图",[195,471,472,478],{},[198,473,474,477],{},[258,475,476],{},"RepaintBoundary","："," 重绘确实局部才加，不是万能的",[263,480,481],{},"面试点：profile 下看。FPS 是平均数，jank 是单帧超没超预算。",[188,483,484],{"id":484},"热重载保什么",[179,486,487,488,490],{},"定义见 ",[183,489,185],{"href":153},"。这里只记状态。",[192,492,493,509,524],{},[195,494,495,498,499,501,502,505,506,299],{},[198,496,497],{},"能保："," 改 ",[258,500,322],{},"、改方法体。",[258,503,504],{},"runtimeType"," + Key 对得上就复用 ",[258,507,508],{},"State",[195,510,511,447,514,313,517,313,520,523],{},[198,512,513],{},"保不住：",[258,515,516],{},"initState",[258,518,519],{},"main",[258,521,522],{},"static","、类型变化、原生代码。",[195,525,526,529],{},[198,527,528],{},"改了没变："," 先怀疑旧 State，不是框架坏了。",[215,531,532,544],{},[218,533,534],{},[221,535,536,538,541],{},[224,537],{},[224,539,540],{},"热重载",[224,542,543],{},"热重启",[233,545,546,560],{},[221,547,548,551,554],{},[238,549,550],{},"状态",[238,552,553],{},"尽量保 Element \u002F State",[238,555,556,557],{},"清空，重跑 ",[258,558,559],{},"main()",[221,561,562,565,568],{},[238,563,564],{},"何时",[238,566,567],{},"UI、方法体",[238,569,570],{},"入口、类型、全局",[263,572,573,574,576],{},"面试点：",[258,575,516],{}," 不重走，改初始化必须热重启。",[188,578,580],{"id":579},"platformview","PlatformView",[179,582,583],{},"原生视图嵌进 Flutter，合成更贵。WebView、地图、播放器才值得嵌。",[192,585,586,592,598],{},[195,587,588,591],{},[198,589,590],{},"页面级","（FlutterBoost）：整页是 Flutter 还是原生",[195,593,594,597],{},[198,595,596],{},"组件级","（PlatformView）：一页里嵌一块",[195,599,600,603],{},[198,601,602],{},"坑："," 手势、圆角、透明 → 花屏、穿透",[605,606,607],"warning",{},"能用 Flutter 画的就不要嵌。别把混合栈和 PlatformView 说成一件事。",[188,609,611],{"id":610},"启动慢包体积大","启动慢、包体积大",[179,613,614],{},"两条线，别混。",[192,616,617,626],{},[195,618,619,622,623,299],{},[198,620,621],{},"启动："," 先问慢在闪屏、首帧，还是首屏数据。别等网络才 ",[258,624,625],{},"runApp",[195,627,628,631],{},[198,629,630],{},"体积："," 先问是 debug 还是 release、几个 ABI。只比 release。",[215,633,634,646],{},[218,635,636],{},[221,637,638,640,643],{},[224,639],{},[224,641,642],{},"启动",[224,644,645],{},"体积",[233,647,648],{},[221,649,650,653,656],{},[238,651,652],{},"先砍",[238,654,655],{},"过早初始化、首屏等网络",[238,657,658],{},"多 ABI、原图、全量字体、符号",[263,660,661],{},"面试点：冷 \u002F 热启动分开说。Debug 包不进对比。",{"title":663,"searchDepth":664,"depth":664,"links":665},"",2,[666,667,668,669,670,671,672,673],{"id":190,"depth":664,"text":190},{"id":272,"depth":664,"text":273},{"id":330,"depth":664,"text":331},{"id":373,"depth":664,"text":374},{"id":430,"depth":664,"text":430},{"id":484,"depth":664,"text":484},{"id":579,"depth":664,"text":580},{"id":610,"depth":664,"text":611},"渲染管线、引擎线程、Channel、卡顿、混合栈与启动体积。","md",[677],{"label":185,"icon":155,"to":153},{"date":679,"categories":680,"tags":683},"2026-09-09",[681,682],"interview","flutter",[139,146,684],"性能",{"icon":66},{"title":687,"description":688},"高频面试题 2","Flutter 原理与工程题：一帧上屏、线程、Channel、卡顿、热重载边界、PlatformView、启动与体积。","QFTdRI7l9XWRggLGm2nvluQjnYQFC2jQbEb92QEQk40",[691,693],{"title":152,"path":153,"stem":154,"description":692,"icon":155,"children":-1},"事件循环、Future \u002F Stream、Isolate、热重载与 JIT \u002F AOT。",{"title":162,"path":164,"stem":168,"description":694,"icon":163,"children":-1},"数据结构、复杂度与经典题的学习笔记。",1790767048229]