[{"data":1,"prerenderedAt":805},["ShallowReactive",2],{"navigation_docs":3,"-android-hidden-hardening-flag-secure":173,"-android-hidden-hardening-flag-secure-surround":800},[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":98,"body":175,"description":784,"extension":785,"links":786,"meta":789,"navigation":795,"path":99,"seo":796,"stem":100,"__hash__":799},"docs\u002F3.android\u002F02.hidden-hardening\u002F09.flag-secure.md",{"type":176,"value":177,"toc":778},"minimark",[178,187,191,196,207,303,315,472,487,490,496,661,678,692,698,701,751,754,757,774],[179,180,181,182,186],"p",{},"代码放入加密 dex 之后，屏幕上的来电页、落地页和全屏广告仍能被截屏或录屏。工程用系统窗口标志 ",[183,184,185],"code",{},"FLAG_SECURE"," 处理这一层：截屏失败或得到黑图，录屏画面为全黑，多任务缩略图也会被抹掉。",[188,189,190],"note",{},"这不是 DEX 加固，是窗口级隐私保护。不需要 Manifest 权限，也不影响点击。",[192,193,195],"h2",{"id":194},"通过-sdk-指令调用","通过 SDK 指令调用",[179,197,198,199,202,203,206],{},"接入文档约定 ",[183,200,201],{},"invoke(13, activity)","。实现位于加密 dex 的 ",[183,204,205],{},"applyScreenProtection","：",[208,209,215],"pre",{"className":210,"code":211,"filename":212,"language":213,"meta":214,"style":214},"language-kotlin shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","fun applyScreenProtection(activity: Activity, enable: Boolean) {\n    if (enable) {\n        activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)\n    } else {\n        activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)\n    }\n}\n","hidden-landing-page\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fminidex\u002Fhidden\u002FHiddenLandingPageController.kt","kotlin","",[183,216,217,247,257,269,281,291,297],{"__ignoreMap":214},[218,219,222,226,230,234,238,241,244],"span",{"class":220,"line":221},"line",1,[218,223,225],{"class":224},"sMK4o","fun",[218,227,229],{"class":228},"s2Zo4"," applyScreenProtection",[218,231,233],{"class":232},"sTEyZ","(activity: ",[218,235,237],{"class":236},"sBMFI","Activity",[218,239,240],{"class":232},", enable: ",[218,242,243],{"class":236},"Boolean",[218,245,246],{"class":232},") {\n",[218,248,250,254],{"class":220,"line":249},2,[218,251,253],{"class":252},"s7zQu","    if",[218,255,256],{"class":232}," (enable) {\n",[218,258,260,263,266],{"class":220,"line":259},3,[218,261,262],{"class":232},"        activity.window.",[218,264,265],{"class":228},"addFlags",[218,267,268],{"class":232},"(WindowManager.LayoutParams.FLAG_SECURE)\n",[218,270,272,275,278],{"class":220,"line":271},4,[218,273,274],{"class":232},"    } ",[218,276,277],{"class":252},"else",[218,279,280],{"class":232}," {\n",[218,282,284,286,289],{"class":220,"line":283},5,[218,285,262],{"class":232},[218,287,288],{"class":228},"clearFlags",[218,290,268],{"class":232},[218,292,294],{"class":220,"line":293},6,[218,295,296],{"class":232},"    }\n",[218,298,300],{"class":220,"line":299},7,[218,301,302],{"class":232},"}\n",[179,304,305,306,310,311,314],{},"关键点是：",[307,308,309],"strong",{},"未 init 也会加标志","。",[183,312,313],{},"HiddenSdk.fallback"," 在 native 尚未 ready 时会自行操作 window，避免密钥错误后来电页反而能被截屏。",[208,316,319],{"className":210,"code":317,"filename":318,"language":213,"meta":214,"style":214},"13 -> {\n    val activity = a as? Activity\n    if (activity != null) {\n        val enable = when (b) {\n            is Boolean -> b\n            else -> true\n        }\n        if (enable) {\n            activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)\n        } else {\n            activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)\n        }\n    }\n    null\n}\n","hidden-sdk\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fminidex\u002Fsdk\u002FHiddenSdk.kt",[183,320,321,333,353,368,384,398,409,414,422,432,442,451,456,461,467],{"__ignoreMap":214},[218,322,323,327,331],{"class":220,"line":221},[218,324,326],{"class":325},"sbssI","13",[218,328,330],{"class":329},"spNyl"," ->",[218,332,280],{"class":232},[218,334,335,338,341,344,347,350],{"class":220,"line":249},[218,336,337],{"class":224},"    val",[218,339,340],{"class":232}," activity ",[218,342,343],{"class":224},"=",[218,345,346],{"class":232}," a ",[218,348,349],{"class":224},"as",[218,351,352],{"class":232},"? Activity\n",[218,354,355,357,360,363,366],{"class":220,"line":259},[218,356,253],{"class":252},[218,358,359],{"class":232}," (activity ",[218,361,362],{"class":224},"!=",[218,364,365],{"class":224}," null",[218,367,246],{"class":232},[218,369,370,373,376,378,381],{"class":220,"line":271},[218,371,372],{"class":224},"        val",[218,374,375],{"class":232}," enable ",[218,377,343],{"class":224},[218,379,380],{"class":252}," when",[218,382,383],{"class":232}," (b) {\n",[218,385,386,389,392,395],{"class":220,"line":283},[218,387,388],{"class":224},"            is",[218,390,391],{"class":232}," Boolean ",[218,393,394],{"class":329},"->",[218,396,397],{"class":232}," b\n",[218,399,400,403,405],{"class":220,"line":293},[218,401,402],{"class":252},"            else",[218,404,330],{"class":329},[218,406,408],{"class":407},"sfNiH"," true\n",[218,410,411],{"class":220,"line":299},[218,412,413],{"class":232},"        }\n",[218,415,417,420],{"class":220,"line":416},8,[218,418,419],{"class":252},"        if",[218,421,256],{"class":232},[218,423,425,428,430],{"class":220,"line":424},9,[218,426,427],{"class":232},"            activity.window.",[218,429,265],{"class":228},[218,431,268],{"class":232},[218,433,435,438,440],{"class":220,"line":434},10,[218,436,437],{"class":232},"        } ",[218,439,277],{"class":252},[218,441,280],{"class":232},[218,443,445,447,449],{"class":220,"line":444},11,[218,446,427],{"class":232},[218,448,288],{"class":228},[218,450,268],{"class":232},[218,452,454],{"class":220,"line":453},12,[218,455,413],{"class":232},[218,457,459],{"class":220,"line":458},13,[218,460,296],{"class":232},[218,462,464],{"class":220,"line":463},14,[218,465,466],{"class":224},"    null\n",[218,468,470],{"class":220,"line":469},15,[218,471,302],{"class":232},[179,473,474,475,478,479,482,483,486],{},"Demo 宿主在来电路由页和落地页的 ",[183,476,477],{},"onCreate"," 里调用 ",[183,480,481],{},"HiddenSdk.invoke(13, this)","（或 ",[183,484,485],{},"HostBridge.protect","）。",[192,488,489],{"id":489},"保护全屏广告",[179,491,492,495],{},[183,493,494],{},":ads"," 不走 HiddenSdk，自己按 Activity 类名判断：",[208,497,500],{"className":210,"code":498,"filename":499,"language":213,"meta":214,"style":214},"fun isAdRelatedActivity(className: String): Boolean {\n    return className.contains(\"com.google.android.gms.ads\") ||\n        className.contains(\"AdActivity\") ||\n        className.contains(\"AdLandingActivity\") ||\n        className.contains(\"com.google.android.libraries.ads\")\n}\n\nfun applyScreenProtection(activity: Activity, enable: Boolean = true) {\n    if (enable) {\n        activity.window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)\n    } else {\n        activity.window.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)\n    }\n}\n","ads\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002Fminidex\u002Fads\u002Finternal\u002FAdScreenProtection.kt",[183,501,502,522,546,562,577,591,595,601,623,629,637,645,653,657],{"__ignoreMap":214},[218,503,504,506,509,512,515,518,520],{"class":220,"line":221},[218,505,225],{"class":224},[218,507,508],{"class":228}," isAdRelatedActivity",[218,510,511],{"class":232},"(className: ",[218,513,514],{"class":236},"String",[218,516,517],{"class":232},"): ",[218,519,243],{"class":236},[218,521,280],{"class":232},[218,523,524,527,530,533,536,540,543],{"class":220,"line":249},[218,525,526],{"class":252},"    return",[218,528,529],{"class":232}," className.",[218,531,532],{"class":228},"contains",[218,534,535],{"class":232},"(",[218,537,539],{"class":538},"sfazB","\"com.google.android.gms.ads\"",[218,541,542],{"class":232},") ",[218,544,545],{"class":224},"||\n",[218,547,548,551,553,555,558,560],{"class":220,"line":259},[218,549,550],{"class":232},"        className.",[218,552,532],{"class":228},[218,554,535],{"class":232},[218,556,557],{"class":538},"\"AdActivity\"",[218,559,542],{"class":232},[218,561,545],{"class":224},[218,563,564,566,568,570,573,575],{"class":220,"line":271},[218,565,550],{"class":232},[218,567,532],{"class":228},[218,569,535],{"class":232},[218,571,572],{"class":538},"\"AdLandingActivity\"",[218,574,542],{"class":232},[218,576,545],{"class":224},[218,578,579,581,583,585,588],{"class":220,"line":283},[218,580,550],{"class":232},[218,582,532],{"class":228},[218,584,535],{"class":232},[218,586,587],{"class":538},"\"com.google.android.libraries.ads\"",[218,589,590],{"class":232},")\n",[218,592,593],{"class":220,"line":293},[218,594,302],{"class":232},[218,596,597],{"class":220,"line":299},[218,598,600],{"emptyLinePlaceholder":599},true,"\n",[218,602,603,605,607,609,611,613,615,618,621],{"class":220,"line":416},[218,604,225],{"class":224},[218,606,229],{"class":228},[218,608,233],{"class":232},[218,610,237],{"class":236},[218,612,240],{"class":232},[218,614,243],{"class":236},[218,616,617],{"class":224}," =",[218,619,620],{"class":407}," true",[218,622,246],{"class":232},[218,624,625,627],{"class":220,"line":424},[218,626,253],{"class":252},[218,628,256],{"class":232},[218,630,631,633,635],{"class":220,"line":434},[218,632,262],{"class":232},[218,634,265],{"class":228},[218,636,268],{"class":232},[218,638,639,641,643],{"class":220,"line":444},[218,640,274],{"class":232},[218,642,277],{"class":252},[218,644,280],{"class":232},[218,646,647,649,651],{"class":220,"line":453},[218,648,262],{"class":232},[218,650,288],{"class":228},[218,652,268],{"class":232},[218,654,655],{"class":220,"line":458},[218,656,296],{"class":232},[218,658,659],{"class":220,"line":463},[218,660,302],{"class":232},[179,662,663,666,667,670,671,670,674,677],{},[183,664,665],{},"init(application)"," 注册生命周期回调，在 ",[183,668,669],{},"created","、",[183,672,673],{},"started",[183,675,676],{},"resumed"," 时重复施加。AdMob 全屏页由 SDK 自行启动，宿主清单里没有类名，只能按包名匹配。",[179,679,680,681,684,685,688,689,310],{},"可用 ",[183,682,683],{},"AdConfig.enableScreenProtection"," 关掉。落地页 ",[183,686,687],{},"AdLandingActivity"," 也会再调用一次 ",[183,690,691],{},"AdSdk.applyScreenProtection(this)",[693,694,695,697],"warning",{},[183,696,185],{}," 阻止的是系统截屏、录屏和 Recents 缩略图。它不能阻止 HDMI、定制 ROM 或已 root 设备上的帧缓冲抓取。",[192,699,700],{"id":700},"对照两套入口",[702,703,704,720],"table",{},[705,706,707],"thead",{},[708,709,710,714,717],"tr",{},[711,712,713],"th",{},"场景",[711,715,716],{},"入口",[711,718,719],{},"未初始化",[721,722,723,737],"tbody",{},[708,724,725,729,734],{},[726,727,728],"td",{},"来电 \u002F 落地页",[726,730,731],{},[183,732,733],{},"HiddenSdk.invoke(13, activity)",[726,735,736],{},"fallback 仍加标志",[708,738,739,742,748],{},[726,740,741],{},"全屏广告",[726,743,744,747],{},[183,745,746],{},"AdScreenProtection"," 生命周期",[726,749,750],{},"与 HiddenSdk 无关",[179,752,753],{},"两套实现都是同一条系统 API，故意不抽成公共模块，避免广告模块 compile 依赖 hidden-sdk。",[192,755,756],{"id":756},"下一步",[758,759,760,768],"ul",{},[761,762,763,767],"li",{},[764,765,766],"a",{"href":74},"指令分发","：op 13 在表里的位置",[761,769,770,773],{},[764,771,772],{"href":52},"总览","：回到十种方式",[775,776,777],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":214,"searchDepth":249,"depth":249,"links":779},[780,781,782,783],{"id":194,"depth":249,"text":195},{"id":489,"depth":249,"text":489},{"id":700,"depth":249,"text":700},{"id":756,"depth":249,"text":756},"来电页、落地页、全屏广告使用 FLAG_SECURE。截屏与录屏得到黑屏，无需额外权限。","md",[787,788],{"label":73,"icon":76,"to":74},{"label":56,"icon":57,"to":52},{"date":790,"categories":791,"tags":793},"2026-09-21",[792],"android",[37,185,794],"隐私",{"icon":101},{"title":797,"description":798},"安卓代码加固（9）：用 FLAG_SECURE 做防录屏与防截屏","hidden-dex-minidemo 通过 HiddenSdk.invoke(13) 和广告模块的 Activity 生命周期回调，给敏感页加上 WindowManager.FLAG_SECURE。","yuXUuQxVNfAC8cSaAYYMz5GiCmDXT7BXs6NvaXF_uVA",[801,803],{"title":93,"path":94,"stem":95,"description":802,"icon":96,"children":-1},"assemble 之后检查 AAR \u002F APK：无明文 HiddenLandingPage，有 HDX1 payload 和 so。",{"title":103,"path":104,"stem":105,"description":804,"icon":106,"children":-1},"so 与加密实现约定整数版本 12。对不上就拒绝加载，避免新旧 AAR 错位。",1790767046824]