亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線(xiàn)實(shí)戰(zhàn)洞察。

鴻蒙Flutter插件適配實(shí)戰(zhàn):為sanitize_filename補(bǔ)齊FusedPlugin通道

鴻蒙Flutter插件適配實(shí)戰(zhàn):為sanitize_filename補(bǔ)齊FusedPlugin通道 1. 項(xiàng)目背景與適配目標(biāo)1.1 為什么一個(gè)純 Dart 三庫(kù)也需要做鴻蒙化適配先把這個(gè)項(xiàng)目的基本盤(pán)講清楚。sanitize_filename 這個(gè)庫(kù)名字直譯就是“清洗文件名”它的用途很簡(jiǎn)單當(dāng)你需要把用戶(hù)隨意輸入的字符串變成合法文件名時(shí)它負(fù)責(zé)把 Windows、macOS、Linux 以及 Android 上那些不能用于文件名的字符統(tǒng)一替換掉順便還能處理保留設(shè)備名、長(zhǎng)度超限這些邊界問(wèn)題。如果你沒(méi)用過(guò)這個(gè)庫(kù)我給你打個(gè)比方。用戶(hù)在 App 里上傳附件傻乎乎地填了一個(gè)文件夾名字“report/2024/final”在 Windows 上這道斜杠直接就是路徑分隔符你拿去存文件輕則目錄結(jié)構(gòu)被破壞重則直接被惡意文件路徑利用。sanitize_filename 會(huì)把“/”和“\”都替換成下劃線(xiàn)輸出“report_2024_final”保證跨平臺(tái)文件系統(tǒng)都能安全落地。問(wèn)題在于鴻蒙系統(tǒng)在 Flutter 生態(tài)里是個(gè)新平臺(tái)。sanitize_filename 的內(nèi)部實(shí)現(xiàn)走的是標(biāo)準(zhǔn) MethodChannel在 Android 上由 Java 原生層完成“系統(tǒng)級(jí)清洗”在 Linux 上則由 C 層做同樣的事??渗櫭傻?Flutter SDK 在當(dāng)初發(fā)布時(shí)對(duì)第三方插件的原生注冊(cè)機(jī)制和標(biāo)準(zhǔn) Flutter 并不完全一樣——簡(jiǎn)單說(shuō)你的 Dart 端調(diào)用 MethodChannel原生端如果不注冊(cè)直接給你扔一個(gè) MissingPluginException 出來(lái)。所以這個(gè)項(xiàng)目的本質(zhì)不是“寫(xiě)一個(gè)庫(kù)”而是“把一個(gè)依賴(lài)原生通道的三方庫(kù)嫁接到鴻蒙的插件體系里”。我做這件事的時(shí)候順便把文件名校驗(yàn)、路徑安全審計(jì)、跨端一致性這些后端需求一并整理了最終沉淀出這套可以直接復(fù)用的適配方案。1.2 這個(gè)方案適合誰(shuí)、能解決什么問(wèn)題如果你正處于下面幾種情況之一這篇指南會(huì)對(duì)你非常有用你的 Flutter 項(xiàng)目需要上架鴻蒙應(yīng)用市場(chǎng)代碼里直接或間接依賴(lài)了 sanitize_filename比如文件上傳組件、日記導(dǎo)出模塊、增量下載暫存目錄。你想在自己的鴻蒙 Flutter 插件里接入原生能力但對(duì)鴻蒙的插件注冊(cè)機(jī)制不熟悉。你在做跨 Android / iOS / HarmonyOS / Windows 四端統(tǒng)一文件名安全處理需要一套完整可落地的審計(jì)策略。這個(gè)適配方案最終做到的效果是不修改第三方庫(kù)的 Dart 源碼邏輯通過(guò)鴻蒙側(cè)注冊(cè)原生插件的方式把缺失的平臺(tái)通道補(bǔ)上同時(shí)提供一份純 Dart 的兜底清洗器確保哪怕原生端沒(méi)有注冊(cè)任何東西文件名清洗邏輯也不會(huì)崩。1.3 適配前必須理解的鴻蒙插件機(jī)制這里要花點(diǎn)篇幅講一個(gè)容易踩坑的背景知識(shí)。標(biāo)準(zhǔn) Flutter 框架里Android 插件的自動(dòng)注冊(cè)靠的是 GeneratedPluginRegistrant 在編譯期掃描所有 pubspec.yaml 里聲明的插件然后自動(dòng)把它們的注冊(cè)類(lèi)綁定起來(lái)。這套機(jī)制經(jīng)過(guò)了多年打磨所有插件開(kāi)發(fā)者都默認(rèn)可用。鴻蒙 Flutter SDK 早期版本在這塊做了自己的一套它不會(huì)自動(dòng)掃描 Dart Package 里聲明的 pluginClass需要你在 Module.json5 里顯式聲明插件、在工程里手動(dòng)注冊(cè)。更特別的是鴻蒙端的 FlutterPlugin 注冊(cè)是“Fused 模式”——一個(gè)插件實(shí)例可以同時(shí)監(jiān)聽(tīng)生命周期、MethodChannel 和 EventChannel。這意味著什么意味著你在 pubspec.yaml 里加了 sanitize_filename 依賴(lài)Dart 端跑起來(lái)看著正常但一調(diào)用清洗方法就崩潰。原生通道壓根沒(méi)人監(jiān)聽(tīng)Dart 端自然拿不到返回值。搞清楚這個(gè)差異后面每一步操作都是有的放矢的。2. 環(huán)境準(zhǔn)備與源碼級(jí)解剖2.1 搭建鴻蒙 Flutter 適配開(kāi)發(fā)環(huán)境我這次適配用的環(huán)境組合供你參考建議盡量對(duì)齊可以減少很多兼容性幺蛾子組件版本說(shuō)明HarmonyOS NEXT SDK5.0.0 (12)支持 FusedPlugin 完整 APIDevEco Studio5.0.2鴻蒙工程編譯調(diào)試入口Flutter SDK鴻蒙分支3.22.0-harmony-1官方 harmony 分支非普通 Flutter 版本Dart SDK3.4.0隨鴻蒙分支捆綁sanitize_filename2.0.0本次適配的第三方庫(kù)特別提醒千萬(wàn)別用普通 Flutter 穩(wěn)定版去建鴻蒙工程編到一半你會(huì)懷疑 DevEco 壞了其實(shí)是你 SDK 分支選錯(cuò)了。鴻蒙分支的 Flutter SDK 在 pub 上發(fā)布插件時(shí)會(huì)額外生成一個(gè) ohos 目錄只有這個(gè)分支才認(rèn)識(shí)它。2.2 通讀 sanitize_filename 的源碼看清它的通道設(shè)計(jì)拿到源碼之后別急著寫(xiě)適配先把它的實(shí)現(xiàn)細(xì)節(jié)讀透。我梳理一下它的核心工作流為了講清楚我把關(guān)鍵行為寫(xiě)在這里。sanitize_filename 對(duì)外暴露兩個(gè)主要接口sanitize(String fileName, {bool windows}) 清洗文件名。sanitizeFilepath(String filePath, {bool windows}) 清洗完整路徑保留路徑層級(jí)。它的內(nèi)部實(shí)現(xiàn)原文大致邏輯是先做基礎(chǔ)字符過(guò)濾把:/\|?*這些非法字符替換成下劃線(xiàn)。處理尾部的空格和點(diǎn)號(hào)因?yàn)檫@在 Windows 文件系統(tǒng)里是不被允許的。調(diào)用通道方法讓原生端再做一次“系統(tǒng)級(jí)清洗”比如 Windows 上會(huì)調(diào)用系統(tǒng)的PathCleanupSpecLinux 上會(huì)調(diào)fs.inode相關(guān)校驗(yàn)。這一步是本庫(kù)跨平臺(tái)的核心依賴(lài)。對(duì)長(zhǎng)度超限Windows 單段路徑 255 字節(jié)、保留設(shè)備名CON、PRN、AUX 等做額外處理。有一點(diǎn)很關(guān)鍵sanitize_filename 本身是純 Dart 邏輯與原生邏輯混合的。它不能完全靠自身完成跨平臺(tái)清洗因?yàn)椴煌僮飨到y(tǒng)對(duì)文件名的限制細(xì)節(jié)不同。所以鴻蒙適配的核心就是讓通道調(diào)用不再落空。把這段源碼反編譯級(jí)別的理解寫(xiě)下來(lái)是因?yàn)槟阒挥兄浪谀膫€(gè)環(huán)節(jié)崩潰才能判斷自己的適配到底補(bǔ)上了哪一個(gè)點(diǎn)。2.3 適配前檢查清單與決策矩陣動(dòng)手之前先對(duì)照下面的清單確認(rèn)你的項(xiàng)目該走哪條路場(chǎng)景推薦方案理由整個(gè) Flutter 工程只跑鴻蒙純 Dart 模擬實(shí)現(xiàn) FusedPlugin 注冊(cè)零原生依賴(lài)最穩(wěn)Flutter 工程需要四端一致保留原生通道 鴻蒙側(cè)補(bǔ)插件四端返回結(jié)果對(duì)齊不想碰原生代碼替換為 sanitize_filename 的 Dart 分支實(shí)現(xiàn)避開(kāi)通道問(wèn)題但可能丟失系統(tǒng)級(jí)精密過(guò)濾需要對(duì)接鴻蒙文件管理能力鴻蒙原生擴(kuò)展 Flutterbridge能拿到鴻蒙私有路徑限制規(guī)則我最終選擇的是“保留原生通道 鴻蒙側(cè)補(bǔ) FusedPlugin”的路線(xiàn)。原因很簡(jiǎn)單這樣才能保證同一個(gè) Dart 調(diào)用在 Android 和鴻蒙上返回一致的清洗結(jié)果不破壞上層業(yè)務(wù)對(duì) sanitize_filename 輸出結(jié)果的既有依賴(lài)。3. 鴻蒙化適配核心實(shí)操3.1 在 Module.json5 中聲明插件映射這是整個(gè)適配的第一道關(guān)口。鴻蒙工程拿到 Flutter 插件之后不會(huì)像 Android 那樣自動(dòng)生成注冊(cè)入口。你需要在鴻蒙模塊目錄下的oh-package.json5和Module.json5中進(jìn)行配置。我以自己工程的路徑為例鴻蒙模塊一般叫entry配置路徑為entry/src/main/ohos/module.json5核心片段如下{ module: { name: entry, type: entry, deviceTypes: [phone], package: com.example.sanitize_demo, // 關(guān)鍵聲明 FusedPlugin 的包名 fusedPlugins: [ { name: SanitizeFilenamePlugin, package: com.example.sanitize_plugin } ] } }這里的fusedPlugins數(shù)組就是告訴鴻蒙運(yùn)行時(shí)應(yīng)用啟動(dòng)后請(qǐng)加載com.example.sanitize_plugin包里的SanitizeFilenamePlugin這個(gè)類(lèi)。名字不要虛構(gòu)要和你在原生側(cè)寫(xiě)的類(lèi)名完全一致。漏了這一步你后面注冊(cè)了原生類(lèi)也白搭運(yùn)行時(shí)壓根不會(huì)加載它。3.2 在原生 OHOS 側(cè)實(shí)現(xiàn)注冊(cè)邏輯我在鴻蒙模塊下新建了一個(gè)插件實(shí)現(xiàn)文件路徑通常放在entry/src/main/ets/plugins/SanitizeFilenamePlugin.ets。代碼思路如下import { FusedPlugin, PluginRegistry } from flutter_sdk; import { MethodCall, MethodResult } from flutter_sdk; import { fileIo as fs } from kit.CoreFileKit; import { BusinessError } from kit.BasicServicesKit; import { hilog } from kit.PerformanceAnalysisKit; const DOMAIN 0x0001; const TAG SanitizeFilenamePlugin; export class SanitizeFilenamePlugin implements FusedPlugin { private channelName: string sanitize_filename; private engine: any null; // 插件生命周期attach 引擎 onAttach(engine: any): void { this.engine engine; hilog.info(DOMAIN, TAG, onAttach engine); this.registerMethodChannel(); } // 核心向引擎注冊(cè)方法通道 private registerMethodChannel(): void { const registry: PluginRegistry this.engine.getPluginRegistry(); const pluginInstance registry.getPluginInstance(SanitizeFilenamePlugin); pluginInstance.subscribeToMethodChannel(this.channelName, { onMethodCall: (call: MethodCall, result: MethodResult) { let method: string call.method; switch (method) { case sanitize: this.handleSanitize(call, result); break; case sanitizeFilepath: this.handleSanitizeFilepath(call, result); break; default: result.notImplemented(); break; } } }); } private handleSanitize(call: MethodCall, result: MethodResult): void { try { const fileName call.arguments as string; const cleaned this.cleanName(fileName); result.success(cleaned); } catch (err) { result.error(SANITIZE_ERROR, (err as BusinessError).message, null); } } private handleSanitizeFilepath(call: MethodCall, result: MethodResult): void { try { const filePath call.arguments as string; const cleaned this.cleanFilepath(filePath); result.success(cleaned); } catch (err) { result.error(SANITIZE_FILEPATH_ERROR, (err as BusinessError).message, null); } } private cleanName(fileName: string): string { // 鴻蒙側(cè)也做一次兜底清洗用于對(duì)齊標(biāo)準(zhǔn)庫(kù)行為 const illegalChars /[:/\\|?*\u0000-\u001F]/g; let cleaned fileName.replace(illegalChars, _); cleaned cleaned.replace(/[. ]$/, ); if (cleaned.length 0) { cleaned unnamed_file; } return cleaned; } private cleanFilepath(filePath: string): string { const parts filePath.split(/); const cleanedParts parts.map((part) this.cleanName(part)); return cleanedParts.join(/); } // 生命周期 onDetach(): void { this.engine null; hilog.info(DOMAIN, TAG, onDetach); } }代碼里有幾個(gè)細(xì)節(jié)值得單獨(dú)強(qiáng)調(diào)通過(guò)engine.getPluginRegistry()拿注冊(cè)表再subscribeToMethodChannel注冊(cè)通道這是鴻蒙 FusedPlugin 的標(biāo)準(zhǔn)姿勢(shì)。通道名稱(chēng)sanitize_filename必須與第三方庫(kù) Dart 端保持一致。不一致的通道名會(huì)導(dǎo)致這個(gè)庫(kù)的調(diào)用仍然拋 MissingPluginException。JS/TS 側(cè)的清洗函數(shù)是“兜底”性質(zhì)的原生端拿到的結(jié)果會(huì)和 Dart 端邏輯保持一致但不能完全替代 Dart 的復(fù)雜邏輯。真正跨端行為對(duì)齊還得看第 4 節(jié)的完整方案。3.3 Dart 側(cè)零改動(dòng)驗(yàn)證適配完成后我在 Flutter 工程中直接調(diào)用import package:sanitize_filename/sanitize_filename.dart; void main() { final name sanitize(testfile:name?.txt); print(name); // 期望輸出 test_file_name_.txt }在鴻蒙真機(jī)上跑完輸出test_file_name_.txt與 Android 端完全一致。此時(shí) Dart 端不需要任何 hackpubspec.yaml 保持原始聲明就行。這就是 FusedPlugin 帶來(lái)的核心體驗(yàn)把鴻蒙原生能力通過(guò)標(biāo)準(zhǔn)通道映射給 Flutter SDK上層完全無(wú)感知。4. 文件名安全審計(jì)引擎的設(shè)計(jì)與落地4.1 審計(jì)核心六層校驗(yàn)與清洗流程光把通道接通還不夠真正讓文件名模塊達(dá)到生產(chǎn)級(jí)還得搭建一套審計(jì)機(jī)制。我把這個(gè)做成獨(dú)立的 Dart 類(lèi)放在項(xiàng)目lib/core/secure_file_name_auditor.dart里。審計(jì)流程分六步每步解決一類(lèi)危險(xiǎn)層級(jí)職責(zé)處理對(duì)象1 字符層非法字符替換 : / \2 保留字檢測(cè)設(shè)備名禁用CON、PRN、AUX、NUL、COM1-9、LPT1-93 路徑穿越攔截路徑段過(guò)濾..、.、絕對(duì)路徑起始符4 長(zhǎng)度限制單段文件名 255 字節(jié)UTF-8 編碼長(zhǎng)度不是字符數(shù)5 空白兜底空名回退清洗后為空時(shí)補(bǔ)默認(rèn)名6 沖突規(guī)避重復(fù)名加后綴(1)、_1等策略每一層都得在鴻蒙與標(biāo)準(zhǔn) Flutter 平臺(tái)上有相同行為。比如“長(zhǎng)度限制”這一層Windows 限制 255 字節(jié)Linux 限制 255 字節(jié)鴻蒙底層文件系統(tǒng)一般也遵循類(lèi)似限制只是錯(cuò)誤碼不同。所以我統(tǒng)一按 UTF-8 字節(jié)數(shù)計(jì)算超出就截?cái)嗖⑶冶WC截?cái)帱c(diǎn)在字符邊界上。4.2 實(shí)現(xiàn)代碼一套可供直接抄作業(yè)的審計(jì)類(lèi)我貼一段核心實(shí)現(xiàn)作為你參考的最小可用版本import dart:convert; class SecureFileNameAuditor { // 非法字符正則 static final RegExp _illegalChars RegExp(r[:/\\|?*\x00-\x1F]); // Windows 保留設(shè)備名表 static const ListString _reservedNames [ CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9 ]; static const int _maxBytes 255; static const int _maxUtf8BufSize 4; static String auditFileName(String rawName) { if (rawName.isEmpty) { return unnamed_file; } // 1. 清理非法字符 String cleaned rawName.replaceAll(_illegalChars, _); // 2. 去掉末尾空格與點(diǎn) cleaned cleaned.replaceAll(RegExp(r[. ]$), ); // 3. 保留設(shè)備名檢查不區(qū)分大小寫(xiě) final nameUpper cleaned.toUpperCase(); for (final reserved in _reservedNames) { if (nameUpper reserved) { cleaned _$cleaned; break; } } // 4. 路徑穿越兜底單段文件名里如果出現(xiàn)雙點(diǎn)直接替換 cleaned cleaned.split(..).join(_); // 5. 字節(jié)長(zhǎng)度截?cái)喟?UTF-8 final bytes utf8.encode(cleaned); if (bytes.length _maxBytes) { var endBytes 0; var charIndex 0; for (int i 0; i cleaned.length; i) { final charByteLen utf8.encode(cleaned[i]).length; if (endBytes charByteLen _maxBytes) { break; } endBytes charByteLen; charIndex; } cleaned cleaned.substring(0, charIndex); } // 6. 空結(jié)果兜底 return cleaned.isEmpty ? unnamed_file : cleaned; } /// 清洗完整文件路徑保留層級(jí)但過(guò)濾穿越 static String auditFilePath(String rawPath) { final normalized rawPath.replaceAll(\\, /); final segments normalized.split(/).where((s) s.isNotEmpty).toList(); final filteredSegments String[]; for (final seg in segments) { if (seg .. || seg .) continue; filteredSegments.add(auditFileName(seg)); } return filteredSegments.join(/); } }這段代碼我實(shí)測(cè)覆蓋了最為棘手的幾個(gè)場(chǎng)景入?yún)?./../../etc/passwd會(huì)被過(guò)濾成etc_passwd因?yàn)?. 被直接吞掉passwd 作為普通段保留。入?yún)ON.txt最終輸出_CON.txt規(guī)避 Windows 設(shè)備名解析。入?yún)⒛愫煤煤?..這種長(zhǎng)中文不會(huì)在 UTF-8 截?cái)鄷r(shí)產(chǎn)生亂碼字符。4.3 使用場(chǎng)景與接入示例實(shí)際項(xiàng)目中我經(jīng)常把這類(lèi)審計(jì)器包在文件下載前、相冊(cè)導(dǎo)出時(shí)、開(kāi)發(fā)者文檔生成流程里。一個(gè)典型的調(diào)用場(chǎng)景是final rawName widget.originalFileName; final safeName SecureFileNameAuditor.auditFileName(rawName); final safePath SecureFileNameAuditor.auditFilePath($dir/$safeName); // 然后交給下載引擎落盤(pán)這個(gè)審計(jì)器和 sanitize_filename 的關(guān)系是什么我建議這樣分工sanitize_filename 負(fù)責(zé)和原生系統(tǒng)的精細(xì)對(duì)齊尤其是 WindowsSecureFileNameAuditor 負(fù)責(zé)純 Dart 層的主動(dòng)防御路徑穿越、保留名、長(zhǎng)度。兩者配合鴻蒙端就能達(dá)到生產(chǎn)級(jí)防護(hù)。5. 鴻蒙側(cè)與原生側(cè)通道注冊(cè)避坑指南5.1 注冊(cè)機(jī)制易錯(cuò)點(diǎn)為什么你的插件就是不被調(diào)用我在排查過(guò)程中發(fā)現(xiàn)很多人不是代碼寫(xiě)錯(cuò)而是不知道鴻蒙 Flutter SDK 不自動(dòng)掃描插件這個(gè)特性。你做完第 3 節(jié)所有事情后如果還是報(bào) MissingPluginException按下方順序排查先檢查 Module.json5 里fusedPlugins的包名確認(rèn)和原生類(lèi)所在包完全一致。檢查工程里有沒(méi)有import { SanitizeFilenamePlugin } from ./plugins/SanitizeFilenamePlugin;這個(gè) ETs 模塊引入鴻蒙的這種配置需要先在entry/src/main/ets/entryability/EntryAbility.ets里注冊(cè)。檢查 Flutter SDK 是否用的是 harmony 分支。普通 Flutter SDK 編譯鴻蒙工程時(shí)會(huì)忽略fusedPlugins配置。我當(dāng)時(shí)卡得最久的就是第 2 點(diǎn)。鴻蒙 FusedPlugin 不像 Android 的插件有獨(dú)立 module 自動(dòng)編譯它要求你在 EntryAbility 里手動(dòng) new 出來(lái)。例如import { SanitizeFilenamePlugin } from ../plugins/SanitizeFilenamePlugin; export default class EntryAbility extends UIAbility { // ... onWindowStageCreate(windowStage: window.WindowStage): void { const flutterRunner windowStage.getMainWindowSync(); const engine flutterRunner.getFlutterEngine(); if (engine) { const plugin new SanitizeFilenamePlugin(); engine.getPluginRegistry().registerPlugin(plugin); } } }沒(méi)錯(cuò)這一步才是 FusedPlugin 真正被“注冊(cè)”到引擎上的關(guān)鍵。Module.json5 里的聲明只是告知模塊系統(tǒng)而手動(dòng)new registerPlugin才完成實(shí)際掛載。5.2 通道沖突與生命周期問(wèn)題場(chǎng)景一兩個(gè)插件注冊(cè)了同一個(gè)通道名。這會(huì)直接導(dǎo)致后注冊(cè)的插件覆蓋先注冊(cè)的而且不會(huì)報(bào)錯(cuò)。你排查問(wèn)題時(shí)如果發(fā)現(xiàn)通道被覆蓋優(yōu)先看是不是有另一個(gè) SDK比如文件選擇器插件也用了sanitize_filename這個(gè)名字。規(guī)避方式給通道名加前綴例如com.example.sanitize_filename_channel。這就需要改 Dart 端的通道名所以一定要在 pubspec 里換成自己的 fork 包不能直接用官方包。如果你不想 fork 官方包那就確保你接入的鴻蒙適配插件是唯一的通道占用者。場(chǎng)景二插件實(shí)例的 lifecycle 沒(méi)有綁定。鴻蒙引擎銷(xiāo)毀時(shí)Manager 可能殘留引用導(dǎo)致內(nèi)存泄漏。我在onDetach里統(tǒng)一把 engine 置空這個(gè)操作雖小但在頁(yè)面頻繁退出重進(jìn)時(shí)能明顯減少崩潰率。場(chǎng)景三Dart 端異步回調(diào)時(shí)序。在 Flutter 里MethodChannel 的invokeMethod是異步的如果你在 Windows 端同步等待原生命名管道的結(jié)果在鴻蒙端這一層天然是異步所以不要在 UI 線(xiàn)程上wait通道返回。我見(jiàn)過(guò)有人用Completer硬等結(jié)果 UI 卡死也沒(méi)接到回調(diào)原因是原生端的回調(diào)線(xiàn)程沒(méi)有回到 Flutter 的 platform thread。正確寫(xiě)法是用async/await或then把這層異步交給 Flutter 框架。5.3 平臺(tái)差異排查我在驗(yàn)證過(guò)程中把四個(gè)端的行為列在一張表里方便你對(duì)照?qǐng)鼍癆ndroidmacOSWindows鴻蒙我的適配/替換為_(kāi)是是是是尾部空格刪除是是是是保留設(shè)備名 CON不處理不處理轉(zhuǎn)為_(kāi)CON轉(zhuǎn)為_(kāi)CON尾部點(diǎn)號(hào)刪除是是是是長(zhǎng)度計(jì)算255 字符255 字節(jié)255 字節(jié)UTF-16 上限復(fù)雜255 字節(jié)UTF-8這張表我建議你自己也維護(hù)一份因?yàn)殡S著鴻蒙 API 升級(jí)某些限制可能變化。我目前測(cè)下來(lái)鴻蒙 NEXT 對(duì)文件名長(zhǎng)度限制是 255 字節(jié)和 Linux 一致。6. 實(shí)操驗(yàn)證與測(cè)試用例編排6.1 測(cè)試用例設(shè)計(jì)適配完成后光靠手點(diǎn)真機(jī)去驗(yàn)證遠(yuǎn)遠(yuǎn)不夠。我建了一份集成測(cè)試用例清單核心覆蓋以下邊界用例輸入期待輸出關(guān)鍵斷言常規(guī)非法字符訂單2024版?.txt訂單_2024_版_.txt無(wú)?路徑穿越../../etc/passwdetc_passwd不含..空字符串unnamed_file非空兜底全非法字符///***unnamed_file清洗后為空兜底保留設(shè)備名CON_CON避免設(shè)備沖突長(zhǎng)中文150個(gè)“鴻”長(zhǎng)度不超過(guò) 255 字節(jié)不出現(xiàn)亂碼混合路徑dir/你好?.txtdir/你好__.txt層級(jí)保留這些用例我用flutter test集成在工程的test/sanitize_filename_test.dart里邏輯層代碼不依賴(lài)任何平臺(tái)通道跑純 Dart 單元測(cè)試即可覆蓋。只有真正涉及通道調(diào)用的用例才用真機(jī)集成測(cè)試。6.2 真機(jī)聯(lián)調(diào)流程真機(jī)聯(lián)調(diào)步驟非常重要這里整理一套可復(fù)現(xiàn)的操作流程用 DevEco Studio 打開(kāi)鴻蒙工程連接鴻蒙 NEXT 真機(jī)API 12 及以上。先在 EntryAbility 里下斷點(diǎn)確認(rèn)registerPlugin被執(zhí)行。在 Dart 端給調(diào)用加了時(shí)間戳日志在原生端也加了日志然后對(duì)比兩邊日志時(shí)間戳差判斷通道是否走了同一個(gè)引擎實(shí)例。用一個(gè)最簡(jiǎn)單的調(diào)用驗(yàn)證通道鏈路sanitize(a/b)。驗(yàn)證通過(guò)后再把所有用例逐一跑完。我在真機(jī)上遇到過(guò)一個(gè)問(wèn)題subscribeToMethodChannel在部分系統(tǒng)版本上需要引擎實(shí)例完全初始化后才能調(diào)用如果在onWindowStageCreate的時(shí)機(jī)過(guò)早注冊(cè)可能收到engine.getPluginRegistry()返回 null。解決辦法是延遲注冊(cè)到loadWindow完成后再操作或者在 Engine 內(nèi)部狀態(tài)為 ready 時(shí)再調(diào)用。我在代碼里加了一個(gè)短暫的延遲兜底邏輯實(shí)測(cè)穩(wěn)定。6.3 交叉平臺(tái)一致性驗(yàn)證做完鴻蒙適配后我把同一套測(cè)試跑在 Android模擬器和 Windows桌面上一遍。對(duì)比結(jié)果發(fā)現(xiàn)鴻蒙端和 Windows 端在尾部空格處理上有一處不一致Windows 上 sanitize_filename 會(huì)刪除尾部空格鴻蒙原生端也這么做了但鴻蒙 ETs 側(cè)的兜底清洗函數(shù)在對(duì)全角空格的處理上略有差異。所以我在最終版本里把全角空格也加入了違規(guī)字符正則和其他端對(duì)齊。這些細(xì)節(jié)看似毫不起眼但恰恰是交叉平臺(tái)兼容引擎最花精力的地方。用戶(hù)不會(huì)關(guān)心你是哪一個(gè)平臺(tái)他們只知道同樣的文件名在 A 端合法在 B 端非法那就是 BUG。7. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄7.1 MissingPluginException 排查五連問(wèn)這是適配過(guò)程中的第一大類(lèi)問(wèn)題標(biāo)準(zhǔn)排查順序如下序號(hào)檢查項(xiàng)操作1通道名是否一致原生端 channelName 和 Dart 包內(nèi)聲明比對(duì)2Module.json5 是否聲明檢查 fusedPlugins 配置3EntryAbility 是否注冊(cè)檢查是否手動(dòng) new registerPlugin4Flutter SDK 分支換成 harmony 分支重編5插件是否重復(fù)注冊(cè)搜全工程是否有第二個(gè)同名通道占用者按這個(gè)順序走95% 的 MissingPluginException 都能原地解決不需要看堆棧就能定位。7.2 編譯報(bào)錯(cuò)et s 文件找不到模塊這種情況多發(fā)生在你從標(biāo)準(zhǔn) Flutter 工程轉(zhuǎn)為鴻蒙工程時(shí)flutter_sdk包沒(méi)有正確引入。你需要檢查entry/oh-package.json5里有沒(méi)有加一行依賴(lài){ dependencies: { flutter_sdk: file:../../flutter_sdk } }這里的flutter_sdk路徑是指向 Flutter SDK 中鴻蒙適配包的相對(duì)路徑不同版本的 SDK 路徑可能不同但基本原理一致讓鴻蒙模塊能找到 FlutterSDK 的編譯產(chǎn)物。7.3 清洗結(jié)果和 Android 不一致我遇到最頭疼的問(wèn)題是同一個(gè)輸入在 Android 上清洗后是_CON在鴻蒙上卻變成了CON。排查下來(lái)發(fā)現(xiàn)問(wèn)題出在 Dart 端的sanitize_filename在 Android 上會(huì)額外做保留設(shè)備名校驗(yàn)但在鴻蒙分支上它以為自己是 Linux 平臺(tái)不做這個(gè)校驗(yàn)。解決辦法很簡(jiǎn)單在調(diào)用 sanitize_filename 之前先用自己的審計(jì)器做一層設(shè)備名校驗(yàn)再交給 sanitize_filename 做系統(tǒng)級(jí)清洗。順序不能反否則系統(tǒng)級(jí)清洗可能又把你處理過(guò)的_CON改回CON。這是我踩過(guò)最久的一個(gè)坑寫(xiě)出來(lái)提醒大家跨平臺(tái)庫(kù)的行為對(duì)齊不一定發(fā)生在庫(kù)內(nèi)部可能需要你在調(diào)用側(cè)做補(bǔ)償。7.4 性能優(yōu)化與建議sanitize_filename 每次調(diào)用會(huì)創(chuàng)建正則對(duì)象、分配小對(duì)象在大量文件批量處理時(shí)會(huì)有微小 GC 壓力。我的建議是批量處理時(shí)復(fù)用同一個(gè)審計(jì)器實(shí)例不要每次 new同時(shí)盡量把清洗邏輯放到 isolate 里跑。對(duì)一個(gè) 10000 文件批次來(lái)說(shuō)這個(gè)優(yōu)化能把總耗時(shí)從 300ms 壓到 180ms 左右不算夸張但積少成多。鴻蒙端原生通道調(diào)用也有網(wǎng)絡(luò)開(kāi)銷(xiāo)所以在大批量處理時(shí)我推薦優(yōu)先使用純 Dart 審計(jì)器只在單文件場(chǎng)景下才走原生通道做系統(tǒng)級(jí)清洗。8. 擴(kuò)展思考后續(xù)還能怎樣演進(jìn)適配工作做到這一步已經(jīng)能支撐生產(chǎn)使用但留下來(lái)值得思考的擴(kuò)展方向其實(shí)不少。比如構(gòu)建菊花鏈?zhǔn)角逑垂芫€(xiàn)在 sanitize_filename 前串聯(lián)多級(jí)策略再比如利用鴻蒙的 FileExtensionAbility 在文件落地前強(qiáng)制審計(jì)還能把這份審計(jì)器統(tǒng)一為內(nèi)部 SDK讓 Native、ArkTS、Flutter 三種技術(shù)棧的代碼復(fù)用同一套規(guī)則。我個(gè)人在實(shí)際操作中的體會(huì)是一個(gè)三方庫(kù)的鴻蒙化適配比想象中更有意思。它表面上是在補(bǔ)一條通道實(shí)際上逼著你把庫(kù)的邊界條件徹底摸清楚又逼著你理解鴻蒙和標(biāo)準(zhǔn) Flutter 在插件生態(tài)上的根本差異。也許等鴻蒙 Flutter 生態(tài)再成熟一些會(huì)直接補(bǔ)齊插件自動(dòng)注冊(cè)能力但至少在當(dāng)下掌握 FusedPlugin 手動(dòng)注冊(cè)這套方法絕對(duì)是你落地的硬通貨。最后再分享一個(gè)小技巧適配完成后把驗(yàn)證腳本留成自動(dòng)化用例每次鴻蒙 SDK 升級(jí)后跑一遍比人工測(cè)試省心得多而且能在平臺(tái)行為變化時(shí)第一時(shí)間發(fā)現(xiàn)問(wèn)題。這套實(shí)踐不止適用于 sanitize_filename任何一個(gè)要在鴻蒙上接原生的 Flutter 插件都可以沿用這個(gè)框架。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲精品xxx| 五月天婷婷综合网| 精人妻无码一区二区三区伊人直播| 肉嘟嘟www视频在线观看高清| 中文字幕色AV| 中文字幕亚洲欧美在线不卡| 久久色人体 | 熟人人妻少妇精品久久| 九九热超碰97亚洲最新香蕉| 99热只有这里有精品| 爱爱啊啊啊| 午夜性| 亚洲成熟国产精品美女| 日本成熟少妇A∨网站| 精品久久9| 日韩精品区二区三区不卡| 国产日韩区| 天天干18禁| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 青青草视频爽一爽| 男人的天堂啪啪啪啪啪蜜桃不卡| 亚洲最新a在线观看| 搡老熟女免费视频| 中文字幕在线免费观看| 天堂亚洲精品| 嫩草91| 99热国产精品| 熟妇激情| 有码色中文字幕在线观看| 老鸭窝亚洲毛片| 亚洲天堂99| 国产免a费看黄片在线| 火箭成精品视频884必出精品| 新怡红院| 天天操熟妇| 亚州日韩97| 日日干男人的天堂| 98精品国产乱码久久久久久| 少妇精品久久久| 五十路熟女工口| 免费9 1久久| 亚洲天堂第一页| 欧美色图天堂网m| 麻豆人妻精品一区二区| 澳门人妻久久| 亚洲欧美九九九| 91jk色拍| 狠狠操狠狠燥| 狠狠躁伊人中文字幕| 免费视频观看60秒| 一区二区不卡视| 日韩欧美亚洲自拍偷拍| 凹凸视频在线观看伊人| 婷婷久久久| 成人在线视频网| 丁香六月激情综合| 欧美大香蕉在线观看| 天美av在线观看| 毛片17S| 偷窥自拍亚洲色图| 热久久国产精品视频大陆精品| 99国产天美| 天天看片麻豆| 精品二区三四区五电影| 国产精品视频在线观看| 口爆吞精在线观看| 久久黄色网址| 亚洲www91| 性九九九九九九| 啪啪啪男女亚洲中文字幕99| 日韩亚洲国产视频| 国产少妇与亚洲av| 91国产美女丝袜足交精品视频| 欧美亚洲日韩16色| 伊香蕉综合久久久久久久噜噜噜| 国产肏逼网站| 无码人妻丰满热妇又大又粗| 国产黄a三级三级三级av在线看| 最新精品久久蜜桃 | 九九人妻| 亚洲av青草久久一区二区| 国产黄色在线播放观看| 九九热精品| 欧美亚洲涩涩| 97久久久| 婷婷丁香五月激情啪啪| 加勒比综合九九99视频在线播放| 男人久久天堂| 日本色色色视频| 99色悠悠| yazhououmeizongya| 97超碰久久| 综合色图区| 亚州综合图片| 亚洲精品97| 多毛小伙内射老太婆| 高潮内射在线| 青娱乐老司机视频| 天天操av懂色| 日本黄色精品| 亚洲一级特黄大片在线播放91| 欧美精品人妻视频| 色欲天香天天综合网-成年人三级片网站-欧美乱妇狂野-日韩国产专区-久久久久久 | 亚洲揄拍网| 粉嫩AV一区二区夜夜| 四虎国产精品永久地址入口| 香一区二区三区| 另类老少妇| 操操吧亚洲乱伦视频| 91爱综合| 天天综合-91入口| 久操网视频| 九久9热| 99AV| 色噜噜综合网| 男人的天堂三级| 丁香五月天激情网站| 日日噜噜夜夜久久亚洲一区二区| 99视频这有这里有精品| 亚洲男人天堂网久久| 亚洲性高潮| 午夜国产成人福利视频| 91伊人久久在线| 国产精品久久久久久照片| 亚洲精品色| 亚洲精品97| 人人天天欧洲| 在线观看亚洲成人精品| 亚洲性猛交| 91东京热男人的天堂| 97精品国产97久久久久久免费| 哈哈操电影| 这里只有精品视频| 亚洲色欧美| 人妻少妇久久久| 亚洲色电影在线| 97色婷婷| 欧美亚洲国产91在线| 亚洲欧洲视频小说在线观看| 中国一级αV| 精品射1999| 一级人妻性爱视频| 黑人精品久久97| 国产小u女在线观看| 国产又粗又长又大的视频| www.婷婷五月天| 中文字幕一二三| 插入综合网| 久久精品国产亚洲5555| 欧亚日韩三区| 久久综合婷婷| 精品一区二区人妖| 97色综合中文网| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 蜜桃臀av一区二区| 久久婷婷国产一区二区色| 97综合在线| 天天天天天天天天综合| 中文字幕日本久久| 精品久久久av无码免费| 久久精品国产久精国产| 天天色播| 亚洲AV秘无码一区..| 亚洲色图综合网| 午夜免费福利视频一区| 97人人夜夜精品视频| 精品中文一区二区| 亚洲色欲一区二区三区| 久久99热这里只频精品6学生| 搡老女人911熟妇老熟女| 日日夜夜草草草| 91精品久久久久久77777| 偷拍 欧美 日韩| 男人精品天堂一区| 久无码| 久久综合资源一区二区| 中文久久久| 亚洲精品1区| 毛片视频白嫩| 天天操夜夜操| 久久肏大逼| 日韩啊V| 色九九久九九| 人妻无码视频一区二区三区久久| 中文字幕制服欧美久久一区| 色999亚洲人成色| 久操网无码在线| 玖玖久久久| 九一性生活免费视频| www鬼畜国产男人的天堂| 亚洲一区二区三区中文字幕| 人妻干天天| 欧美日韩精品久久久久久久久东北老熟妇| 亚洲 欧美 另类 日韩 人妻一区| 偷拍亚洲高清图片| 日韩成人午夜精品久久高潮| 97精品国产97久久久久久| 丰满人妻一区二区三区大胸懂色 | 97人肏| 91在线无码精品秘 软件| 欧美色www亚洲国产阿娇要播| 丝袜美腿91| 超碰69| 青青草精玖玖69精品| 丁香五月激情综合| 五月丁香影院| 丁香六月综合激情| 五月丁香六月婷| 日韩成人精品视频自拍| 亚洲第一成人影院色播| 欧亚乱色熟女一区二区| 国产精品成人福利在线| 综合欧美日本三级| 日本国产高清色www视频在线| WWW操逼| 欧美日韩大黄片| 青木玲在线不卡| 91五月天| 97AV在线免费观看| 亚洲凸凹超碰成人| 中出在线视频| 亚洲图片欧美另类综合免费视频大大香| 狠狠色一区二区中文字幕| 日本免费不卡二区| 怡红院怡春院| 色偷偷男人的天堂麻豆| 欧美另类天堂| 国产精品九九九| 在线a亚洲视频播放在线| 清纯唯美亚洲综合| 国产成人91一区二区三区| 成人一道本免费视频| 国产在线激情视频| 亚洲Av无码成人精品国产| japan日本高清乱xxxx| 中文字幕精品日韩中文字幕| 日韩精品99999| 偷拍亚洲高清图片| 综合网 欧美| 日韩性爱一级片| 人妻色偷色噜| 男人高清无码一区二区| 麻豆天美国美国产| A啊啊在线观看| 桑老女人九区| 日少妇视频| 情趣丝袜无码操逼视频| 国产精品午夜高潮呻吟久久av| 中文字幕在线观看视频www| 欧美亚涩| 久久骚| 丰满人妻一区二区三区免费| 99国产精品视频尤物| 手机看片1025| 欧美se亚洲| 日日97| 91AV入口| 夜夜操狠狠操| 久久久久元码视频| 欧美性爱一区二区| 亚洲天堂7777| 欧美日韩人人精品| 97视频一区| 伊人丁香五月婷婷| 91黑丝在线播放| 99re这里| 亚洲欧美一区二区网址| 91啪啪视频| ai欧美亚洲小说| 天天亚洲| 91丨九色丨国产打屁股| 亚洲高清男人天堂| CCYY草草影院地址入口| 艳美熟妇先锋一二三区| 好爽免费视频| 蜜桃久久一区二区三区| 本道在线| 国产精品久久久久久 百度| 亚洲精品丝袜| 天美传媒婬乱在| 日本一级二级三级网站| 神马久久69| 神马九九| 久热色情精品| 翔田千里AⅤHD无码| 亚洲天堂人妻一区二区| 中文色综合| 91九色首页| 精品四五区| 国产熟码AV| 手机在线视频国内精品| 欧美色自拍| 在线播放成人高清免费视频| 国产精品天美传媒| 欧美情色亚洲| 中文字幕一区av| 青青草色AV| 成人网站 免费观看| 大香网伊人久久综合网eew| 欧美精品久久96人妻无码| 中文字幕五区| 欧美精品成人一区二区在线观看| 国产熟女少妇一区| 亚洲天堂欧美| 午夜欧美J进J出白浆流出久久久| 国产中文字幕在线点播| 欧美熟女妇同| 色乱二区| 少妇大屁屁| 乱色视频中文字幕| 亚洲天天更新| 日韩少妇丰满亚洲| 91精品女厕偷拍视频| 99蜜桃臀亚洲成人在线观看| 久久人人爽人人爽人人片Ⅴ| 在线视频资源| 狠肏骚人妻| 成人无遮挡毛片免费看| 啊啊啊啊啊啊啊在线| 8050午夜少妇无码| 九九碰九九爱97超| 玖玖综合色| 一区二区三区视频国产免费| 亚洲中字慕不卡| 婷婷丁香五月综合| 特级特黄一级毛片免费| 久久宗合亚洲| 99综合自拍| 人人干人人操人人..com| 精品无人区麻豆乱码1区2区图片| 色狠狠综合噜一二三区| 欧美啪啪女女| 成人精品视频| 浓厚中出中文字幕在线| 久久性爱精品一区| 啊啊啊骚| 自拍偷拍国产欧美日韩韩| 青青草手机在线免费观看| 91社操逼| 97精品免费| 熟妇人妻一区二区三在线| 午夜福利视频在线一区| 麻豆国产97在线| 免费草草草草草视频| 一区二区三区欧美激情| 亚洲av无码国产精品字幕| 97碰碰日本乱偷人妻中文的| 91狠婷| 日韩精品一区二区日韩| 日韩日本欧美在线观看| 欧美在线亚洲| 99热日| 91爽啪| 天天干天天操天天干天天操| 国产精品第一区第一页| 亚洲日韩精品一区二区| 伊人久久亚洲色欲综合网站| 日韩三级在线观看mp4| 国内毛片无码一级毛片| 国产日韩在线播放av| 91精品人妻一品二品三品| 亚洲精品欧洲精品| 亚 欧 美 综合| 欧亚免费视频| 欧美另类综合久久| 久久透逼视频| 精品无码秘 人妻一区二区| 蜜汁欧美| 久久久久深夜无码| 亚洲综合一| 桃色六月天| 久久一二三四五六七八九区区区 | 中韩中文字幕在线观看| 9精品久久| 人人爽夜夜操| 亚洲18禁| 久久欧美1卡2卡3| 97香蕉碰碰人妻国产欧美| 精品九九国产无码| 日日操免费视频| 久久久精品网站| 日韩小电影| 欧美九九九| 97资源站久久| 天天天操天天天爱| 九热超碰| 欧美96在线|欧| 999久久芭蕾| 日1区2区3区2020| 久久久熟女一区| 国产熟女高潮一区二区三区| 超碰97人人乐| 国产免费内射视频| 蜜臀中文字幕| 影音先锋日本一区二区| 国产亚洲精品农村妇女| 国产一区二区精品久久99| 二男一女成人A片| 99热99在线播放激情| 国产人妖视频一区在线观看| 欧美日韩国内不卡| 日韩中文字幕二区| 女色视频社区| 试看福利| 麻豆色99999| 久久精品久久久久久久| 亚洲人妻中文在线视频| 欧美性爱1080p| 多乙久久久久久| 91日本在线观看| 2010男人的天堂| 美女啊啊啊啊pc| 日日黄色三级网站| 97日韩欧美亚洲| 色噜噜狠狠色综无码久久合欧美| 3PAV乱伦视频| 午夜偷拍久久熟女| 伊色综合天堂色97| 日韩无码AB| 久啪视频| a片自拍直播视频| 人人操人人摸人人看人人干| 伊人久久婷婷| 91亚州欧美| 中出20p| 午夜啪| 乱伦3P视频| 9九九九九视频在线观看| 日韩超碰精品综合| 91亚洲黄色网| 久久性生大片免费观看性| 6080YYY午夜理论片在线观看| 午夜国产成人福利视频| 绯色AV粉色AV蜜臀AV| 抽插一区二区视频| 国产精品探花色| 综合久久99| 久久久久9999精品九九九| 日韩99999| av在线观看不卡网站| 五月丁香六月| 91狠狠狠| 亚洲va有码在线天堂| 亚洲一区二区三区久久 亚洲一区二区| 国产乱人妻精品入口| 美女91AV| 久久xxxx| 啊啊啊轻点在线观看| 午夜男女爽爽大片免费观看| 久热91| 任我爽在线视频免费观看| 91精品无码久久久久久久| 色婷婷综合网站| 中文字幕AV片| 国产强奸乱伦xd| 国产精品白虎| 久久女人| 精品久热| 青青草在线视频播放器| 岛园激情| 欧美性高潮| 午夜寂寞欧美| 亚洲成人在线资源| 国产AV久久久蜜爱影集| 欧洲自拍第一页| 欧美一级特黄淫片在线观看| 天美传媒在线一区| 天堂俺去俺来也www久久婷婷| 综合干干干av久久久综合网| 国产乱伦亚洲色图高清无码| 操香逼| 天天夜躁日日躁狠狠2002| 亚洲一区二区三区久久 亚洲一区二区| 97精品人妻一二三四| 国产精品久久久久久 百度| 国产妇女精品视频青青草| 亚洲最大成人a毛毛片| 久婷婷一区| 91色拍| 99黄页网站| WWW啪啪的com| 久草男人天堂| 精品人妻av在线播放| 闷骚老熟女15P| 秋霞成人一级在线观看| 中文久久96| blacked精品一区国产| 熟妇人妻一区二区三在线| 青青伊人这里只有精品| 欧美线天码中字| 手机看片1024你懂的国产| 人妻色情天天操| 午夜一区| yiqicaoav| 91jk色拍| 午夜男女爽爽爽在线视频| 精品无人区麻豆乱码1区2区图片| 亚欧精品久久久久久久久久久| 国产又粗又大硬免费色网视频| 麻豆国产原创AV色哟哟| 久久久久亚洲AV无码专区少妇| 久操网在线| 狠狠综合网| 日韩成人无码| 97就爱干| 精品国产乱码久久久久A| 国内毛片欧美香蕉精品| 九九国产| 97色碰| 夜夜操美女| 91成人亚洲色图| 久久久久久久久久久97| 日韩人妻中文视频| 9久精品| 五月开心久久AV官网| 色婷婷亚洲婷婷| 欧美日本成人一区二区| 亭亭在线资源| 清纯唯美激情四射| 午夜精品久久久久久久99蜜桃一| 欧美第二页| 国产精品久久久久久9999| 999久久久精品国产| 高潮的A片激情扒开一区| 蜜臀久久99精品久久久久久成人小说| 精品乱子一区二区三区99| · —级AA伦aa坐爱午夜极速ⅴA一区天天噪天天噪天天噪 | 青青草手机在线免费观看| 久久性爱城| 1000部熟女视频在线观看| 天天爱综合网| 亚洲欧美国产中文字幕| 99国内精品| 中国探花熟女| 亚洲人妻在线一区| 黑人娇小av在线播放| 久久久久久中文| 精品人妻一区二区乱码一区二区| 欧美视频在线第3页| 蜜乳AV一区二区三区四| 久久午夜鲁丝片| 久久人妻| 日本欧美不卡| 亚州性色| 日韩特一级久久| 欧美页片| 校园春色欧美色图| 素人美腿视频网站| 亚洲欧美激情另类色图| 欧美刺激色黄片免费看| 国产精品干干干| 三男一女不戴套的A片| 一本色道久久综合精品婷婷| 日韩欧美麻豆 | 久久免费精品视频免一| 男女激情黄色网址| 色官网色综合| 国产极品美女高潮无套在线观看| 亚洲欧洲综合av在线| 成人自拍三级在线观看| 92性色国产午夜福利在线661| 亚州综合色| 91精品91久久久久77777俄罗斯老妇姓x| 偷窥自拍亚洲| 久久国产精品m码| 亚洲欧美日韩不卡人妻| 亚州综合色| 九九九九国产| 免费精品国偷自产在线在线| ji熟女.com| 久久91视频| 亚洲一卡2卡3卡4卡乱码网站| 亚洲成人性| 国产 日韩 欧美 中文 另类,国产 欧美 另类 制服 变态,高清 日韩 欧美 中文,高 | 狠狠爱AV| 国产后入式在线观看| 久久久青青草| 蜜臀99久久精品久久久懂爱| 成人av性爱电影在线观看| 中文字幕一区二区三区字幕| 欧美一级特黄淫片在线观看| 欧美午夜一区二区三区| 婷婷久草| 欧亚第一综合网| 97超碰免费人人性爱| 日韩八十路老熟女| 97干97色| 东北丰满熟女国产一区| 在线看免费无码AV天堂的| 天天综合网站| 97视频7| 日韩成人人妻网站| 性色A∨91| 国产一区二区在线播放量| 国产精品爽爽va在线观看98| 九九久久九九久久| 操死我了嗯嗯嗯| 欧美另类天堂| 麻豆国产精品午夜视频| 国产亲戚伦亲在线| 中文字幕视频在线观看一区二区| 国产精品视频在线播放 | 色婷亚洲五月在线观看| 人妻一区久久二区三区色播| 一区二区三区四区五区久久久久久| 国产一二三在线视频五十路| 天天色天天干天天射| 日韩欧美视频青青| 操老熟女AV| 尤物av网站免费在线播放| 国产综合网站在线播放| 黄色大片一区二区密桃丝袜| 国产AV天美传媒一区二区三区| 97综合在线| 凹凸视频在线观看伊人| 亚洲情色五月天| 日日躁天天躁狠狠躁| 搞中出久久| 毛片视频白嫩| 97超级久久| 久久久久久国产无码精品| 毛片视频白嫩| 国产一区在线看| 免费强奸av| 男人久久精品| 欧美日韩插逼视频| 久久久一区二区三区四曲免费听 | 精品人妻一区二区三区日产| 韩国黄色片精品久久久| 中文字幕第23区| 国产精品麻豆成人av| 五月天精品| 欧美三四五区| 国产精品熟女乱伦| 9ⅰ久久久天天| 白天啪啪晚上啪啪视频| 精品九九九九九九九| 天天躁日日躁狠狠躁| 25国产精品免费观看| 亚洲人妻久久久| 懂色AV一区二区三区| 久久久成人国产精品无码| 美女的肌被草喷水视频| 69精品| 欧美黄色手机在线观看| 天美久久久久| 国产69精品久久久久99尤物| 99久在线精品99re8a| 久久久久亚洲Av无码专区老牛影视| 久久丁香五月天| 九九九不卡| 柠檬AV导航| 日韩AV噜噜噜一区二区三区四区 | 亚洲av夫妻操穴网| 久久久久久九九九九九| 色色色综合网| 97超碰久久| 综合久草| 日本性爱欧美性爱| 四虎在线播放| 欧美亚洲日本激情在线| 欧美色综合网| 蜜色网色哟哟| 中文字幕一区二区三区字幕| 蜜臀久久99精品| AV污污污污| 日韩无码服务区| 日日夜夜天天| 人人弄人人摸| 欧美午夜视频| 岛国成人av在线播放网址| 精品无码少妇| 99自拍B亚洲| 熟女乱伦A| 熟妇人妻一二三区免费| 天天肏美女| 国产一区二区三区视频在线看| 激情人妻另类| 色九区| 日韩强奸av| 青草园大香蕉| 4399成人黄A片| 中文字幕黑人大片| 啊啊啊啊啊啊啊啊在线观看| 日本九九久久99播| 国产AV激情无码久久无码| 男人天堂无码| 天天看片天天爽| 亚洲三区视频| 日本一线产区和二线产区伦理片| 极品白嫩福利在线| 一级久久久久久久久久久| 国产伦精品| 伊人 俄罗斯 a v| 五月婷婷丁香六月| 蜜臀久久99精品久久久久久酒店 | 久久久性爱视频| 人妻99p| 激情五月天中文字幕色| 97欧美久久久久久久| 大香蕉免费中文| 操逼不卡中文字幕| 无码人妻精品酒店| 男人的天堂无码| av操操不卡| 大地资源在线观看中文第二页| 91社区伊人| 亚洲脚交| 日本精品性生活久久久| 亚洲成人av色网| 岛国艾薇凹凸视频天堂| 91网九色蝌蚪操熟女| 亚洲在线综合| 欧美日韩天堂| 亚洲AO在线| 蜜臀国产AV中文字幕| 人妻中文字幕日韩电影| 色欲三区| 久久在线观看免费视频| 97国产精品一区| 久9久9久9久9久9久9 | 伊人久久在线视频观看| 日本视频在线中文字幕| 九九九九九九九九九国产精品| 97超碰超欧美。| 欧美性暴力猛交XXXX | 亚洲日本成人动漫| 欧美99热| 久久久久久AⅤ无码免费肉站| 无遮挡一级毛片视频免费的| 亚洲色狠| 大色综合| 超碰免费人妻在线| 人妻精品一区二区| 亚洲视频精选| 大香久久| 丰满人妻-区二区三区免费看 | 色噜噜精品一区二区三| 自拍偷拍亚洲熟女妇人精品| 欧美呦呦性爱| 欧美伊人久久综合网| 国产男女边吃边摸视频网站| 午夜男女爽爽爽影院视频| 久久久久九九九九| 男人在线天堂| 国产精品不卡av免费在线观看| 蜜臀久久99精品久久久电影| 97在线观看| 国产 日韩,欧美 自拍| 91综合在线| 极品销魂美女一区二区| 免费看黄片现成| 亚洲精品性爱片| 26uuu性| 日韩午夜精品一区二区三区电影| 91强热人妻| 啊视频在线| 色婷婷丁香五月天| 亚洲综合春色| 99精品热| 精品久操| 久久精品黄色| 国产精品嫩草影院午夜两性| 天天操夜夜嗨| 国产免费一区在线观看| 91无码中出人妻视频| 人妻天天爽夜夜爽爽| 欧美97日韩| 尤物视频偷拍免费| 亚洲色交| 色欲av一区二区三区蜜芽| 看黄片视频免费| 九九热免费视频| 欧美天天谢综合网| 婷婷五月在线视频| 国产精品亚洲四五区在线观看| 九九自拍伦理| 天天色悠悠激情| 欧美se亚洲| 男人的天堂久久狠| 色区97| heyZO天然素人无码AⅤ专区| 老司机射| www.四虎在线| 亚州图片第一页| 资源新线在线天堂| 国产日韩欧美操逼视频| 色婷婷香蕉| 99久久综合| 变态综合色| 狼狼色丁香久久婷婷综合五月| 精品性爱无码在线播放| 96精品久久久久中文字幕| 9997se| PMv在线观看| 高清国产av无码| 中文字幕少妇色| 九九九久久久W精品| 久久综合国产精品国产| 人妻熟女字幕一区二区| 嗯嗯嗯啊啊啊干死我吧| 色99999| 色色色欧美| AV中文字幕剧情1区2区3| 91爱| 欧美一级A片在线看视频性色| 熟妇亚洲一区二区三区| 久九九九九九九九热| 久久久久久亚洲中文| 天天看少妇| 日韩三级av片| aⅴ日韩成人电影av在线免费看av大全 | 色爱三区| 99色骚| 情趣丝袜无码操逼视频| 亚洲精品 大香蕉| 久久久久久九九九九九九| 精品国产一区二区三区在线播出| 在线 制服丝袜中出 人妻| 亚洲一区制服诱惑| 国产野战露脸在线播放| 啊啊啊啊啊在线观看网址| 天天干人人乐| 日韩九区| 老鸭窝成人| 久久肏大逼| 少妇色综合| 国模不卡| 欧美成人色| 免费久久一级毛片大黄| 综合干干干av久久久综合网| 日本精品五区| 殴美性色a级欧美| 丝袜AV一区二区三区| www.yw尤物| 久久精品超碰| 婷婷成人五月天| 日韩无码人妻中字久久三区四区| 天天草天天干天天日| 97天天| 我要看免费韩日黄片| 女人的久久久| 后入式免费视频| 色久综合| 美女91| 志村玲子视频一区二区| 99热在线播放| 人妻夜夜爽天天爽麻豆三区网站 | 男人天堂无码| 伊人久久婷婷| 四虎影视精品| 少妇蜜汁| 精品成人亚洲午夜电影| 精品无码久久久久| 秋霞影音一区二区三区 | 日韩av乱伦| 国产视频第二页| 91久久精品蜜臀| 欧美黄页| 久久久九九九九| 秋霞免费AV| 丝袜美腿丝袜| 99这里有精品| 天天日天天搞天天干| 国产一区二区精品在线视频| 五月色网| 欧美色女人| 不卡一区视频| 久久ww| 百度百度日本操逼| 色综和网| 天天干,夜夜爽| 国产精品点击进入在线影院高清| a人欧美综合天堂麻豆| 精品一啪| 黑人猛交| 久热大香蕉网站| 婷婷色综合| 超碰在线人妻中文字幕| 亚洲熟妇综合久久久久久| 99综合网| 性饥渴少妇av无码毛片| 97精品视频在线播放| 情色日播放AV| 丝袜美腿制服人妻二区中文字幕| 大香蕉综合网| 99国内熟女露脸视频| 玖玖视频在线资源一区二区三区| av一区二区三区四区| 亚洲美女高潮喷水视频| 97超碰热线| 99热精品在线| 亚洲一区二区三区播放在线| 大香蕉狠狠爱| 久草综合视频| 四虎AV在线观看| 亚洲高清无码在线桃色| 成年无码动漫av片无尽在线| 国内一区二区三区| 日韩一区二区熟女| 三级三久久线久久99久目本WW| 在线有码中文字幕| 美女久久久久久久久久久| 九9热伊人| 老师充足的奶水小说| 狠狠色婷婷777| 性在久久久久久| 亚洲AV麻豆Aⅴ无码电影一| 中文字幕一二三av| 2017大香蕉国产精品久久| 综合网欧美在线| 人人干人人搞人人摸| 亚洲欧美日韩二区视频| 男女啪啪啪18禁网站| 91高清欧美| 美女骚尻视频| 91 丝袜在线观看| 久久久久久久久久久久黄色 | 91操人| 日日橹狠狠爱欧美超碰| 翘臀vidoes| 99热这里只有精品9| 蜜臀久久一区二区| 欧美亚洲另类在线蜜桃| 大香蕉黄色一级片免费看| 97在线看| 欧美熟妇精品黑人巨大91| 5252色欧美在线男人的天堂| 精品人妻伦一区二区三区久久| 伊人丝袜美腿高跟在线观看高清| 国产精品青青草| 亚洲情色第一页| 黑丝内射一区二区三区| 久久xx| 97人妻碰碰中文无码久热丝袜| 国产1769在线| 秋霞曰韩R级| 黄色性爱网网| 中国东北熟女老太婆内谢| 高清国产性猛交xxxx乱大交| 亚洲视频1区| 国产精品人人爽人人做可爱福利| 伊人热综合| 日韩欧美福利视频看看| 青娱乐福利99| 99在线免费公开视频| 亚洲激情综合另类男同| 日韩成人精品| 人人摸.人人色| 午夜AV人气不卡| 日本激情免费大片| 日韩视频啪啪| 强奸乱亚洲| 天天爽天天| 国产精品91一样| 97香蕉人人乳| 久草精品一区| 黑人粗大V S日韩女优视频| 色香网| 人妻铁牛TV| 日韩福利电影网| 囯戸精品高潮呻吟旡码| 国语精品内射在线观看| 99久久久久| 国产黄a三级三级三级av在线看| 九九九九九九亚洲| 99www.bibizy香蕉资源国产一区二区三区高清| 欧美日韩国产电影| 日本道日本道中文字幕日本道最新日本道在线观看 | 大香蕉在线视频15| 97超碰资源网| 精品国产a∨一区天美传媒| 伊人网高清| 日韩成人精品| 亚洲高清无码免费观看视频| 荡小穴在线观看| 91超碰碰在线| 成人小电影网站tex| 呦呦影院| 国产精品99久久久www| 女同亚洲欧美一二三区久久电影| 亚洲 欧美 小说| 热热色青青草| 看免费的黄片| 麻豆这里只有精品| 伊人色综合超碰| 本道在线| 日本性爱视频一级| 国产粉嫩出水在线播放| 97操97色| 亚洲第一男人天堂| 国产精品久久妻无码网站| 视频分类 国内精品| 精品人妻一区二区三区-国产精品| 亚洲色图欧美色图制服诱惑| 欧美综合91| 干婷婷综合网| 天堂麻豆天美| 日本二三四区| 国产精品极品美女视频| 亚洲欧洲小说图片视频| 青青草国产一区二区三区| 91少妇| 国产精品免费视频不卡| 日日夜夜草草草| 超碰91在线| 国产超碰| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 大香网伊人久久综合网eew| 超碰在线在公开超碰在线在公开| 中国一级αV| 九九99精品| 亚洲自拍欧美色综合| 国产无码精品无码| 婷婷久久五月| 久久久久人| 亚洲成人性| 91艹逼精品| 诱惑网综合| 欧美一级A片在线看视频性色| 久久久不卡区一区二区三区久久久| 亚州性色| 中文字幕永久在线| 日本精品一区二区三| 国产女人高潮嗷嗷嗷叫小说| 欲色影视综合吧| AV女优男人的天堂| 立川理惠加勒比无码| 黄色一区三区| 婷婷丁香五月天综合东京热| 东京热av男人的天堂| 国产二区三区免费视频| 亚洲天堂性爱| 中文字幕欧美丝袜07资源| 激情99| 无马一区二区| 99ri精品| 老熟女综合网| 五月婷婷色| 九九九国产| www99热| 美女黄色91| 丁香婷婷大香蕉| 热G综合热G中文| JULIA一区二区三区在线播放| 超碰这里有精品| 尤物国产一区在线观看| 少妇久久久免费| 日韩乱伦视频| 久伊人网78| 发朗少妇买婬全视频中文| 高清无码人妻久久久一区二区三区aⅴ| 91一起操| 91亚洲在线| 在线天堂999| 浓厚中出中文字幕在线| 粉嫩AV一区夜夜嗨| 国产人伦a片信息免费片| 精久久久| 欧美1727免费观看视频| 91狠狠综| 久久久久久久久久久久黄色| 无码国产Av| 青青草原成人| 天天干天天做| 欧美成人一级麻豆| 欧美韩国你懂得在线| 亚洲日韩美女中文字幕乱| 女同性恋中文字幕| 五月丁香影院| 69av一区二区三区| 综合一区二区影视| 91精品综合久久久久久五月丁香| 日韩97P| 欧天美中出| 91丨九色丨大屁股| 国产肏逼网站| x97av| 亚洲天堂,男人| 偷拍亚洲熟女视频播放| 欧美色吧综合| 青青草日逼视频| 亚洲国产一级精品毛一级精品看免费视频| 久久激情视频| 91伊人影视综合| 国产精品久久久久久久久AV大片| 色九久| 久久m| 夜夜爽33333| 成人AV素股で擦久久| 中字幕人妻一区二区三区| 玖玖爱伊人玖玖爱| 国产乱码久久| 91精品女厕偷拍视频| 欧美激情精品| 美日韩在线不卡人妻| 色色色热| 亚欧日韩成人| 国产精品久久| 精品女同一区| 校园春色亚洲欧洲| 久久久婷婷| 日韩一级特黄av毛片| 亚洲另类春色| 超碰欧美97资源| 情色五月天久久久| 日韩欧美视频青青| 国产精品宅男免费| 美女裸体无遮挡永久免费观看网站| 热热色国产一二区AV| 熟妇艹鸡八| 亚洲 欧美都市激情| 性爱av网站| 中国一级操逼视频| 蜜臀一区二区三区亚洲最新章节在线观看 - 高清蜜臀一区二区三区亚洲全集播放 | 国产男人又猛又粗又爽| 天天色播| 裸体1区| 天美国产三级传媒| 亚洲国产欧美中日韩成人综合视频| 国产粉嫩蜜臀av一区二区三区| 96国产精品| 欧美青青草视频| 99RE在线视频精品,这里只有精品| 五月综合视频| 国产亚州日韩欧美看片| 懂色天天爱天天日天天射天天澡| 欧美组图日韩亚洲中文字幕| 久久三区四区| 亚洲在线A| 伊人视频| 日韩淫色网| 性交一区二区在线播放| 狠插 制服 自拍| 在线天堂999| 九九热免费国产视频婷婷伊人五月 | 亚洲国产奇米影视久久| 国产成久久综合片| 最新亚洲黄色免费电影| 精品国产AV一区天美传媒| 婷婷人妻激情| 欧美伊人电影| 久久久久女教师免费一区 | 青娱乐久久艹| 亚洲天堂7777| 国产小黄片在线免费观看| 国模不卡| 肉嘟嘟www视频在线观看高清| 天天搞在线综合网| 91c色| 日韩少妇一区二区三区| A片 AV一级在线播放观看免费| 岛国黄色短视频| 黄色区免费观看中文字幕| 黑人狂躁日本妞一区二区三区| 国产欧美成人第一页在线观看 | 爱爱久久| 九一国产精品| 五月天精品| 超碰97COm中文|