Android11编译第二弹:USB连接MTP模式+USB调试+USB信任

一、为什么需要开启USB信任和ADB调试

问题1:原始的AOSP,如果通过USB连接设备以后,会弹窗提示用户选择连接模式:MTP,大容量磁盘,照片等模式;

问题2:USB连接设备以后,需要开启USB调试模式,才方便操作adb调试;

问题3:USB设备连接以后,电脑会弹窗是否信任设备,需要点击信任当前设备,否则设备连接不成功。

使用场景:我们是自己的系统,需要支持设备USB连接,以及adb远程调试(USB调试和TCP调回),因此,系统需要默认支持USB连接,支持USB调试,默认信任连接的设备。

二、集成步骤

2.1 关闭USB调试弹窗

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java

@Overridepublic void onCreate(Bundle icicle) {
...(省略)
/**final AlertController.AlertParams ap = mAlertParams;ap.mTitle = getString(R.string.usb_debugging_title);ap.mMessage = getString(R.string.usb_debugging_message, fingerprints);ap.mPositiveButtonText = getString(R.string.usb_debugging_allow);ap.mNegativeButtonText = getString(android.R.string.cancel);ap.mPositiveButtonListener = this;ap.mNegativeButtonListener = this;// add "always allow" checkboxLayoutInflater inflater = LayoutInflater.from(ap.mContext);View checkbox = inflater.inflate(com.android.internal.R.layout.always_use_checkbox, null);mAlwaysAllow = (CheckBox)checkbox.findViewById(com.android.internal.R.id.alwaysUse);mAlwaysAllow.setText(getString(R.string.usb_debugging_always));ap.mView = checkbox;window.setCloseOnTouchOutside(false);setupAlert();**/notifyService(true,true);finish();
}

默认只要USB连接设备,默认就开启USB调试。关键方法是notifyService

/*** Notifies the ADB service as to whether the current ADB request should be allowed, and if* subsequent requests from this key should be allowed without user consent.** @param allow whether the connection should be allowed* @param alwaysAllow whether subsequent requests from this key should be allowed without user*                    consent*/private void notifyService(boolean allow, boolean alwaysAllow) {try {IBinder b = ServiceManager.getService(ADB_SERVICE);IAdbManager service = IAdbManager.Stub.asInterface(b);if (allow) {service.allowDebugging(alwaysAllow, mKey);} else {service.denyDebugging();}mServiceNotified = true;} catch (Exception e) {Log.e(TAG, "Unable to notify Usb service", e);}}

这个方法很简单,通过ADB服务,设置允许调试。

mKey是什么呢?就是设备指纹,即我们常说的设备SN。

2.2 授权ADB调试5555端口

device/qcom/lahaina/init.target.rc

    #Allow access to memory hotplug device attributeschown system system /sys/kernel/mem-offline/anon_migrate# ==== modify start===== zhouronghua open adb debug port 5555setprop service.adb.tcp.port 5555# ==== modify end=====

2.3 接收到USB连接默认开启USB调试

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java

在其中有监听USB连接和断开的广播接收器UsbDisconnectedReceiver,

private class UsbDisconnectedReceiver extends BroadcastReceiver {
...(省略)@Overridepublic void onReceive(Context content, Intent intent) {String action = intent.getAction();if (!UsbManager.ACTION_USB_STATE.equals(action)) {return;}// ====== modify begin ==========// fix: zhouronghua usb debug default auth// boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);boolean connected = false;if (!connected) {Log.d(TAG, "USB disconnected, notifying service");// notifyService(false);mActivity.finish();}// open adb debuggingnotifyService(true, true);// =========== modify end ==========}}

开启USB调试,直接开启ADB调试即可,不需要单独开启USB调试,TCP调试。

2.4 USB授权默认信息

frameworks/base/packages/SystemUI/src/com/android/systemui/usb/UsbPermissionActivity.java

    @Overridepublic void onCreate(Bundle icicle) {...(省略)setupAlert();// ======= modify begin =========// fix: zhouronghua usb default trust devicesLog.d(TAG, "grant usb permission automatically");mPermissionGranted = true;finish();// ======= modify end =======}

默认同意授权USB连接。

 2.5 USB连接默认为MTP模式

USB管理器接收到USB连接监听

frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

USB连接默认采用MTP模式,且开启ADB调试。

        @Overridepublic void handleMessage(Message msg) {...(省略)if (mBootCompleted) {if (!mConnected &&            !hasMessages(MSG_ACCESSORY_MODE_ENTER_TIMEOUT)&& !hasMessages(MSG_FUNCTION_SWITCH_TIMEOUT)) {// restore defaults when USB is disconnected// fix: zhouronghua usb debug mode//if (!mScreenLocked//        && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {//    setScreenUnlockedFunctions();//} else {//setEnabledFunctions(UsbManager.FUNCTION_NONE, false);// USB connect enablesetEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false);// adb enablesetAdbEnabled(true)//}}updateUsbFunctions();}protected void finishBoot() {if (mBootCompleted && mCurrentUsbFunctionsReceived && mSystemReady) {if (mPendingBootBroadcast) {updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));mPendingBootBroadcast = false;}// ========== modify start ===========//if (!mScreenLocked//        && mScreenUnlockedFunctions != UsbManager.FUNCTION_NONE) {//    setScreenUnlockedFunctions();//} else {//    setEnabledFunctions(UsbManager.FUNCTION_NONE, false);//}// fix: zhouronghua USB enablesetEnabledFunctions(UsbManager.USB_FUNCTION_MTP, false);// adb enablesetAdbEnabled(true);// ======== modify end =================

2.6 Release默认开启ADB调试

build/make/core/main.mk

build/make/core/main.mkifeq (true,$(strip $(enable_target_debugging)))# Target is more debuggable and adbd is on by defaultADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1# Enable Dalvik lock contention logging.ADDITIONAL_BUILD_PROPERTIES += dalvik.vm.lockprof.threshold=500
else # !enable_target_debugging# Target is less debuggable and adbd is off by default# ==== mofify begin ===== zhouronghua fix: adb debug modeADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1# ==== modify end ====
endif # !enable_target_debugging

在Release版本也允许进行ADB调试

2.7 post_process_props.py开启adb调试

build/make/tools/post_process_props.py

  # 1. 注释掉if prop.get("ro.debuggable") == "1"判断,Release也允许调试# ==== modify begin fix: zhoronghua open adb debug mode# if prop.get("ro.debuggable") == "1":# ==== modify end ====# 因为注释掉判断,判断体重的内容整体往前缩进val = prop.get("persist.sys.usb.config")if "adb" not in val:if val == "":val = "adb"else:val = val + ",adb"prop.put("persist.sys.usb.config", val)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/65698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debezium的三种部署方式

Debezium如何部署 debezium 有下面三种部署方式,其中最常用的就是 kafka connect。 kafka connect 一般情况下,我们通过 kafka connect 来部署 debezium,kafka connect 是一个框架和运行时: source connectors:像 debezium 这样将记录发送到 kafka 的source connectors…

Linux音频了解

ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能! 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述; ⚫ alsa-lib 库介绍; ⚫ alsa-lib 库移植; ⚫ alsa-l…

【Linux】分区、格式化、挂载点分别是什么?如何理解文件系统和设备之间的关系?

Linux 服务器上的文件是按文件系统层次结构(一个颠倒的目录树)访问的。该文件系统层次结构则是由系统可用的存储设备所提供的文件系统组装而来。每个文件系统都是一个已格式化的存储设备,可用于存储文件。 从某种意义上说,Linux 文件系统层次结构可在独立…

卡特兰数和算法

在组合数学中,卡特兰数是一系列自然数,出现在各种组合计数问题中,通常涉及递归定义的对象。它们以比利时数学家尤金查尔斯卡特兰(Eugne Charles Catalan)的名字命名。 卡特兰数序列是1, 1, 2, 5, 14, 42......&#xf…

[Java]_[初级]_[使用SAX流的方式写入XML文件]

场景 文件的写入目前没有发现可以增量写入的,只能是完全重新写入。对于大量数据需要写入XML文件,还是和读XML文件一样,不需要生成DOM模型能节省不少的内存和指令。 说明 在java标准库里,也是有相关的SAX类来写入数据流&#xf…

解释 Git 的基本概念和使用方式

Git是一个分布式版本控制系统,它可以记录文件的变化历史,便于团队协作和版本管理。以下是Git的基本概念和使用方式: 仓库(Repository):Git可以管理一个或多个仓库,每个仓库保存了一个或多个文件…

微信小程序精准扶贫数据收集小程序平台设计与实现

摘 要 近些年以来,随着我国的互联网技术的不断进步,计算机科学技术的发展也在不断的快速发展。在当下“互联网”的带动下,我国的各行各业,上到政府机关下到小微企业都通过互联网的发展带动取得了很好的发展势头。我国这两年来通过…

合宙Air724UG LuatOS-Air LVGL API控件--复选框 (Checkbox)

复选框 (Checkbox) 复选框主要是让用户进行一些内容选择,或者同意用户协议。 示例代码 – 复选框回调函数 function event_handler(obj, event) if event lvgl.EVENT_VALUE_CHANGED then print(“State”, lvgl.checkbox_is_checked(obj)) end end – 创建复选框…

STM32 FREERTOS osDelayUntil()异常

问题: 在使用osDelayUntil()进行固定延时时发现不起作用,程序不能按照预期的延时进行执行(比延时要快)。 #define taskMBSysManage_Delay_TIME 1000 TickType_t xLastWakeTime; xLastWakeTime xTaskGe…

githubPage部署Vue项目

github中新建项目 my-web (编写vue项目代码) myWebOnline(存放Vue打包后的dist包里面的文件) 发布流程 (假设my-web项目已经编写完成)Vue-cli my-web vue.config.js文件中 const { defineConfig } require(vue/cli-service)…

OpenCV(八):图像二值化

目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的…

容器权限降级为 op 用户

容器权限降级为 op 用户 更新 Docker Compose 配置文件: 请确保已提供的 docker-compose.yml 文件已准备好,并覆盖了原先的配置文件。 cd /home/op/compose设置文件和文件夹权限: 在 Linux 环境中,按照以下步骤逐一执行命令。在需…

socket,tcp,http三者之间的原理和区别

目录 1、TCP/IP连接 2、HTTP连接 3、SOCKET原理 4、SOCKET连接与TCP/IP连接 5、Socket连接与HTTP连接 socket,tcp,http三者之间的区别和原理 http、TCP/IP协议与socket之间的区别 下面的图表试图显示不同的TCP/IP和其他的协议在最初OSI模型中的位置…

对比Flink、Storm、Spark Streaming 的反压机制

分析&回答 Flink 反压机制 Flink 如何处理反压? Storm 反压机制 Storm反压机制 Storm 在每一个 Bolt 都会有一个监测反压的线程(Backpressure Thread),这个线程一但检测到 Bolt 里的接收队列(recv queue)出现了…

软件测试/测试开发丨文件上传与弹窗处理 学习笔记

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27071 一、文件上传 input标签可以直接使用send_keys(“文件路径/文件名”)上传文件 ele01 driver.find_element(By.ID,“上传按钮id”)ele01.send_keys(…

Java异常(Error与Exception)与常见异常处理——第八讲

前言 前面我们讲解了Java的基础语法以及面向对象的思想,相信大家已经基本掌握了Java的基本编程。在之前代码中,我们也看到代码写错了编译器会提示报错,或者编译器没有提示,但是运行的时候报错了,比如前面的数组查询下标超过数组的长度。所以在使用计算机语言进行项目开发的…

敲笨钟ptaC++

substr string a "123456"; string sub_a a.substr(0, 2); // "12"string sub_a_ a.substr(2); // "3456"左闭右开的截取字符串 实现思路 以逗号分割,取出两个字符串。利用substr判断是否以ong结尾,然后使用string流…

(一)连续随机量的生成-从t分布采样

连续随机量的生成-从t分布采样 1. t t t 分布2. 从 t t t 分布采样3. Python编程实现 1. t t t 分布 t t t 分布作为 t t t 检验的抽样分布出现。 令 z 1 , ⋯ , z n z_1, \cdots, z_n z1​,⋯,zn​ 为 i.i.d,分布为 N ( μ , σ 2 ) N\left(\mu, \sigma^2\rig…

简单了解ICMP协议

目录 一、什么是ICMP协议? 二、ICMP如何工作? 三、ICMP报文格式 四、ICMP的作用 五、ICMP的典型应用 5.1 Ping程序 5.2 Tracert(Traceroute)路径追踪程序 一、什么是ICMP协议? ICMP因特网控制报文协议是一个差错报告机制,…

实力认证!OceanBase获“鼎信杯”优秀技术支撑奖

6 月 30 日,2023 “鼎信杯”信息技术发展论坛在京隆重举办第二届“鼎信杯”大赛颁奖典礼。OceanBase 凭借完全自主研发的原生分布式数据库,以及丰富的核心系统国产数据库升级案例,斩获“优秀技术支撑奖”。 论坛上,国内首个基于在…