Android——编译安装Module的控制因素

【Android 12 AOSP学习】Android内置第三方apk到系统 这篇文章将介绍如何在Android系统中内置第三方apk 阅读详情

 在前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别,

其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程。


                                                                  撰写不易,转载请注明出处:http://blog.youkuaiyun.com/jscese/article/details/39209341

一.LOCAL_MODULE_TAGS:

首先还是这个放在Android.mk中的变量,默认在/build/core/base_rules.mk 中:

LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))
ifeq (,$(LOCAL_MODULE_TAGS))
  LOCAL_MODULE_TAGS := optional
endif

而且并不是 LOCAL_MODULE_TAGS :=optional 就会都安装进system.img !


LOCAL_MODULE_TAGS 在 android 4.2 能取的值有:

# Only the tags mentioned in this test are expected to be set by module
# makefiles. Anything else is either a typo or a source of unexpected
# behaviors.
ifneq ($(filter-out debug eng tests optional samples shell_ash shell_mksh,$(LOCAL_MODULE_TAGS)),)
$(warning unusual tags $(LOCAL_MODULE_TAGS) on $(LOCAL_MODULE) at $(LOCAL_PATH))
endif

debug eng tests optional samples shell_ash shell_mksh  这几个值,没有user ,这是跟之前的一个差别!


其中TARGET_BUILD_VARIANT 还是对应:


eng  : 

默认类型,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

ifeq ($(TARGET_BUILD_VARIANT),eng)
tags_to_install := debug eng

安装 PRODUCT_PACKAGES 中定义的Module


user   :

用于发行版,像之前描述的关闭log,shel,rootl,编译出odex Android——编译odex保护 

 LOCAL_MODULE_TAGS 的值不能为 user

安装哪些Module 只依赖与 PRODUCT_PACKAGES


userdebug   :

用于调试,安装 LOCAL_MODULE_TAGS 的类型为/build/core/main.mk:

  ifeq ($(user_variant),userdebug)
    # Pick up some extra useful tools
    tags_to_install += debug


安装 PRODUCT_PACKAGES 中定义的Module



symbols 目录 :

这里记录一种现象,不管 Module 是apk 还是 lib ,有的时候在单独 mmm 编译 的时候,

是可以安装到  /out 中的system对应位置的,最后能够打包进系统的system.img


但是 如果整体的 make -j* 编译系统,那么 对应的 apk .lib 就会生成在 /out 下的 symbols/system 对应的位置,

最后是不会打包进系统system.img 的!


这就是因为 Module 的LOCAL_MODULE_TAGS 和当前的编译的TARGET_BUILD_VARIANT 没有满足上面说到的规则,

Module 并不认定为需要 install 的!

可以按照上面的规则,修改Module的 LOCAL_MODULE_TAGS 或者 看下面的 在 PRODUCT_PACKAGES 中添加 Module !


这里只区分对Module的安装控制,可以看到在4.2 中 对Module的控制级别最高的是 PRODUCT_PACKAGES 这个变量!



二.PRODUCT_PACKAGES :

这个变量在很多.mk中都有赋值,比如在device中的 device.mk 中,而且都是 类似这样的:

# jscese add libusb and compat lib ,usb-modeswitch execute binary for 3G 
PRODUCT_PACKAGES += \
    rild \
    libusb \
    libusb-compat \
    usb_modeswitch 
#end

都是 += 累加操作!

这就代表这些Module 无论如何都会被编译安装进系统。

简单记录下PRODUCT_PACKAGES 的作用过程:

首先在main.mk中的

product_MODULES 以及 product_FILES :

  # The base list of modules to build for this product is specified
  # by the appropriate product definition file, which was included
  # by product_config.make.
  product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
  # Filter out the overridden packages before doing expansion
  product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
      $(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
  $(call expand-required-modules,product_MODULES,$(product_MODULES))
  product_FILES := $(call module-installed-files, $(product_MODULES))


modules_to_install :

modules_to_install := $(sort \
    $(ALL_DEFAULT_INSTALLED_MODULES) \
    $(product_FILES) \
    $(foreach tag,$(tags_to_install),$($(tag)_MODULES)) \
    $(call get-tagged-modules, shell_$(TARGET_SHELL)) \
    $(CUSTOM_MODULES) \
  )

这个就是需要安装的一个变量了,有用到上面说得到的变量 tags_to_install  还有 product_FILES

modules_to_install 还会经过一些过滤处理,具体可看main.mk中


ALL_DEFAULT_INSTALLED_MODULES :

# build/core/Makefile contains extra stuff that we don't want to pollute this
# top-level makefile with.  It expects that ALL_DEFAULT_INSTALLED_MODULES
# contains everything that's built during the current make, but it also further
# extends ALL_DEFAULT_INSTALLED_MODULES.
ALL_DEFAULT_INSTALLED_MODULES := $(modules_to_install)
include $(BUILD_SYSTEM)/Makefile
modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES))
ALL_DEFAULT_INSTALLED_MODULES :=

再加载进Android的 Makefile 文件,其中根据 ALL_DEFAULT_INSTALLED_MODULES 进行安装!这里暂不深入。


make 编译的时候的依赖如下:

droid:

# Building a full system-- the default is to build droidcore
droid: droidcore dist_files
...
.PHONY: droid


droidcore :

# Build files and then package it into the rom formats
.PHONY: droidcore
droidcore: files \
    systemimage \
    $(INSTALLED_BOOTIMAGE_TARGET) \
    $(INSTALLED_RECOVERYIMAGE_TARGET) \
    $(INSTALLED_USERDATAIMAGE_TARGET) \
    $(INSTALLED_CACHEIMAGE_TARGET) \
    $(INSTALLED_FILES_FILE)


files :

# All the droid stuff, in directories
.PHONY: files
files: prebuilt \
        $(modules_to_install) \
        $(modules_to_check) \
        $(INSTALLED_ANDROID_INFO_TXT_TARGET)

 可以看到 依赖到了 上面分析到的 modules_to_install   !




Android 开机加速优化 Android 开机加速优化 文章目录Android 开机加速优化关闭BootLoader的企鹅关闭开机动画Android关闭锁屏删除预装APP查看预装APP删除编译生成的APK不编译APK1. 统一配置2. 修改单个APK的Android.mk谷歌APP高通APP关闭系统服务修改LOG打印级别并发加载class和resource等资源readahead机制预加载测试1. 关闭系统服务2. 显示3. 删除预装APP4. 其它 关闭BootLoader的企鹅 # kernel/msm-4.9/arch/arm 阅读详情

相关推荐

Android AAR打包全指南:从Module创建到Maven发布实战

在Android工程化与组件化开发中,如何高效复用代码和资源是团队协作的核心问题。Android Library作为模块化交付的基础单元,最终以AAR格式打包,将编译后的类、资源、清单与so库封装为单一文件。借助Gradle构建系统,开发者可一键生成AAR,并结合Maven仓库实现依赖传递与版本管理,解决手工拷贝文件的低效与依赖冲突。该方案适用于SDK对外交付、多App复用基础库、组件化隔离等典型场景。本文从Library Module的创建、打包参数配置、混淆规则,到本地与远程Maven发布、工程集成联调

weixin_34055787的博客 312

android 预置apk总结

1.概述:介绍预置apk的种类,流程及具体方法2.预置apk方法分类:预置apk按有无源码分的话可以分为两种,一种是有apk源码的预置方式,一种是无源码的预置apk方式,区别是mk文件写发不同;按预置的用途分的话可以分为3种,一种是预置apk不可删除,一种是可删除恢复出厂设置后还存在,一种是可删除恢复出厂设置后不存在,区别 也是mk文件写法不同3.预置apk的流程3.1首先系统原生的apk的方法一...

u010672559的博客 1897

深入Android.mk:从预编译APK集成看RK平台WebView模块的构建与配置

本文深入探讨了在RK3128平台搭载Android 7.1系统中,如何通过Android.mk文件正确集成预编译的WebView模块。详细解析了预编译APK的技术背景、Android.mk关键配置、系统集成与vendor目录管理,以及高级技巧与疑难排查,帮助开发者高效完成WebView模块的构建与配置。

weixin_30335353的博客 293

LOCAL_MODULE_TAGS 选项说明

1,LOCAL_MODULE_TAGS :=user \ eng \ tests \ optional user:指该模块只在user版本下才编译 eng:指该模块只在eng版本下才编译 tests:指该模块只在tests版本下才编译 optional:指该模块在所有版本下都编译 (1),eng This is the default fl...

mmdev 878

Ubuntu搭建安卓开发环境:从SDK配置到模拟器调试全攻略

Linux 系统因其稳定性和可定制性,成为越来越多开发者的主力平台。在 Ubuntu 上构建安卓开发环境,核心思路是理解 Android 工具链的组成与依赖关系。从 Java 运行环境、Android SDK 的平台工具与构建工具,到 Gradle 依赖仓库的加速,每一步都涉及环境变量与系统权限的配置。掌握这些底层原理,不仅能解决 SDK 路径、adb 连接等常见问题,还能为后续的高效调试打下基础。无论是新装系统后的快速部署,还是从 Windows 迁移后的环境重建,一套清晰的配置流程能显著减少踩坑时间。本

weixin_34174322的博客 417

Ubuntu 18.04 SSH双因素认证实战:基于Google Authenticator的PAM集成

双因素认证(2FA)是现代系统身份验证的核心安全机制,其原理在于融合‘所知’(密码)与‘所持’(动态令牌)两类凭证,显著提升账户抗暴力破解能力。在Linux服务器场景中,基于时间的一次性密码(TOTP)因离线可用、标准开放、部署轻量,成为运维首选方案。它不依赖网络服务,兼容性强,特别适用于Ubuntu 18.04等长期支持但原生无MFA界面的老版本系统。本文聚焦于通过libpam-google-authenticator模块,在SSH登录、sudo及本地终端等全路径实现强制TOTP验证,覆盖时间同步校准、P

germmy-神一样的开发 481

Android关于控制模块编译的几个问题

1、某个应用可以编译,只是不在Launcher上显示Icon。只需要修改该应用的AndroidManifest.xml文件。修改如下: <activity android:name="com.example.noiconapp.MainActivity" android:label="@string/app_name" > <...

Kitty_London2 700

Vulkan着色器编译性能优化:Shaderc编译加速五大实战策略

在图形渲染管线中,着色器编译是将高级着色语言(如GLSL)转换为底层中间表示(如SPIR-V)的关键步骤,其性能直接影响开发迭代效率和运行时体验。编译过程涉及词法分析、语法解析、语义检查及多阶段优化,传统串行编译方式在面对大规模着色器时易成为性能瓶颈。通过引入预编译与缓存机制,可将编译工作前置,避免运行时开销;结合并行编译与依赖分析,能充分利用多核硬件加速构建流程。这些优化技术尤其在高性能渲染、游戏开发及移动图形应用中价值显著,能有效缩短CI/CD流水线时间、提升开发热重载速度。本文聚焦Vulkan生态主流

weixin_34327761的博客 533

转载 :Android——编译安装Module的控制因素

转:http://blog.youkuaiyun.com/jscese/article/details/39209341 在前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别, 其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Modul

the_name_for_yu的博客 397

Ubuntu 16.04下OpenResty源码编译与生产级部署指南

OpenResty是以Nginx为运行时、Lua为编程语言的可编程Web平台,其核心价值在于将业务逻辑(如JWT鉴权、限流、动态路由)直接嵌入HTTP请求生命周期,避免微服务间冗余调用。它依托Nginx事件驱动模型与LuaJIT即时编译实现零序列化、低延迟处理,显著优于传统网关架构。在Ubuntu 16.04等长期支持系统上,需规避官方apt源陈旧包(如1.9.7.4版缺失SSL模块),转而采用兼容性验证充分的源码编译方案(如1.13.6.2),精准启用http_ssl_module、stream、http

weixin_33716154的博客 452

SSH双因素认证实战:集成Google Authenticator与Fabric自动化运维

在服务器安全领域,身份认证是守护系统安全的第一道防线。传统的单因素认证(如密码或密钥)存在泄露风险,双因素认证(2FA)通过结合“你知道的”和“你拥有的”两种凭证,显著提升了安全性。其核心原理是基于时间的一次性密码(TOTP)算法,动态生成短期有效的验证码。这项技术为远程访问和自动化运维带来了更高的安全保障,尤其在SSH这类关键服务中价值凸显。通过可插拔认证模块(PAM)框架,可以灵活地为SSH服务集成Google Authenticator等2FA方案,实现公钥认证与动态验证码的结合。在自动化运维场景下,

weixin_30338497的博客 696

Android.mk没有被编译到,Android——编译安装Module的控制因素

首先还是这个放在Android.mk中的变量,默认在/build/core/base_rules.mk 中:LOCAL_MODULE_TAGS := $(sort $(LOCAL_MODULE_TAGS))ifeq (,$(LOCAL_MODULE_TAGS))LOCAL_MODULE_TAGS := optionalendif而且并不是 LOCAL_MODULE_TAGS :=optional ...

weixin_29150247的博客 1328

Android开发常见错误类型与解决方案全解析

在移动应用开发中,Android平台因其开放性面临各种开发挑战。从基础的编译时错误到复杂的运行时异常,开发者需要掌握系统化的调试方法。编译阶段常见的语法错误和资源引用问题可以通过Android Studio的Lint工具检测,而空指针异常等运行时错误则需要结合Logcat日志分析。MVVM架构中的LiveData使用和ViewModel生命周期管理体现了现代Android开发的最佳实践。针对性能优化,内存泄漏预防和UI渲染优化是关键,特别是在处理动态图标主题等复杂场景时。第三方库集成时的依赖冲突和NDK开发

weixin_30522095的博客 457

[AndroidO基础] -- Android 编译安装Module的控制因素

前文Android——编译系统初始化设置中有解析编译的TARGET_BUILD_VARIANT的配置与基本区别, 其中的一些编译控制是对的但是Module的Android.mk中的LOCAL_MODULE_TAGS 控制并不全适用目前的android4.2,这里记录一下我对Module的控制过程。 首先还是这个放在Android.mk中的变量,默认在/build/core/base_ru...

u014674293的博客 609

Android 14/15免Root抓包:Magisk模块注入系统证书实战

HTTPS抓包是移动应用开发、安全测试和网络性能分析中的关键技术,其核心原理在于中间人(MitM)代理对加密流量的解密与重加密。随着Android系统安全策略的持续演进,特别是从Android 14(API 34)开始引入的“用户安装的CA证书限制”,传统的抓包方法对高目标SDK版本应用已然失效。这一变化旨在提升应用层安全,防止恶意证书滥用,但也为合法的开发调试与安全研究设置了障碍。其技术价值在于,开发者无需对设备进行完整的Root操作,即可实现系统级的证书信任,从而恢复对应用网络行为的可见性。本文聚焦于利

weixin_30887919的博客 397

用C#完成最小二乘法拟合平面方程,再计算点到面的距离

【代码】用C#完成最小二乘法拟合平面方程,再计算点到面的距离。

MechMaster 647

UE4.27安卓打包全流程实战:从环境配置到疑难排错

移动应用开发中,跨平台打包是将代码与资源编译、链接并封装为可在目标设备上运行的安装包的关键环节。其核心原理在于通过构建工具链(如Gradle)协调编译器、SDK和项目配置,生成符合目标平台规范的二进制文件。这一过程的技术价值在于确保了应用的功能完整性与性能表现,是产品上线的必经之路。在游戏开发领域,使用虚幻引擎(UE4)进行安卓打包是常见的应用场景,它涉及复杂的**环境配置**与**编译工具链**协作。开发者常面临SDK版本不匹配、NDK兼容性、Gradle依赖冲突等挑战,导致打包失败或应用闪退。本文聚焦U

weixin_33946020的博客 424

单细胞双胞过滤-scrublet安装

pip install scrublet ----use-pep517有如下报错,分析可知安装annoy时不会自动更新gcc的版本,centos默认是4.8.5。pip install scrublet ----use-pep517 仍然报错,但似乎不影响使用,提示Successfully installed。打开终端,进入Python环境,输入以下代码,查看Python安装位置。暂时还没尝试是否存在问题,如果存在问题,降级scrublet版本。包的开发依赖的是比较低版本的numpy,会用到。

hzau_t的博客 792

Android Build系统常见变量说明

PRODUCT_PACKAGES : 在/build/target/product/core.mk中类似这样的定义:PRODUCT_PACKAGES += \ BasicDreams \ Browser \ CaptivePortalLogin \ CertInstaller \ DeskClock \ DocumentsUI \ DownloadProviderUi \ Exte

the_name_for_yu的博客 1222

Windows下Nginx发布DEM地形瓦片数据全流程(含Cesium调用避坑指南)

本文详细介绍了在Windows环境下使用Nginx发布DEM地形瓦片数据的完整流程,并提供了Cesium前端调用的详细配置与避坑指南。重点讲解了Nginx的核心配置、跨域问题解决以及CesiumTerrainProvider的关键参数设置,帮助开发者快速搭建本地地形服务,实现高效的三维地形可视化。

weixin_29212867的博客 435

ubunut 系统安装k8s集群

修改配置文件 kube-metrics-server.yaml 添加监控数据采集容器启动参数,启动 tls 证书验证,否则监控容器接口验证不通过,无法采集监控数据。kube-metrics-server.yaml 140行左右添加参数 --kubelet-insecure-tls。服务器添加配置(配置三台阿里云时间同步服务器作为时间源,本机作为时间同步服务器)客户端配置(第一个源选用集群内的 192.168.10.20 )时间同步配置文件参考如下。

weixin_57489252的博客 1330

告别连点七下:为你的Android设备设置一个专属的开发者模式“秘密开关”

本文详细介绍了如何为Android设备设置专属的开发者模式秘密开关,替代传统的连点七下操作。通过计算器暗码、系统级彩蛋等创新方式,实现极客范儿的开发者模式激活,涵盖非Root方案和深度定制APK两种实现路径,并探讨了安全增强与自动化部署等进阶技巧。

weixin_30732487的博客 353

eNSP安装教程

eNSP安装教程一、安装eNSP1、先安装依赖组件2、安装eNSP主程序eNSP+V100R003C00SPC100+Setup ---不要安装在中文路径下3、安装完成后注册设备 一、安装eNSP 程序包位置:https://drive.weixin.qq.com/s?k=AOgAQQfOAAsw1wAKEgAAcAbgbSAKQ 1、先安装依赖组件 依赖组件: WinPcap_4_1_3 —直接下一步,但不要安装在中文路径下 Wireshark_v3.4.6 或者wireshark-win3

qimowei的博客 8668
上一篇: Android——4.2 - 3G移植之路之libusb (一)
下一篇: Android——4.2 - 3G移植之路之usb-modeswitch (二)
南丶烟
博客等级 码龄14年 569粉丝 98原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值