Android U user+root实现方案
背景
由于项目(MTK平台)上要实现user+root的版本,供特殊用户使用。Android T上的方案无效,经历了各种搜索查看资料,和bsp大佬一起通宵奋战,整出了方案。梳理记录下,有需要的同学可以参考。
Root代码实现原理
系统判断是否有root权限的地方在system/packages/modules/adb/daemon/main.cpp里面,
should_drop_privileges()函数返回false,表明可以root。
auth_required 是否需要adb鉴权(adb弹框确认),false时默认授权adb鉴权权限,不需要弹框确认。
userdebug 版本可以root是因为ro.secure = 0,代码路径build/core/main.mk 在should_drop_privileges()里面有判断
else # !user_variant# Turn on checkjni for non-user builds.ADDITIONAL_SYSTEM_PROPERTIES += ro.kernel.android.checkjni=1# Set device insecure for non-user builds.ADDITIONAL_SYSTEM_PROPERTIES += ro.secure=0
static bool should_drop_privileges() {// The properties that affect `adb root` and `adb unroot` are ro.secure and// ro.debuggable. In this context the names don't make the expected behavior// particularly obvious.//// ro.debuggable:// Allowed to become root, but not necessarily the default. Set to 1 on// eng and userdebug builds.//// ro.secure:// Drop privileges by default. Set to 1 on userdebug and user builds.bool ro_secure = android::base::GetBoolProperty("ro.secure", true);bool ro_debuggable = __android_log_is_debuggable();// Drop privileges if ro.secure is set...bool drop = ro_secure;// ... except "adb root" lets you keep privileges in a debuggable build.std::string prop = android::base::GetProperty("service.adb.root", "");bool adb_root = (prop == "1");bool adb_unroot = (prop == "0");if (ro_debuggable && adb_root) {drop = false;}// ... and "adb unroot" lets you explicitly drop privileges.if (adb_unroot) {drop = true;}return drop;
}
实现中遇到的问题
1,selinux问题(主要解决问题);
2,缺少su 和remount执行的bin文件;
具体实现方案和步骤
1),特殊版本标识,CUSTOM_ROOT_VERSION=yes,编译版本时需要export下该环境变量
2),添加flag,路径build/core/soong_config.mk
--- a/core/soong_config.mk
+++ b/core/soong_config.mk
@@ -58,6 +58,9 @@$(call add_json_bool, Debuggable, $(filter userdebug eng,$(TARGET_BUILD_VARIANT)))$(call add_json_bool, Eng, $(filter eng,$(TARGET_BUILD_VARIANT)))
+$(call add_json_bool, ROOTVersion, $(filter yes,$(CUSTOM_ROOT_VERSION)))$(call add_json_str, DeviceName, $(TARGET_DEVICE))
3),添加root版本的数据声明,设置root相关的flag需要
--- a/android/variable.go
+++ b/android/variable.go
@@ -151,6 +151,14 @@}}+ ROOTVersion struct {
+ Cflags []string
+ Cppflags []string
+ Init_rc []string
+ }Pdk struct {Enabled *bool `android:"arch_variant"`} `android:"arch_variant"`
@@ -315,6 +323,9 @@UseRBED8 *bool `json:",omitempty"`Debuggable *bool `json:",omitempty"`Eng *bool `json:",omitempty"`
+ ROOTVersion *bool `json:",omitempty"`Treble_linker_namespaces *bool `json:",omitempty"`
4),添加su 和 remount 模块,在产品的mk文件中添加
PRODUCT_PACKAGES +=remount
PRODUCT_PACKAGES +=su
5),在文件系统模块fs_mgr中添加ROOTVersion相应的flag,property_service中设置ro.secure和ro.debuggable的值
--- a/fs_mgr/Android.bp
+++ b/fs_mgr/Android.bp
@@ -118,6 +118,14 @@"-DALLOW_ADBD_DISABLE_VERITY=1",],},
+ ROOTVersion: {
+ cppflags: [
+ "-UALLOW_ADBD_DISABLE_VERITY",
+ "-DALLOW_ADBD_DISABLE_VERITY=1",
+ ],
+ },},header_libs: ["libfiemap_headers",
@@ -248,6 +256,17 @@"clean_scratch_files.rc",],},
+ ROOTVersion: {
+ cppflags: [
+ "-UALLOW_ADBD_DISABLE_VERITY",
+ "-DALLOW_ADBD_DISABLE_VERITY=1",
+ ],
+ init_rc: [
+ "clean_scratch_files.rc",
+ ],
+ },},symlinks: ["clean_scratch_files",--- a/init/Android.bp
+++ b/init/Android.bp
@@ -149,6 +149,13 @@"-DSHUTDOWN_ZERO_TIMEOUT=1",],},
+ ROOTVersion: {
+ cppflags: [
+ "-DROOT_VERSION",
+ ],
+ },uml: {cppflags: ["-DUSER_MODE_LINUX"],},--- a/init/property_service.cpp
+++ b/init/property_service.cpp
@@ -1328,6 +1328,19 @@}}+ bool adbAuthorized = false;
+#ifdef ROOT_VERSION
+ adbAuthorized = true;
+#endif
+ if (adbAuthorized) {
+ InitPropertySet("ro.adb.secure", "0");
+ InitPropertySet("ro.debuggable", "1");
+ }
+for (const auto& [name, value] : properties) {
6)adb模块添加权限的判断,和5)中设置属性的值有重复,此处是为了确保生效。有时间的同学可以验证下去掉这一步看是否生效。
should_drop_privileges()函数最后添加
#ifdef CUSTON_ROOT_VERSIONreturn false;
#endif
drop_privileges()函数最后添加
#ifdef CUSTON_ROOT_VERSIONauth_required=false;
#endif
7),最重要的一步,更换sepolicy文件为debug版本的
(1)添加sepolicy,src文件是debug版本的,修改路径system/sepolicy/android.bp
--- a/Android.bp
+++ b/Android.bp},}+se_policy_cil {
+ name: "userdebug_plat_sepolicy_debug.cil",
+ src: ":userdebug_plat_sepolicy.conf",
+ additional_cil_files: [":sepolicy_technical_debt{.plat_private}"],
+ dist: {
+ targets: ["droidcore"],
+ },
+}
+// A copy of the userdebug_plat_policy in GSI.
(2),同路径下mk文件加入编译
--- a/Android.mk
+++ b/Android.mkLOCAL_REQUIRED_MODULES += \userdebug_plat_sepolicy.cil \+ifeq ($(strip $(CUSTOM_ROOT_VERSION)),yes)
+LOCAL_REQUIRED_MODULES += \
+ userdebug_plat_sepolicy_root.cil
+endif
(3)代码中加载sepolicy地方GetUserdebugPlatformPolicyFile()也使用上面生成的sepolicy文件,代码路径system/core/init/selinux.cpp
std::optional<const char*> GetUserdebugPlatformPolicyFile() {
+#ifdef DF_VERSION
+ return "/system/etc/selinux/userdebug_plat_sepolicy_root.cil";
+#endif
至此,Android U版本user+root+remount方案修改完成。
相关文章:
Android U user+root实现方案
背景 由于项目(MTK平台)上要实现userroot的版本,供特殊用户使用。Android T上的方案无效,经历了各种搜索查看资料,和bsp大佬一起通宵奋战,整出了方案。梳理记录下,有需要的同学可以参考。 Root…...
CSS3 Transform变形理解与应用
Transform:对元素进行变形; Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画。但只有两个关键贞。开始,结束。 Animation:对元素某个属…...
语音克隆技术浪潮:探索OpenAI Voice Engine的奇妙之旅
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
将Python程序打包为Windows安装包
本文使用创作助手。 如果你想将Python程序打包为Windows安装包,你可以使用NSIS(Nullsoft Scriptable Install System)工具。NSIS是一个免费的Windows安装包创建工具。 以下是使用NSIS将Python程序打包为Windows安装包的步骤: 首…...
一个基于大数据的派单管理系统
通常需要处理大量的订单数据,并确保这些数据能够在各个相关部门之间高效、准确地传递。这样的系统不仅有助于提高派单效率,还能优化资源配置,减少不必要的浪费。以下是一个包含所需元素的系统设计方案概述: 数据结构 订单号&…...
【单片机 5.3开关检测】
文章目录 前言一、5.3开关检测1.1没按键按下的1.2有按键按下的 二、改进1.改进 三、独立键盘3.1为什么要取反3.2 实用的按键 总结 前言 提示:这里可以添加本文要记录的大概内容: 课程需要: 提示:以下是本篇文章正文内容…...
每天五分钟计算机视觉:如何基于滑动窗口技术完成目标的检测?
汽车检测算法 现在我们想要构建一个汽车检测算法,我们希望输入到算法中一张图片,算法就可以帮助我们检测出这张图片中是否有汽车。 数据集 首先创建一个标签训练集,x是样本,y是标签。我们的训练集最好是被剪切过的图片,剪掉汽车以外的部分,使汽车居于中间位置,就是整张…...
wpf ContextMenu
ContextMenu上下文菜单 ContextMenu 在 WPF 中是一个非常有用的控件,它提供了一个在用户执行特定操作(如右键点击)时显示的菜单。ContextMenu 可以附加到几乎所有的 WPF 控件上,使得当用户与这些控件互动时,能够提供一…...
增加网站搜索引擎排名的6个准则
怎样提高网站排名首页 在竞争激烈的网络世界中,网站的排名对于吸引流量和提升曝光至关重要。登上搜索引擎结果页面的首页,意味着更多的曝光和点击率。以下是一些方法,可以帮助您提高网站在搜索引擎中的排名,让其跻身首页…...
【数据库索引】【面试题】【SQL】什么时候不需要用索引?
在数据库查询优化中,索引是一种重要的工具,可以提高查询性能。然而,并不是所有的情况下都适合使用索引。 以下是一些情况下(收集整理)不建议使用索引: 更新频繁的列:索引会占用数据库资源,当列经常被更新时,索引可能会变得过时,导致查询性能下降。 小数值类型:对于…...
RISC-V/ARM mcu OpenOCD 调试架构解析
Risc-v/ARM mcu OpenOCD 调试架构解析 最近有使用到risc-v的单片机,所以了解了下risc-v单片机的编译与调试环境的搭建,面试时问到risc-v的调试可参看以下内容。 risc-v根据官方的推荐,调试器服务是选择OpenOCD,DopenOCD(开放片上…...
HackTheBox-Mist
整体思路 端口扫描->Pluck CMS组件文件读取漏洞->文件上传获取shell->创建指向exe的快捷方式来提权-> 信息收集&端口利用 namp -sSVC 10.10.11.17目标只开放了80端口,将mist.htb加入到hosts文件后,访问mist.htb Pluck CMS文件读取 在…...
游戏引擎中的声音系统
一、声音基础 1.1 音量 声音振幅的大小 压强p:由声音引起的与环境大气压的局部偏差 1.2 音调 1.3 音色 1.4 降噪 1.5 人的听觉范围 1.6 电子音乐 将自然界中连续的音乐转换成离散的信号记录到内存中 采样 - 量化 - 编码 香农定理:采样频率是信…...
【WPF应用29】WPF中的ComboBox控件详解与应用示例
在Windows Presentation Foundation(WPF)应用程序开发中,ComboBox控件是一个非常重要的基础控件,它提供了一个下拉列表,允许用户从预定义的选项中选择一个值。ComboBox控件结合了文本框和列表框的功能,既能…...
Unity UGUI之Text组件基础认识
Text组件用于在游戏中显示文本。 下面来细看下它的基本信息。 一、基本属性: 如上图所示,即为Text组件的一些基本属性,其中, Text:要显示的文本内容。Font:文本所使用的字体。Font Style(字体…...
LeetCode 2810.故障键盘:双端队列模拟
【LetMeFly】2810.故障键盘:双端队列模拟 力扣题目链接:https://leetcode.cn/problems/faulty-keyboard/ 你的笔记本键盘存在故障,每当你在上面输入字符 i 时,它会反转你所写的字符串。而输入其他字符则可以正常工作。 给你一个…...
ssm015基于java的健身房管理系统的设计与实现+vue
健身房管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本健身房管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间…...
【解决方案】荣耀系统Android8.0 system目录Read-only file system
本来以为直接把Charles证书改成系统证书格式,然后通过mt管理器root之后移动到系统证书目录就行了,结果访问baidu仍然显示网络错误,折腾一晚上。安装为用户证书,又与系统证书冲突。 手机型号:荣耀v10 EMUI:…...
【Web】记录Polar靶场<简单>难度题一遍过(全)
目录 swp 简单rce 蜜雪冰城吉警店 召唤神龙 seek flag jwt login iphone 浮生日记 $$ 爆破 XFF rce1 GET-POST 被黑掉的站 签到题 签到 session文件包含 Dont touch me robots php very nice ezupload cookie欺骗 upload 干正则 co…...
生产制造园区数字孪生3D大屏展示提升运营效益
在智慧园区的建设中,3D可视化管理平台成为必不可少的工具,数字孪生公司深圳华锐视点打造的智慧园区3D可视化综合管理平台,致力于将园区的人口、经济、应急服务等各项业务进行3D数字化、网络化处理,从而实现决策支持的优化和管理的…...
R语言技能 | 不同数据类型的转换
原文链接:R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天,再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢? 我们在使用R语言做数据分析时,会一直对数据进行不同类型的转换,有时候…...
python如何处理文本错误
在python中,如果读取的文本文件不在程序的目录中,会提示FileNotFoundError 如果不能确定文本文件是否在目录中,可以用try except语句 代码如下 from pathlib import PathpathPath(alice.txt) try:contentspath.read_text(encodingutf_8) e…...
Cesium 批量种树
1、准备树种建模 分各种级别建模LOD1-LODN 其中meta.json长这样: Gltf再3Dmax中导出Obj,再通过ObjToGltf的工具转换,参考 https://editor.csdn.net/md/?articleId96484597 2、准备shp点数据。(shp中的点位就是种树的位置) 3、准…...
Docker基础系列之TLS和CA认证
Docker基础系列之TLS和CA认证 文章目录 Docker基础系列之TLS和CA认证1. 引言2. 初识TLS和CA3. 开启TLS和CA认证3.1 生成证书3.2 配置TLS 4. 参考和感谢 1. 引言 我们日常工作当中会遇到这些需求: 监控Docker容器在idea开发工具中连接Docker,直接发布至…...
总结:微信小程序中跨组件的通信、状态管理的方案
在微信小程序中实现跨组件通信和状态管理,有以下几种主要方案: 事件机制 通过事件机制可以实现父子组件、兄弟组件的通信。 示例: 父组件向子组件传递数据: 父组件: <child binddata"handleChildData" /> 子组件: Component({..., methods: { handleChildData(…...
企业能耗数据分析有哪些优势?怎样进行分析?
随着互联网技术的发展,企业在运营中会出现大量的用能数据,但却做不了精准的用能数据分析,导致数据没有得到有效利用,以及产生能源浪费现象。 为什么企业用能分析总是难? 一、用能分析过程复杂 由于用能分析过于复杂…...
containerd配置HTTP私仓
文章目录 1. 🛠️ 基础环境配置2. 🐳 Docker安装3. 🚢 部署Harbor,HTTP访问4. 📦 部署ContainerD5. 🔄 修改docker配置文件,向harbor中推入镜像6. 配置containerd6.1. 拉取镜像验证6.2. 推送镜像…...
掌握Go语言:Go语言类型转换,无缝处理数据类型、接口和自定义类型的转换细节解析(29)
在Go语言中,类型转换指的是将一个数据类型的值转换为另一个数据类型的过程。Go语言中的类型转换通常用于将一种数据类型转换为另一种数据类型,以满足特定操作或需求。 类型转换的基本语法 在Go语言中,类型转换的基本语法为: ne…...
Chatgpt掘金之旅—有爱AI商业实战篇|文案写作|(三)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、前言 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随着AI技术的快速发展和应用领域的不断拓展&…...
c++20 的部分新概念及示例代码-Contracts,Ranges
C20 引入了 contracts(契约),这是一种编程范式,它允许程序员在代码中添加先决条件(preconditions)、后置条件(postconditions)和断言(assertions)等契约&…...
手机网站跟PC端网站有啥区别/我要推广网
确定字符串长度int strlen(string str)比较两个字符串1、strcmp函数对两个字符串进行二进制安全的比较,并区分大小写int strcmp(string str1,string str2)2、以不区分大小写的方式比较两个字符串int strcasecmp(string str1,string str2)3、求两个字符串相同部分int…...
西安做网站设计的公司/百度搜索排行
网关,网关工作原理是什么?网关_1顾名思义,网关(Gateway)就是一个网络连接到另一个网络的“关口”。大家都知道,从一个房间走到另一个房间,必然要经过一扇门。同样,从一个网络向另一个网络发送信息,也必须经过一道“关…...
wordpress数据库查询/百度400电话
当我们在开发的时候,有时会将一些方法封装起来供别人调用,下面就是一种生成DLL的方法: 开始-》程序-》Microsoft Visual Studio 2005-》Visual Studio Tools-》Visual Studio 2005 命令提示 然后进入你的类…...
网站数据库怎么备份/网址解析ip地址
和...
钓鱼网站在线生成/短视频平台推广
学习记录: 第一天的学习中老师教了Python一些相关的基础知识 # 数字类型# 整型int# number 100 # int(100)# number2 int(100)# print(number)# print(number2)# 浮点型 float# sal 15.0 # float(15.0)# sal2 float(15.0)# print(sal)# print(sal2)# 字符串类…...
手机app与网站链接/网络营销活动策划方案
元字符 . 除了换行符以外的任意一个字符 \w 匹配数字字母下划线 \s 匹配空白符 \d 匹配数字 \n 匹配换行符 \t 制表符^ 匹配字符串的开始 $ 匹配字符串的结束\W 匹配非字母或数字或下划线 \D 非数字 \S 非空白a|b 匹配字符a或者b () 匹配括号的表达式 [...] 匹配字符组中的字符…...