Android 13 Framework 裁剪

裁剪应用

1. 修改 build/core/product.mk

添加PRODUCT_DEL_PACKAGES变量的声明
新增一行_product_single_value_vars += PRODUCT_DEL_PACKAGES

# The first API level this product shipped with
_product_single_value_vars += PRODUCT_SHIPPING_API_LEVEL
_product_single_value_vars += PRODUCT_DEL_PACKAGES # 新增_product_list_vars += VENDOR_PRODUCT_RESTRICT_VENDOR_FILES
_product_list_vars += VENDOR_EXCEPTION_MODULES

2. 修改 build/core/main.mk

修改 product-installed-files 函数的定义,增加两行:

$(eval _pif_dels := ( c a l l g e t − p r o d u c t − v a r , (call get-product-var, (callgetproductvar,(1),PRODUCT_DEL_PACKAGES))
$(eval _pif_modules := $(filter-out $(_pif_dels), $(_pif_modules))) \

  $(eval ### Filter out the overridden packages and executables before doing expansion) \$(eval _pif_overrides := $(call module-overrides,$(_pif_modules))) \$(eval _pif_modules := $(filter-out $(_pif_overrides), $(_pif_modules))) \$(eval _pif_dels := $(call get-product-var,$(1),PRODUCT_DEL_PACKAGES)) \$(eval _pif_modules := $(filter-out $(_pif_dels), $(_pif_modules))) \$(eval ### Resolve the :32 :64 module name) \

3. 在相应的设备产品mk文件中添加用PRODUCT_DEL_PACKAGES属性来控制模块删除

一般编辑的文件路径为device/公司名/产品名/device.mk, 比如rk3399中:
device/rockchip/rk3399/device.mk

我用的模拟器,使用 lunch sdk_pc_x86_64-userdebug,文件位置为:
aosp/build/target/board/emulator_x86_64/device.mk

PRODUCT_SOONG_NAMESPACES += device/generic/goldfish # for libwifi-hal-emu
PRODUCT_SOONG_NAMESPACES += device/generic/goldfish-opengl # for goldfish deps.ifdef NET_ETH0_STARTONBOOTPRODUCT_VENDOR_PROPERTIES += net.eth0.startonboot=1
endif# Ensure we package the BIOS files too.
PRODUCT_HOST_PACKAGES += \bios.bin \vgabios-cirrus.bin \# 要裁剪的应用
PRODUCT_DEL_PACKAGES += \messaging \Dialer \Contacts \Email \Camera2 \Browser2 \Calendar \DocumentsUI \Music \MusicFX \ExactCalculator \

4. 进行编译

source build/envsetup.sh
# lunch sdk_pc_x86_64-userdebug # 模拟器
lunch xxx-userdebug #xxx表示对应的产品名
make

Android12 系统的裁剪编译规则

裁剪Service,打印机服务

1. 定义boolean变量,从全局属性读取配置

boolean disablePrinter = SystemProperties.getBoolean("config.disable_printer", false);

2. 根据属性判断是否启动服务

if (!disablePrinter && mPackageManager.hasSystemFeature(PackageManager.FEATURE_PRINTING)) {mSystemServiceManager.startService(PRINT_MANAGER_SERVICE_CLASS);
}

3. 增加配置参数

在PRODUCT_PROPERTY_OVERRIDES中增加 config.disable_printer 配置
位置:/data/aosp/build/target/board/emulator_x86_64/device.mk

# 裁剪应用
PRODUCT_DEL_PACKAGES += \messaging \Dialer \Contacts \Email \Camera2 \Browser2 \Calendar \DocumentsUI \Music \MusicFX \ExactCalculator \# printer服务是否开启
PRODUCT_PROPERTY_OVERRIDES += \config.disable_printer=true

5. 屏蔽SystemFeature

查找含有<feature name=“android.software.print” /> 的文件,
通过aosp/frameworks/base/core/java/com/android/server/SystemConfig.java的readAllPermissions方法可知,会在以下文件夹获取打印特性配置文件。

  • /system/etc/permission
  • /system/etc/sysconfig
  • /vendor/etc/permission
  • /vendor/etc/sysconfig
  • /oem/etc/permission
  • /oem/etc/sysconfig
  • /odm/etc/permission
  • /odm/etc/sysconfig
  • /product/etc/permission
  • /product/etc/sysconfig
  • /system_ext/etc/permission
  • /system_ext/etc/sysconfig

查找具体位置,是/vendor/etc/permissions/handheld_core_hardware.xml文件中设置

cd /vendor/etc
find ./ -type f  -exec grep -rn "software.print" {} \; 

再查找源文件,发现是在frameworks/native/data/etc/handheld_core_hardware.xml文件中,
注释掉 <feature name=“android.software.print” />

find ./ -name "*.mk" -exec grep -rn "handheld_core_hardware"  {} \;

6. 修改汇总

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

7. 重新编译,刷机

删掉out目录下的build.prop,重新编译system(或者直接修改build.prop然后make snod)

通过build.prop生成过程的分析,可知可以修改buildinfo.sh;、 system.prop;、ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。建议改system.prop或PRODUCT_PROPERTY_OVERRIDES

8. 修改系统文件改变属性值

emulator -writable-system
adb root
adb remount
adb disable-verity
adb reboot# 待手机重启
adb root
adb remount

修改config.disable_printer属性


adb pull /system/build.prop
# 修改导出的build.prop,末尾增加
####################################
# from variable PRODUCT_SYSTEM_DEFAULT_PROPERTIES
####################################
# Auto-added by post_process_props.py
persist.sys.usb.config=adb
config.disable_printer=false # 增加
# end of fileadb push build.prop /system/build.prop
adb reboot

修改handheld_core_hardware.xml文件

位置:/vendor/etc/permissions/handheld_core_hardware.xml

9. 测试

adb shell service list # 服务列表
adb shell service check  printer # 检查服务是否开启

Android属性之build.prop生成过程分析
裁剪SystemServer服务以及关闭SystemFeature

adb remount fails - mount: ‘system’ not in /proc/mounts
关于如何修改android系统system文件夹下build.prop文件参数

其他

常用命令

adb shell pm list package -f # 应用和对应的包
find QSSI.12/out/target/product/qssi/ -name QtiDialer | xargs rm -rf # 查找,删除文件
模块make 命令mmm 命令
initmake initmmm system/core/init
zygotemake app_processmmm frameworks/base/cmds/app_process
system_servermake servicesmmm frameworks/base/services
java frameworkmake framework-minus-apexmmm frameworks/base
res frameworkmake framework-resmmm frameworks/base/core/res
jni frameworkmake libandroid_runtimemmm frameworks/base/core/jni
bindermake libbindermmm frameworks/native/libs/binder

我们也可以使用 allmod 指令查看所有的 module,再使用 make 指令编译我们需要的模块。

Android 编译之make基础
Android10.0编译系统
android device.mk文件在哪里

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

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

相关文章

本地存储 sessionStoragelocalStorage

随着互联网的快速发展&#xff0c;基于网页的应用越来越普遍&#xff0c;同时也变的越来越复杂&#xff0c;为了满足各种各样的需求&#xff0c;会经常性在本地存储大量的数据&#xff0c;HTML5规范提出了相关解决方案。 本地存储特性 数据存储在用户浏览器中 设置、读取方便、…

使用字节流读取文件中的数据的几种方式

public class FileReader02_ {public static void main(String[] args) {}Testpublic void m1() {String filePath "e:\\hello.txt";FileReader fileReader null;int date0;try {fileReader new FileReader(filePath);//循环读取 使用readwhile ((datefileReader.…

【opencv】【CPU】windows10下opencv4.8.0-cuda C++版本源码编译教程

【opencv】【CPU】windows10下opencv4.8.0-cuda C版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】【CPU】windows10下opencv4.8.0-cuda C版本源码编译教程前言准备工具cmakeopencv4.8.0opencv_contrib CMake编译VS2…

react-antd组件 input输入框: 实现按回车搜索

目录 法1&#xff1a; 法2&#xff1a; 法1&#xff1a; 在Input组件上绑定onKeyUp方法 import { Input, message } from antd;class App extends React.Component{handeleSousuo () > {this.props.form.validateFields((error, values) > {if(!error){axios.post().t…

【c++】 跟webrtc学周期性任务:tgcalls 5 网络超时检查

tgcalls 网络超时检查 G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\NetworkManager.cppPostDelayedTask 使用的是rtc thread 方法 PostDelayedTask :G:\CDN\P2P-DEV\Libraries\tg_owt\src\rtc_base\thread.htemplate <class Closure,typename st…

uniapp: 本应用使用HBuilderX x.x.xx 或对应的cli版本编译,而手机端SDK版本是 x.x.xx。不匹配的版本可能造成应用异常。

文章目录 前言一、原因分析二、解决方案2.1、方案一&#xff1a;更新HbuilderX版本2.2、方案二&#xff1a;设置固定的版本2.3、方案三&#xff1a;忽略版本&#xff08;不推荐&#xff09; 三、总结四、感谢 前言 项目场景&#xff1a;示例&#xff1a;通过使用HbuilderX打包…

Hive特殊函数的使用

Hive特殊函数的使用 with ascastget_json_objectunix_timestampfrom_unixtime with as 在Hive中&#xff0c;WITH AS是一种子查询的用法&#xff0c;用于在查询的开头定义一个临时表达式。它的语法结构如下: WITH [表达式名称] AS (子查询表达式 )在这个结构中&#xff0c;[表…

Apache JMeter 安装教程

下载&#xff1a; 注意事项&#xff1a;使用JMeter前需要配置JDK环境 下载地址 下载安装以后&#xff0c;打开安装的bin目录 D:\software\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin&#xff0c;找到jmeter.bat&#xff0c;双击打开 打开后的样子 语言设置&#xff1a; 1…

android鼠标滚轮事件监听方法

Overridepublic boolean onGenericMotionEvent(MotionEvent event) { //The input source is a pointing device associated with a display. //输入源为可显示的指针设备&#xff0c;如&#xff1a;mouse pointing device(鼠标指针),stylus pointing device(尖笔设备)if (0 ! …

【高效开发工具系列】Postman

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

PostPreSql 数据库的一些用法

1、varchar 类型转换成数字 select sum(CAST(order_num AS NUMERIC)) from ads_port_cli_cons_freq_rpt where yr2023 and mon 08

“人类高质量数据”如何训练计算机视觉模型?

人类的视觉系统可以复制吗&#xff1f; 答案是肯定的。 计算机视觉 (Computer Vision) 技术的不断普及&#xff0c;让机器识别和处理图像就像人的大脑一样&#xff0c;且速度更快、更准确。 机器像人类一样去“思考” 计算机视觉 (Computer Vision) 是近年来人工智能增长最快…

Python遍历删除列表元素的一个奇怪bug

假定有一个Python列表&#xff0c;比如[CFFEX.IF, CFFEX.TS,SHFE.FU]&#xff0c;现在需要将其中带‘CFFEX’前缀的所有元素都删除。在使用列表推导式一行代码搞定之前&#xff0c;用了一种最朴素的遍历删除方法&#xff0c;结果出现了意想不到的的问题。复盘了下&#xff0c;结…

Windows客户端下pycharm配置跳板机连接内网服务器

问题&#xff1a;实验室服务器仅限内网访问&#xff0c;无法在宿舍&#xff08;外网&#xff09;访问实验室的所有内部服务器&#xff0c;但同时实验室又提供了一个外网可以访问的跳板机&#xff0c;虽然可以先ssh到跳板机再从跳板机ssh到内网服务器&#xff0c;但这种方式不方…

【Kotlin精简】第6章 反射

1 反射简介 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff0c;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性。 1.1 Kotlin反射 我们对比Kotlin和Java的反射类图。 1.1.1 Kotlin反射常用的数据结…

MySQL3:MySQL中一条更新SQL是如何执行的?

MySQL3&#xff1a;MySQL中一条更新SQL是如何执行的&#xff1f; MySQL中一条更新SQL是如何执行的&#xff1f;1.Buffer Pool缓冲池2.Redo logredo log作用Redo log文件位置redo log为什么是2个&#xff1f; 3.Undo log4.更新过程5.InnoDB官网架构InnoDB架构-内存结构①Buffer …

启动内核ip转发和其他优化

1.临时修改 echo 1 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse 2.配置文件修改 vim /etc/sysctl.conf net.ipv4.ip_forward 1 net.ipv4.tcp_tw_reuse 1 vm.swappiness 0 kernel.sysrq 1 net.ipv4.neigh.default.gc_stale_t…

BES2700 蓝牙协议之RFCOMM通道使用方法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 BES2700 RFCOMM通道使用方法 RFCOMM_CHANNEL_NUM 枚举定义了一系列的通道号码,并为每个通道号码指定了一个具体的名称。以下是其中一些通道的中文含义: RFCOMM_CHAN…

Java基础-字符串

Java基础-字符串 StringString构造方法代码实现内存分析 String的常用方法比较练习 - 遍历字符串 ( charAt(), length() )练习 - 字符串拼接练习 - 手机号屏蔽 ( substring() )练习 - 敏感词替换 ( replace() ) StringBuilder概述基本操作 StringJoiner概述基本操作 字符串原理…

Go语言入门心法(十六):Go远程过程调用框架GRPC实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…