安卓無障礙腳本開發全教程

在這里插入圖片描述

文章目錄

    • 第一部分:無障礙服務基礎
      • 1.1 無障礙服務概述
        • 核心功能:
      • 1.2 基本原理與架構
      • 1.3 開發環境配置
        • 所需工具:
        • 關鍵依賴:
    • 第二部分:創建基礎無障礙服務
      • 2.1 服務聲明配置
      • 2.2 服務配置文件
        • 關鍵屬性說明:
      • 2.3 實現服務類
    • 第三部分:高級功能實現
      • 3.1 節點查找與操作
        • 常用查找方法:
        • 節點操作示例:
      • 3.2 手勢模擬
      • 3.3 全局事件監聽
    • 第四部分:實戰案例開發
      • 4.1 自動填寫表單
      • 4.2 消息自動回復
      • 4.3 游戲自動化輔助
    • 第五部分:調試與優化
      • 5.1 調試技巧
        • ADB調試命令:
        • 日志記錄最佳實踐:
      • 5.2 性能優化
        • 優化建議:
        • 優化示例:
    • 第六部分:發布與安全
      • 6.1 權限與隱私
        • 必要權限聲明:
        • 隱私注意事項:
      • 6.2 發布流程
    • 第七部分:高級主題
      • 7.1 與其他技術的結合
        • 與Tasker集成:
        • 使用機器學習:
      • 7.2 跨版本兼容性處理
        • 版本差異處理表:
        • 兼容性代碼示例:

在這里插入圖片描述

第一部分:無障礙服務基礎

1.1 無障礙服務概述

安卓無障礙服務(Accessibility Service)是一種特殊類型的服務,旨在幫助殘障用戶或需要輔助功能的用戶更好地使用設備。但它的功能遠不止于此,開發者可以利用它實現自動化操作、界面監控和交互等功能。

核心功能:
  • 界面內容訪問:獲取屏幕上的UI元素信息
  • 自動化操作:模擬點擊、滑動等用戶操作
  • 事件監控:監聽窗口變化、通知、焦點改變等系統事件
  • 增強交互:為特定應用提供定制化輔助功能

1.2 基本原理與架構

用戶操作 目標應用 無障礙服務 系統框架 觸發界面變化 更新界面狀態 發送AccessibilityEvent 處理事件 可選: 執行操作(點擊/滑動等) 執行請求的操作 用戶操作 目標應用 無障礙服務 系統框架

1.3 開發環境配置

所需工具:
  • Android Studio最新版
  • 安卓設備或模擬器(API 16+)
  • ADB調試工具
關鍵依賴:
dependencies {implementation 'androidx.core:core-ktx:1.7.0'implementation 'androidx.appcompat:appcompat:1.4.1'
}

第二部分:創建基礎無障礙服務

2.1 服務聲明配置

AndroidManifest.xml中添加服務聲明:

<serviceandroid:name=".MyAccessibilityService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"android:exported="true"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService" /></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/service_config" />
</service>

2.2 服務配置文件

創建res/xml/service_config.xml

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:description="@string/accessibility_service_description"android:accessibilityEventTypes="typeAllMask"android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows"android:canRetrieveWindowContent="true"android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"android:canRequestFilterKeyEvents="true"android:canPerformGestures="true"android:notificationTimeout="100"android:packageNames="com.example.targetapp" />
關鍵屬性說明:
  • accessibilityEventTypes:監聽的事件類型
  • packageNames:指定監控的應用包名(可選)
  • canPerformGestures:允許執行手勢操作(API 24+)

2.3 實現服務類

創建基礎服務類MyAccessibilityService.kt

class MyAccessibilityService : AccessibilityService() {override fun onServiceConnected() {Log.d("A11yService", "無障礙服務已連接")// 可以在此處進行服務配置更新val info = AccessibilityServiceInfo().apply {eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED or AccessibilityEvent.TYPE_WINDOW_STATE_CHANGEDfeedbackType = AccessibilityServiceInfo.FEEDBACK_GENERICnotificationTimeout = 100flags = AccessibilityServiceInfo.DEFAULT orAccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS}this.serviceInfo = info}override fun onAccessibilityEvent(event: AccessibilityEvent?) {event ?: returnwhen (event.eventType) {AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {handleWindowChange(event)}AccessibilityEvent.TYPE_VIEW_CLICKED -> {handleViewClick(event)}}}override fun onInterrupt() {Log.w("A11yService", "無障礙服務被中斷")}private fun handleWindowChange(event: AccessibilityEvent) {val rootNode = rootInActiveWindow ?: returnLog.d("A11yService", "窗口變化: ${event.packageName}")// 遍歷視圖樹traverseNode(rootNode)}private fun traverseNode(node: AccessibilityNodeInfo, depth: Int = 0) {if (node.childCount == 0) {Log.d("A11yTree", "${" ".repeat(depth)}${node.viewIdResourceName}")return}for (i in 0 until node.childCount) {node.getChild(i)?.let { child ->traverseNode(child, depth + 1)child.recycle()}}}
}

第三部分:高級功能實現

3.1 節點查找與操作

常用查找方法:
fun findNodes(root: AccessibilityNodeInfo) {// 通過文本查找val byText = root.findAccessibilityNodeInfosByText("搜索")// 通過View ID查找(全限定ID)val byId = root.findAccessibilityNodeInfosByViewId("com.example.app:id/btnSubmit")// 通過類名查找val editTexts = mutableListOf<AccessibilityNodeInfo>()val queue: Queue<AccessibilityNodeInfo> = LinkedList()queue.add(root)while (queue.isNotEmpty()) {val current = queue.poll()if (current.className == "android.widget.EditText") {editTexts.add(current)}for (i in 0 until current.childCount) {current.getChild(i)?.let { queue.add(it) }}}
}
節點操作示例:
fun performActions(node: AccessibilityNodeInfo) {// 點擊操作if (node.isClickable) {node.performAction(AccessibilityNodeInfo.ACTION_CLICK)}// 文本輸入val arguments = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "Hello")}node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments)// 焦點控制node.performAction(AccessibilityNodeInfo.ACTION_FOCUS)// 滾動操作node.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD)
}

3.2 手勢模擬

Android支持通過無障礙服務模擬復雜手勢:

fun performGesture(service: AccessibilityService) {val path = Path().apply {moveTo(100f, 100f)  // 起點lineTo(500f, 100f)   // 移動到右側lineTo(500f, 500f)   // 向下移動lineTo(100f, 500f)   // 向左移動close()              // 閉合路徑}val gestureBuilder = GestureDescription.Builder().addStroke(GestureDescription.StrokeDescription(path, 0L,  // 開始時間1000L,  // 持續時間(毫秒)false  // 是否持續))service.dispatchGesture(gestureBuilder.build(), object : AccessibilityService.GestureResultCallback() {override fun onCompleted(gestureDescription: GestureDescription?) {Log.d("Gesture", "手勢完成")}override onCancelled(gestureDescription: GestureDescription?) {Log.w("Gesture", "手勢取消")}}, null)
}

3.3 全局事件監聽

監聽系統級事件:

override fun onAccessibilityEvent(event: AccessibilityEvent) {when (event.eventType) {AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {val notificationText = event.text.joinToString()Log.d("Notification", "新通知: $notificationText")}AccessibilityEvent.TYPE_ANNOUNCEMENT -> {Log.d("Announcement", "系統公告: ${event.text}")}AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START -> {Log.d("Touch", "觸摸探索開始")}}
}

第四部分:實戰案例開發

4.1 自動填寫表單

class FormFillerService : AccessibilityService() {private val formData = mapOf("username" to "testuser","password" to "secure123","email" to "test@example.com")override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.eventType != AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) returnval rootNode = rootInActiveWindow ?: returnformData.forEach { (fieldName, value) ->val nodes = rootNode.findAccessibilityNodeInfosByViewId("com.example.app:id/$fieldName")nodes.firstOrNull()?.let { field ->if (field.className == "android.widget.EditText") {val args = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, value)}field.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args)}}}// 自動提交表單rootNode.findAccessibilityNodeInfosByViewId("com.example.app:id/submit").firstOrNull()?.performAction(AccessibilityNodeInfo.ACTION_CLICK)}
}

4.2 消息自動回復

class AutoReplyService : AccessibilityService() {private val replyMessages = listOf("我正在開會,稍后回復您","好的,收到","謝謝通知")override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.packageName != "com.whatsapp") returnwhen (event.eventType) {AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED -> {// 處理通知事件val messages = event.text.filter { it.contains("發來消息") }if (messages.isNotEmpty()) {replyToLatestMessage()}}AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED -> {// 處理界面文本變化if (isChatOpen()) {autoReplyInChat()}}}}private fun replyToLatestMessage() {// 實現打開聊天界面并回復的邏輯}private fun isChatOpen(): Boolean {// 檢測當前是否在聊天界面}private fun autoReplyInChat() {val root = rootInActiveWindow ?: returnval messageNodes = root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/message_text")// 獲取最后一條消息val lastMessage = messageNodes.lastOrNull()?.text ?: return// 隨機選擇回復內容val randomReply = replyMessages.random()// 找到輸入框并發送root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/entry").firstOrNull()?.let { input ->val args = Bundle().apply {putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, randomReply)}input.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, args)// 發送消息root.findAccessibilityNodeInfosByViewId("com.whatsapp:id/send").firstOrNull()?.performAction(AccessibilityNodeInfo.ACTION_CLICK)}}
}

4.3 游戲自動化輔助

class GameHelperService : AccessibilityService() {private var isRunning = falseprivate val handler = Handler(Looper.getMainLooper())private val clickRunnable = object : Runnable {override fun run() {performAutoClick()if (isRunning) {handler.postDelayed(this, 1000) // 每秒點擊一次}}}override fun onServiceConnected() {val info = AccessibilityServiceInfo().apply {eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGEDfeedbackType = AccessibilityServiceInfo.FEEDBACK_GENERICflags = AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS}serviceInfo = info}override fun onAccessibilityEvent(event: AccessibilityEvent) {if (event.packageName != "com.game.package") returnwhen (event.eventType) {AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED -> {checkGameState()}}}private fun checkGameState() {val root = rootInActiveWindow ?: returnval battleNode = root.findAccessibilityNodeInfosByViewId("com.game.package:id/battle_indicator")if (battleNode.isNotEmpty()) {startAutoClicking()} else {stopAutoClicking()}}private fun startAutoClicking() {if (!isRunning) {isRunning = truehandler.post(clickRunnable)}}private fun stopAutoClicking() {isRunning = falsehandler.removeCallbacks(clickRunnable)}private fun performAutoClick() {val root = rootInActiveWindow ?: returnval attackBtn = root.findAccessibilityNodeInfosByViewId("com.game.package:id/attack_button").firstOrNull()attackBtn?.performAction(AccessibilityNodeInfo.ACTION_CLICK)// 隨機位置點擊,避免被檢測為機器人if (Math.random() < 0.3) {val randomX = (100..500).random()val randomY = (200..800).random()dispatchGesture(createClickGesture(randomX, randomY), null, null)}}private fun createClickGesture(x: Int, y: Int): GestureDescription {val clickPath = Path().apply {moveTo(x.toFloat(), y.toFloat())}return GestureDescription.Builder().addStroke(GestureDescription.StrokeDescription(clickPath, 0, 50)).build()}
}

第五部分:調試與優化

5.1 調試技巧

ADB調試命令:
# 查看已啟用的無障礙服務
adb shell settings get secure enabled_accessibility_services# 啟用服務
adb shell settings put secure enabled_accessibility_services com.example.pkg/.MyAccessibilityService# 查看無障礙事件日志
adb shell logcat -s AccessibilityEvent
日志記錄最佳實踐:
fun logNodeInfo(node: AccessibilityNodeInfo) {val sb = StringBuilder().apply {append("View ID: ${node.viewIdResourceName}\n")append("Text: ${node.text}\n")append("Class: ${node.className}\n")append("Bounds: ${node.boundsInScreen}\n")append("Actions: ${node.actionList.joinToString()}\n")append("ChildCount: ${node.childCount}\n")}Log.d("NodeInfo", sb.toString())
}

5.2 性能優化

優化建議:
  1. 減少遍歷深度:只查找必要的節點層級
  2. 及時回收節點:調用recycle()釋放資源
  3. 事件過濾:只監聽必要的事件類型
  4. 延遲處理:對頻繁事件使用防抖
  5. 后臺處理:將耗時操作移到工作線程
優化示例:
class OptimizedService : AccessibilityService() {private val eventQueue = LinkedBlockingQueue<AccessibilityEvent>()private val workerThread = HandlerThread("EventProcessor").apply { start() }private val workerHandler = Handler(workerThread.looper)private val eventProcessor = object : Runnable {override fun run() {while (true) {val event = eventQueue.take()processEvent(event)}}}override fun onCreate() {super.onCreate()workerHandler.post(eventProcessor)}override fun onAccessibilityEvent(event: AccessibilityEvent) {// 快速將事件加入隊列,避免阻塞主線程eventQueue.put(event)}private fun processEvent(event: AccessibilityEvent) {// 實際處理邏輯}override fun onDestroy() {workerThread.quitSafely()super.onDestroy()}
}

第六部分:發布與安全

6.1 權限與隱私

必要權限聲明:
<uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
隱私注意事項:
  1. 明確告知用戶:在隱私政策中說明數據收集范圍
  2. 最小權限原則:只請求必要的權限
  3. 敏感數據處理:避免收集密碼等敏感信息
  4. 數據加密:對存儲的日志和數據進行加密

6.2 發布流程

  1. 測試階段

    • 在不同安卓版本上測試
    • 在各種品牌設備上測試(特別是國產ROM)
    • 測試電池消耗情況
  2. 應用商店要求

    • 明確說明是無障礙輔助工具
    • 提供詳細的使用說明視頻
    • 如果是自動化工具,需遵守各商店政策
  3. 持續更新

    • 定期適配新安卓版本
    • 針對流行應用的特殊適配
    • 根據用戶反饋優化功能

第七部分:高級主題

7.1 與其他技術的結合

與Tasker集成:
// 接收Tasker的廣播意圖
private val taskerReceiver = object : BroadcastReceiver() {override fun onReceive(context: Context, intent: Intent) {if (intent.action == "net.dinglisch.android.tasker.ACTION_TRIGGER") {val task = intent.getStringExtra("task")when (task) {"start_automation" -> startAutomation()"stop_automation" -> stopAutomation()}}}
}override fun onCreate() {super.onCreate()registerReceiver(taskerReceiver, IntentFilter("net.dinglisch.android.tasker.ACTION_TRIGGER"))
}
使用機器學習:
// 使用ML Kit識別屏幕內容
fun detectTextFromScreen(bitmap: Bitmap): String {val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)val image = InputImage.fromBitmap(bitmap, 0)return try {val result = recognizer.process(image).await()result.text} catch (e: Exception) {Log.e("ML", "識別失敗", e)""}
}// 截圖并處理
fun captureAndAnalyze() {val projection = MediaProjectionManager.createScreenCaptureIntent()// 需要先獲取用戶授權...val imageReader = ImageReader.newInstance(screenWidth, screenHeight, PixelFormat.RGBA_8888, 2)imageReader.setOnImageAvailableListener({ reader ->val image = reader.acquireLatestImage()// 轉換為Bitmap并傳遞給識別器val text = detectTextFromScreen(convertImageToBitmap(image))Log.d("ScreenText", "識別結果: $text")image.close()}, handler)
}

7.2 跨版本兼容性處理

版本差異處理表:
功能API 16-22API 23-28API 29+
節點信息獲取基本支持增強支持受限
手勢模擬不支持部分支持完全支持
隱私限制部分嚴格
后臺服務允許限制嚴格限制
兼容性代碼示例:
fun performActionCompat(node: AccessibilityNodeInfo, action: Int, args: Bundle? = null): Boolean {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {node.performAction(action, args)} else {node.performAction(action)}
}fun getNodeTextCompat(node: AccessibilityNodeInfo): String {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {node.text?.toString() ?: ""} else {node.text ?: ""}
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906852.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906852.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906852.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

閑時處理技術---CAD C#二次開發

在CAD C#二次開發中&#xff0c;使用閑時處理技術可以提高程序的響應性能和資源利用率。以下是一般的實現步驟&#xff1a; 1. 了解CAD的事件機制 CAD提供了一些事件&#xff0c;如 Idle 事件&#xff0c;當CAD應用程序處于空閑狀態時會觸發該事件。你可以訂閱這個事件來執行閑…

Git研究

以下命令在CentOS系統下執行 創建Git倉庫 git init git-example 監控.git目錄的變化情況&#xff1a; watch -n .5 tree .git 寫入文件內容&#xff0c;并把文件添加到Stage暫存區 echo 1 > t.txtgit add 1.txt 觀察結果如下&#xff1a;objects下多出了一個d00491fd…

野火魯班貓(arrch64架構debian)從零實現用MobileFaceNet算法進行實時人臉識別(四)安裝RKNN Toolkit Lite2

RKNN Toolkit Lite2 是瑞芯微專為RK系列芯片開發的NPU加速推理API。若不使用該工具&#xff0c;計算任務將僅依賴CPU處理&#xff0c;無法充分發揮芯片高達6TOPS的NPU算力優勢。 按照官方文檔先拉一下官方代碼庫&#xff0c;然后通過whl文件安裝&#xff0c;因為我是python3.1…

Vue3集成Element Plus完整指南:從安裝到主題定制下-實現后臺管理系統框架搭建

本文將詳細介紹如何使用 Vue 3 構建一個綜合管理系統&#xff0c;包括路由配置、頁面布局以及常用組件集成。 一、路由配置 首先&#xff0c;我們來看系統的路由配置&#xff0c;這是整個應用的基礎架構&#xff1a; import {createRouter, createWebHistory} from vue-rout…

【Oracle】創建公共數據連接

需求描述 兩個oracle數據庫&#xff0c;想從B數據庫創建視圖腳本訪問A數據庫相關表的數據&#xff0c;該怎么訪問呢&#xff1f; 解決方法 在Oracle數據庫中&#xff0c;創建公共數據庫鏈接&#xff08;Public Database Link&#xff09;可以允許數據庫中的任何用戶訪問遠程…

時序數據庫IoTDB的分片與負載均衡策略深入解析

一、引言 隨著數據庫服務的業務負載增加&#xff0c;擴展服務資源成為必然需求。擴展方式主要分為縱向擴展和橫向擴展。縱向擴展通過增加單臺機器的能力&#xff08;如內存、硬盤、處理器&#xff09;來實現&#xff0c;但受限于單臺機器的硬件能力。而橫向擴展則通過增加更多…

計算機網絡期末復習資料

我用夸克網盤分享了「計算機網絡」&#xff0c; 鏈接&#xff1a;https://pan.quark.cn/s/8aac2f0b840e 計算機網絡試題庫 1單項選擇題 1.1以下屬于物理層的設備是 ( A) A. 中繼器 B.以太網交換機 C. 橋 D. 網關 1.2在以太網中&#xff0c;是根據 (B) 地址來區分…

【IEEE 2025】低光增強KANT(使用KAN代替MLP)----論文詳解與代碼解析

【IEEE 2025】本文參考論文Enhancing Low-Light Images with Kolmogorov–Arnold Networks in Transformer Attention 雖然不是頂刊&#xff0c;但是有值得學習的地方 論文地址&#xff1a;arxiv 源碼地址&#xff1a;github 文章目錄 Part1 --- 論文精讀Part2 --- 代碼詳解形狀…

naivechain:簡易區塊鏈實現

naivechain&#xff1a;簡易區塊鏈實現 naivechain A naive and simple implementation of blockchains. 項目地址: https://gitcode.com/gh_mirrors/nai/naivechain 項目介紹 naivechain 是一個簡單且易于理解的區塊鏈實現項目。它使用 Go 語言編寫&#xff0c;以極簡…

Zabbix開源監控的全面詳解!

一、zabbix的基本概述 zabbix&#xff0c;這款企業級監控軟件&#xff0c;能全方位監控各類網絡參數&#xff0c;確保企業服務架構的安全穩定運行。它提供了靈活多樣的告警機制&#xff0c;幫助運維人員迅速發現并解決問題。此外&#xff0c;zabbix還具備分布式監控功能&#…

軟考軟件評測師——軟件工程之開發模型與方法

目錄 一、核心概念 二、主流模型詳解 &#xff08;一&#xff09;經典瀑布模型 &#xff08;二&#xff09;螺旋演進模型 &#xff08;三&#xff09;增量交付模型 &#xff08;四&#xff09;原型驗證模型 &#xff08;五&#xff09;敏捷開發實踐 三、模型選擇指南 四…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Blurry Loading (毛玻璃加載)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— Blurry Loading 組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ ? 組件目標 實現一個加載進度條&#xff0c;隨著加載進度的…

WPF性能優化之延遲加載(解決頁面卡頓問題)

文章目錄 前言一. 基礎知識回顧二. 問題分析三. 解決方案1. 新建一個名為DeferredContentHost的控件。2. 在DeferredContentHost控件中定義一個名為Content的object類型的依賴屬性&#xff0c;用于承載要加載的子控件。3. 在DeferredContentHost控件中定義一個名為Skeleton的ob…

VLM-MPC:自動駕駛中模型預測控制器增強視覺-語言模型

《VLM-MPC: Model Predictive Controller Augmented Vision Language Model for Autonomous Driving》2024年8月發表&#xff0c;來自威斯康星大學的論文。 受視覺語言模型&#xff08;VLM&#xff09;的緊急推理能力及其提高自動駕駛系統可理解性的潛力的啟發&#xff0c;本文…

推薦系統里真的存在“反饋循環”嗎?

推薦系統里真的存在“反饋循環”嗎&#xff1f; 許多人說&#xff0c;推薦算法不過是把用戶早已存在的興趣挖掘出來&#xff0c;你本來就愛聽流行歌、買潮牌玩具&#xff0c;系統只是在合適的時間把它們端到你面前&#xff0c;再怎么迭代&#xff0c;算法也改變不了人的天性&a…

代碼混淆技術的還原案例

案例一 eval 混淆 特征 &#xff1a; 反常的 eval 連接了一堆數據 練習網站 https://scrape.center/ spa9 這個案例 基本的還原方法 但是這個代碼還是非常的模糊不好看 優化一下 &#xff1a; 當然還有更快捷的方法 &#xff1a; 好用的 js混淆還原的 web &#xf…

鴻蒙Flutter實戰:22-混合開發詳解-2-Har包模式引入

以 Har 包的方式加載到 HarmonyOS 工程 創建工作 創建一個根目錄 mkdir ohos_flutter_module_demo這個目錄用于存放 flutter 項目和鴻蒙項目。 創建 Flutter 模塊 首先創建一個 Flutter 模塊&#xff0c;我們選擇與 ohos_app 項目同級目錄 flutter create --templatemodu…

Go核心特性與并發編程

Go核心特性與并發編程 1. 結構體與方法&#xff08;擴展&#xff09; 高級結構體特性 // 嵌套結構體與匿名字段 type Employee struct {Person // 匿名嵌入Department stringsalary float64 // 私有字段 }// 構造函數模式 func NewPerson(name string, age int) *Pe…

Java 函數式接口(Functional Interface)

一、理論說明 1. 函數式接口的定義 Java 函數式接口是一種特殊的接口&#xff0c;它只包含一個抽象方法&#xff08;Single Abstract Method, SAM&#xff09;&#xff0c;但可以包含多個默認方法或靜態方法。函數式接口是 Java 8 引入 Lambda 表達式的基礎&#xff0c;通過函…

【python代碼】一些小實驗

目錄 1. 測試Resnet50 ONNX模型的推理速度 1. 測試Resnet50 ONNX模型的推理速度 ############################### # 導出resnet50 模型 # 測試onnx模型推理 cpu 和 GPU 的對比 ###############################import time import numpy as np import onnxruntime as ort im…