Android Framework 常见解决方案(26)user版本可root方案

1 原理说明

User版本默认是没有root权限和remount功能的,一般该方法用于调试性能相关问题。如果使用debug版本对照,差异过大,因此就有了这样的需求。

修改的核心原理就是调整adbd及相关属性中的一些判定,即user和debug版本的区别点入手。另外就是user版本中本身是没有remount的,需要单独添加才行。同时也需要修改should_drop_privileges的返回值以防止降低adbd进程的权限等限制。

2 修改方案(Android S)

2.1 在packages/modules下的修改

在packages/modules/adb/Android.bp文件中修改:

//...
cc_binary {name: "adbd",defaults: ["adbd_defaults", "host_adbd_supported", "libadbd_binary_dependencies"],recovery_available: true,apex_available: ["com.android.adbd"],srcs: ["daemon/main.cpp",],cflags: ["-D_GNU_SOURCE","-Wno-deprecated-declarations",],strip: {keep_symbols: true,},static_libs: ["libadbd","libadbd_services","libasyncio","libcap","liblz4","libminijail","libssl",],shared_libs: ["libadb_protos","libadbd_auth",],target: {recovery: {exclude_shared_libs: ["libadb_pairing_auth","libadb_pairing_connection",],}},
+    required: [
+        "libadbd_auth",
+        "libadbd_fs",
+        "remount",
+    ],
}
//...

在packages/modules/adb/daemon/main.cpp文件中修改:

//...
//should_drop_privileges直接返回false,目的是防止因此降低adbd进程的权限
static bool should_drop_privileges() {
+    return false;//...
}
//...
int adbd_main(int server_port) {umask(0);signal(SIGPIPE, SIG_IGN);#if defined(__BIONIC__)auto fdsan_level = android_fdsan_get_error_level();if (fdsan_level == ANDROID_FDSAN_ERROR_LEVEL_DISABLED) {android_fdsan_set_error_level(ANDROID_FDSAN_ERROR_LEVEL_WARN_ONCE);}
#endifinit_transport_registration();// We need to call this even if auth isn't enabled because the file// descriptor will always be open.adbd_cloexec_auth_socket();#if defined(__ANDROID__)// If we're on userdebug/eng or the device is unlocked, permit no-authentication.
-    bool device_unlocked = "orange" == android::base::GetProperty("ro.boot.verifiedbootstate", "");
+      bool device_unlocked = true;if (__android_log_is_debuggable() || device_unlocked) {
-      auth_required = android::base::GetBoolProperty("ro.adb.secure", false);
+      auth_required = false;}
#endif
//...

至此,package下的修改就结束了。接下来是system部分的修改。

2.2 system下的修改

在system/core/fs_mgr/Android.bp文件中修改:

//...
cc_defaults {name: "libfs_mgr_defaults",defaults: ["fs_mgr_defaults"],export_include_dirs: ["include"],include_dirs: ["system/vold"],cflags: ["-D_FILE_OFFSET_BITS=64",],srcs: ["blockdev.cpp","file_wait.cpp","fs_mgr.cpp","fs_mgr_format.cpp","fs_mgr_verity.cpp","fs_mgr_dm_linear.cpp","fs_mgr_overlayfs.cpp","fs_mgr_roots.cpp","fs_mgr_vendor_overlay.cpp",":libfiemap_srcs",],shared_libs: ["libbase","libcrypto","libcrypto_utils","libcutils","libext4_utils","libfec","liblog","liblp","libselinux",],static_libs: ["libavb","libfs_avb","libfstab","libdm","libgsi",],export_static_lib_headers: ["libfs_avb","libfstab","libdm",],export_shared_lib_headers: ["liblp",],whole_static_libs: ["liblogwrap","libdm","libext2_uuid","libfscrypt","libfstab",],cppflags: [
-        "-DALLOW_ADBD_DISABLE_VERITY=0",
+        "-UALLOW_ADBD_DISABLE_VERITY",
+        "-DALLOW_ADBD_DISABLE_VERITY=1",],
-    product_variables: {
-        debuggable: {
-            cppflags: [
-                "-UALLOW_ADBD_DISABLE_VERITY",
-                "-DALLOW_ADBD_DISABLE_VERITY=1",
-            ],
-        },
-    },header_libs: ["libfiemap_headers","libstorage_literals_headers",],export_header_lib_headers: ["libfiemap_headers",],required: ["e2freefrag","e2fsdroid",],
//...
cc_binary {name: "remount",defaults: ["fs_mgr_defaults"],static_libs: ["libavb_user","libgsid","libutils","libvold_binder",],shared_libs: ["libbootloader_message","libbase","libbinder","libcutils","libcrypto","libext4_utils","libfec","libfs_mgr_binder","liblog","liblp","libselinux",],header_libs: ["libcutils_headers",],srcs: ["fs_mgr_remount.cpp",],cppflags: [
-        "-DALLOW_ADBD_DISABLE_VERITY=0",
+       "-UALLOW_ADBD_DISABLE_VERITY",
+        "-DALLOW_ADBD_DISABLE_VERITY=1",],
-    product_variables: {
-        debuggable: {
-            cppflags: [
-                "-UALLOW_ADBD_DISABLE_VERITY",
-                "-DALLOW_ADBD_DISABLE_VERITY=1",
-            ],
-        },
-    },required: ["clean_scratch_files",],
}
//...

这里-DALLOW_ADBD_DISABLE_VERITY=1的含义是允许adbd进程关闭Verity检查。

在system/core/fs_mgr/fs_mgr_remount.cpp文件中修改:

//...
static int do_remount(int argc, char* argv[]) {RemountStatus retval = REMOUNT_SUCCESS;// If somehow this executable is delivered on a "user" build, it can// not function, so providing a clear message to the caller rather than// letting if fall through and provide a lot of confusing failure messages.
-    if (!ALLOW_ADBD_DISABLE_VERITY || (android::base::GetProperty("ro.debuggable", "0") != "1")) {
+    if (!ALLOW_ADBD_DISABLE_VERITY) {LOG(ERROR) << "only functions on userdebug or eng builds";return NOT_USERDEBUG;}const char* fstab_file = nullptr;auto can_reboot = false;//...
}
//...

在core/init/property_service.cpp文件中修改:

//...static void update_sys_usb_config() {
-    bool is_debuggable = android::base::GetBoolProperty("ro.debuggable", false);
+    bool is_debuggable = true;std::string config = android::base::GetProperty("persist.sys.usb.config", "");// b/150130503, add (config == "none") condition here to prevent appending// ",adb" if "none" is explicitly defined in default prop.//...
}

在system/core/set-verity-state/set-verity-state.cpp文件中修改:

static bool overlayfs_setup(bool enable) {auto change = false;
+#if 0errno = 0;if (enable ? fs_mgr_overlayfs_teardown(nullptr, &change): fs_mgr_overlayfs_setup(nullptr, nullptr, &change)) {if (change) {printf("%s overlayfs\n", enable ? "disabling" : "using");}} else if (errno) {printf("Overlayfs %s failed with error %s\n", enable ? "teardown" : "setup", strerror(errno));suggest_run_adb_root();}
+#endif
+  printf("overlayfs_setup(%d)",enable); //fix build errorreturn change;
}

至此,system部分的修改也结束了。

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

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

相关文章

C 语言关于sizeof() 和 strlen()区别?

sizeof() 和 strlen() 在 C 语言中两个非常常用&#xff0c;它们都与计算内存大小有关&#xff0c;但是它们的作用是不同的。 sizeof() 和 strlen() 的主要区别在于&#xff1a; sizeof() 是一个运算符&#xff0c;而 strlen() 是一个函数。sizeof() 计算的是变量或类型所占用…

day-05 删除子串后的字符串最小长度

思路 通过不断地检查是否含有"AB"或"CD"&#xff0c;如果有则将其从字符串中删除&#xff0c;直到"AB"或"CD"都不存在时&#xff0c;返回字符串的长度 解题方法 //检测是否有"AB" for(int i0;i<len-1;i){ if(s.charAt(i…

Python画国旗

前言 今天&#xff0c;我们来用turtle库来绘制国旗 一、美国国旗 国旗的形状是长方形;国旗的长宽之比为19:10&#xff0c;美国国旗由红、白、蓝三色组成;画面格局由两部分组成&#xff0c;旗的左上方蓝底上排列着50颗白色的星&#xff0c;6颗一排与5颗一排相间排列&#xff…

鸿蒙开发已解决-ArkTS开发webview,html页面中的input和按钮等操作均无响应

文章目录 项目场景:问题描述原因分析:解决方案(根据此方法即可解决此Bug):本文相关知识本Bug常规排除步骤ArkTS项目场景: 在鸿蒙开发过程遇到的问题: 问题 ArkTS API9 使用webview加载的html,页面中的按钮和input等操作均无响应 是有相关API设置webview是否可以touch或…

STM32(Cortex-M) 双堆栈MSP/PSP科普

https://blog.csdn.net/Guet_Kite/article/details/76020069 https://blog.csdn.net/zhuimeng_ruili/article/details/118163303 MSP/PSP是什么?作用&#xff1f; MSP主堆栈指针&#xff0c;PSP进程堆栈指针。 MSP&#xff1a;复位后缺省使用的堆栈指针&#xff0c;用于操作…

创建一个郭德纲相声GPTs

前言 在这篇文章中&#xff0c;我将分享如何利用ChatGPT 4.0辅助论文写作的技巧&#xff0c;并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元&#xff0c;很多人并不是天天用GPT&#xff0c;只是偶尔用一下。 如果调用官方的GPT4接口&…

K8S存储卷和数据卷

容器内的目录和宿主机的目录进行挂载 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制器创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会恢复到初始状态&#xff0c;一旦回到初始状态&#xff0c;所有的后天编辑的文件都会消失 容器…

年轻人2023消费图鉴,媒介盒子为你揭秘

回顾近一年的消费&#xff0c;发现大家差不多都是“扣扣嗖嗖的花了很多钱”&#xff0c;如果总结2023年的大众消费关键词&#xff0c;那一定是更加“理性”&#xff0c;据艾瑞咨询《2023年中国消费者洞察白皮书》显示&#xff0c;“精细化”成为2023年的消费关键词&#xff0c;…

十二、QProgressBar的简单使用与样式优化(Qt5 GUI系列)

目录 一、设计需求 二、实现代码 三、代码解析 四、总结 五、扩展(自定义QProgressBar样式) 一、设计需求 在很多应用程序中&#xff0c;在执行费时操作时都会展示一个进度条来展示操作进行的进度。常见的场景&#xff0c;如&#xff1a;拷贝操作、安装操作以及卸载操作。…

Unity组件开发--AB包打包工具

1.项目工程路径下创建文件夹&#xff1a;ABundles 2.AB包打包脚本&#xff1a; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEditor.SceneManagement; using UnityEngine; using UnityEngine.SceneManagement;public class AssetBundle…

Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互|计算属性|监听属性|Vue生命周期)

文章目录 一、表单控制二、购物车案例三、v-model进阶四、与后端交互跨域问题解决&#xff0c;三种交互方法跨域问题详解1-CORS&#xff1a;后端代码控制&#xff0c;上面案例采用的方式1) 方式一&#xff1a;后端添加请求头2) 方式二&#xff1a;编写中间件3) 方式三&#xff…

代理IP连接不上?网速过慢?自查与解决方法

当您使用代理时&#xff0c;您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中&#xff0c;我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

Mysql系列-1.Mysql基本使用

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

RT-Thread基于AT32单片机的485应用开发(二)

在上篇RT-Thread基于AT32单片机的485应用开发&#xff08;一&#xff09;中实现了RS485收发&#xff0c;但总觉得效率不高&#xff0c;函数封装也不完善。考虑到RS485总线应用都是主从式结构&#xff0c;比如工业领域常用的Modbus协议&#xff0c;都是以帧为单位进行收发&#…

【STK】手把手教你利用STK进行光电红外仿真04-STK/EOIR模块的实战操作1航天器星载相机对LEO卫星成像

STK/EOIR模块的实战操作1 任务目标及要求实战操作全过程1.建立仿真场景及环境2.目标航天器轨道设置3.跟踪航天器轨道设置4.EOIR传感器环境设置5.EOIR属性设置6.合成场景图像生成EOIR模块的这一系列前一部分如下: 【STK】手把手教你利用STK进行光电红外仿真01-STK/EOIR模块概述…

【python】内存管理和数据类型问题

一、内存管理 Python有一个自动内存管理机制&#xff0c;但它并不总是按照期望的方式工作。例如&#xff0c;如果创建了一个大的列表或字典&#xff0c;并且没有删除它&#xff0c;那么这个对象就会一直占用内存&#xff0c;直到Python的垃圾回收器决定清理它。为了避免这种情…

【Verilog】运算符

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 系列文章算术运算符关系运算符相等关系运算符逻辑运算符按位运算符归约运算符移位运算符条件运算符连接和复制运算符 算术运算符 …

全志T113开发板Qt远程调试

1引言 通常情况下工程师在调试Qt程序时&#xff0c;需要频繁制作镜像烧录到核心板来测试Qt程序是否完善&#xff0c;这样的操作既费时又费力。这时我们可以通过QtCreator设备功能&#xff0c;定义设备后&#xff0c;在x86_64虚拟机上交叉编译qt程序&#xff0c;将程序远程部署到…

cfa一级考生复习经验分享系列(十八)

考点回忆&#xff1a;其实机考大家的题目都不大一样&#xff0c;是抽题的形式&#xff0c;在这里只罗列一些我遇到的印象比较深&#xff0c;同时大家容易忽略或犯错的点。道德考了很多GIPS&#xff1b;经济学考了费雪方程、货币中性、价格歧视、需求的收入弹性计算&#xff1b;…