[{"data":1,"prerenderedAt":364},["ShallowReactive",2],{"navigation_docs":3,"articles-all":173},[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",[174,184,193,196,199,202,209,218,224,230,236,242,249,256,262,269,275,282,285,293,299,306,313,321,324,327,334,340,348,355,361],{"title":13,"path":14,"description":175,"stem":15,"meta":176},"现在新建项目默认已经是 SwiftUI，但我还是习惯用 UIKit，所以把步骤记在这里。",{"date":177,"categories":178,"tags":180},"2026-06-03",[179],"ios",[108,181,182,183],"UIKit","Swift","Xcode",{"title":18,"path":19,"description":185,"stem":20,"meta":186},"一款纯本地的密码保存应用。数据只写在当前设备上，不设账号、不上云、不收集使用数据。",{"date":187,"categories":188,"tags":190},"2026-09-28",[189],"flutter",[139,191,192],"Lockify","本地存储",{"title":5,"path":7,"description":194,"stem":11,"meta":195},"开发笔记、教程与随笔。",{},{"title":23,"path":24,"description":197,"stem":25,"meta":198},"每年总结一下，为了放心去忘记。",{},{"title":30,"path":31,"description":200,"stem":32,"meta":201},"记下路上遇见的人与事。",{},{"title":45,"path":46,"description":203,"stem":47,"meta":204},"从依赖、类型安全路由到 NavHost、跳转、读参、返回栈与深层链接，按任务顺序在 Jetpack Compose 中接入 Navigation。",{"date":205,"tags":206},"2026-08-31",[207,208],"Compose","Navigation",{"title":59,"path":60,"description":210,"stem":61,"meta":211},"构建期把 :hidden-landing-page 打成 AES-256-GCM 密文，以 HDX1 头写入 AAR assets。",{"date":212,"categories":213,"tags":215},"2026-09-21",[214],"android",[37,216,217],"AES-GCM","DEX",{"title":63,"path":64,"description":219,"stem":65,"meta":220},"libhiddendecrypt.so 自实现 AES-256-GCM。Java 不接触明文 DEX，用完立刻清零。",{"date":212,"categories":221,"tags":222},[214],[37,223,216],"JNI",{"title":68,"path":69,"description":225,"stem":70,"meta":226},"解密后的 dex 只存在于 ByteBuffer 中，用 InMemoryDexClassLoader 加载，不写入 filesDir。",{"date":212,"categories":227,"tags":228},[214],[37,229,217],"ClassLoader",{"title":73,"path":74,"description":231,"stem":75,"meta":232},"公开入口只有 invoke(Int, Any?, Any?)。指令含义不进入 AAR，native 按整数查找方法。",{"date":212,"categories":233,"tags":234},[214],[37,223,235],"API",{"title":78,"path":79,"description":237,"stem":80,"meta":238},"so 里的资源路径、实现类名、方法名按 0x5A 异或存放，用完立即清零。",{"date":212,"categories":239,"tags":240},[214],[37,223,241],"混淆",{"title":83,"path":84,"description":243,"stem":85,"meta":244},"SDK \u002F AAR 不带 AES 密钥。CI 用环境变量，本地 debug 用 gitignore 文件。",{"date":212,"categories":245,"tags":246},[214],[37,247,248],"密钥","CI",{"title":88,"path":89,"description":250,"stem":90,"meta":251},"宿主只 implementation hidden-sdk。landing-page 对 SDK 必须 compileOnly，明文 class 不准进入 APK。",{"date":212,"categories":252,"tags":253},[214],[37,254,255],"Gradle","模块",{"title":93,"path":94,"description":257,"stem":95,"meta":258},"assemble 之后检查 AAR \u002F APK：无明文 HiddenLandingPage，有 HDX1 payload 和 so。",{"date":212,"categories":259,"tags":260},[214],[37,254,261],"校验",{"title":98,"path":99,"description":263,"stem":100,"meta":264},"来电页、落地页、全屏广告使用 FLAG_SECURE。截屏与录屏得到黑屏，无需额外权限。",{"date":212,"categories":265,"tags":266},[214],[37,267,268],"FLAG_SECURE","隐私",{"title":103,"path":104,"description":270,"stem":105,"meta":271},"so 与加密实现约定整数版本 12。对不上就拒绝加载，避免新旧 AAR 错位。",{"date":212,"categories":272,"tags":273},[214],[37,274,223],"ABI",{"title":56,"path":52,"description":276,"stem":53,"meta":277},"hidden-dex-minidemo 把业务实现编成加密 DEX。运行时由 so 解密后在内存里加载。主 DEX 只保留公开接口。",{"date":212,"categories":278,"tags":279},[214],[37,280,281],"HiddenDEX","加固",{"title":37,"path":39,"description":283,"stem":43,"meta":284},"Android 开发实践与笔记。",{},{"title":116,"path":117,"description":286,"stem":118,"meta":287},"先记 Swift 闭包：本质与 copy、变量捕获、循环引用，以及和 Delegate、通知怎么选。",{"date":288,"categories":289,"tags":291},"2026-09-17",[290,179],"interview",[108,146,182,292],"闭包",{"title":121,"path":122,"description":294,"stem":123,"meta":295},"在 Xcode 16 里给 UIKit 项目换启动图。Info 里的 UILaunchScreen 和 LaunchScreen.storyboard 都能做纯色背景、居中 Logo 或整张铺满。",{"date":187,"categories":296,"tags":297},[179],[108,181,183,298],"启动图",{"title":126,"path":127,"description":300,"stem":128,"meta":301},"UIKit 用导航控制器上的页面栈管跳转，SwiftUI 用 NavigationStack 的 path 管跳转。两边都收成一个 Router，目的地用枚举。",{"date":187,"categories":302,"tags":303},[179],[108,181,304,305],"SwiftUI","路由",{"title":130,"path":131,"description":307,"stem":132,"meta":308},"SwiftUI 按所有权从 @State 排到 environment。UIKit 改完模型，再在一处写进控件。页面变大之后用 MVVM 或单向数据流。Combine、RxSwift、ReactorKit、TCA 负责把变化送出去。",{"date":309,"categories":310,"tags":311},"2026-09-30",[179],[108,304,181,130,312],"MVVM",{"title":314,"path":135,"description":315,"stem":136,"meta":316},"浅谈 iOS 事件的传递和响应过程","传递和响应分开记。传递用图看 hitTest 怎么从窗口找到一个视图，响应用图看消息怎么沿 next 向上。",{"date":309,"categories":317,"tags":318},[179],[108,181,319,320],"事件","响应链",{"title":108,"path":110,"description":322,"stem":114,"meta":323},"iOS 开发实践与笔记。",{},{"title":139,"path":140,"description":325,"stem":141,"meta":326},"Flutter 开发实践与笔记。",{},{"title":152,"path":153,"description":328,"stem":154,"meta":329},"事件循环、Future \u002F Stream、Isolate、热重载与 JIT \u002F AOT。",{"date":330,"categories":331,"tags":332},"2026-09-09",[290,189],[139,146,333],"Dart",{"title":157,"path":158,"description":335,"stem":159,"meta":336},"渲染管线、引擎线程、Channel、卡顿、混合栈与启动体积。",{"date":330,"categories":337,"tags":338},[290,189],[139,146,339],"性能",{"title":170,"path":171,"description":341,"stem":172,"meta":342},"有句话说的好：复杂度分析是数据结构和算法中最重要的知识点，毫不夸张的说，这就是数据结构与算法学习的核心所在。你学会了它你就入的了门，你学不会它，你就永远不知道门儿在哪。",{"date":343,"categories":344,"tags":346},"2026-09-23",[345],"algorithm",[347],"算法",{"title":349,"path":350,"description":349,"stem":351,"meta":352},"","\u002Falgorithm\u002Flinear-structures","7.algorithm\u002F02.linear-structures",{"date":343,"publish":160,"categories":353,"tags":354},[345],[347],{"title":349,"path":356,"description":349,"stem":357,"meta":358},"\u002Falgorithm\u002Frecursion","7.algorithm\u002F03.recursion",{"date":343,"publish":160,"categories":359,"tags":360},[345],[347],{"title":162,"path":164,"description":362,"stem":168,"meta":363},"数据结构、复杂度与经典题的学习笔记。",{},1790767042652]