剖析安卓build系统的设计思想以及案例模拟

Android系统定制进阶:深入解析Build Fingerprint的生成逻辑与安全应用场景 本文深入解析Android系统定制中的Build Fingerprint生成逻辑与安全应用场景。通过剖析AOSP源码中的fingerprint结构、生成链路及多维度属性差异,帮助开发者掌握设备标识定制技术,并探讨其在安全检测、自动化测试等领域的实践应用与伦理边界。 阅读详情

1.引言
安卓系统在根目录中只有一个Makefile文件,每个模块只有一个android.mk文件,这是Makefile文件的一个片段,为什么要这么设计呢?这种设计方式解决了什么问题呢?相信读完本文将会找到这些问题的答案。

2.问题的提出
对于一个小菜鸟来说,最先想到的方案是为每个模块写一个makefile,示例工程如下:

Project
  ----Makefile
  ----ant
       ----Makefile
       ----main.c
  ----bee
       ----Makefile
       ----parse.c
       ----parse.h

顶级目录的makefile内容如下:

MODULES = ant bee
all:
    for dir in $(MODULES); do \
        (cd $$dir; $(MAKE) all); \
    done

ant目录下的makefile内容如下:

all: main.o
main.o: main.c ../bee/parse.h
    $(CC) -I../bee -c main.c

bee目录下的makefile内容如下:

OBJ = ../ant/main.o parse.o
all: prog
prog: $(OBJ)
    $(CC) -o $@ $(OBJ)
parse.o: parser.c parse.h
    $(CC) -c parse.c

我们使用DAG来描述ant模块文件依赖关系:
这里写图片描述

同样的,bee模块的文件依赖关系如下:
这里写图片描述

这样我们就构建好2个模块的编译系统,只要make一下就能够得到我们想要的结果,不知道细心的读者是否发现了一个问题:main.o是依赖parse.h的,但是main.o并不清楚parse.h是如何诞生的,毕竟他们是处于两个模块的,两个makefile就像两个房间一样,他们各自身处于自己的空间当中,所以为了暴露这个问题,我们增加如下情景:

bee目录的parse.h和parse.c文件是通过yacc工具自动生成的,也就是我们在bee/Makefile文件增加以下内容来生成parse.h和parse.c文件。依赖关系现在如下:
这里写图片描述

假如我们修改了parse.y文件,然后在工程的根目录下执行make指令,得到的结果是否是我们想要的呢?答案是否定的,且听我细细道来。

make指定一旦执行,就会分别进入每个模块分别进行编译,即执行里面的makefile,那么这里首先进入ant模块,由于仅仅修改parse.y文件,所以main.o不会更新,完蛋啦,因为实际上parse.y更新,parse.h就要更新,进而main.o也是需要更新的,但这里却没有更新,也就是说,prog使用了陈旧的main.o。

问题出在哪里?还是每个模块一个makefile的方案是不对的。
每个模块一个makefile就需要依次编译每个模块,但是模块间又太过于松散,也就是一个模块中的目标可能无法感知依赖的变化,比如ant模块无法感知其依赖的变化(依赖由bee模块生成),一旦先编译了ant模块,那么就会出现我们不想要的结果。

3.改进实现

找到原因之后,那么如何解决呢?其实就是增加模块之间的耦合度,本质上就是让模块之间能够互相感知变化,下面将改进上面的设计,从而帮助我们理解安卓编译系统的设计思想。

改进以后的工程结构如下:
这里写图片描述
示例代码地址如下:
http://download.youkuaiyun.com/detail/getnextwindow/9063217

根目录下面只有一个Makefile文件,ant和bee模块下只有一个makefile片段,depend.sh自动生成头文件依赖的脚本。

Makefile实现如下:

MODULES :=ant bee
CFLAGS +=$(patsubst %,-I %,$(MODULES))
LIBS :=
SRC :=
include $(patsubst %,%/module.mk,$(MODULES))
OBJ:=$(patsubst %.c,%.o,$(filter %.c,$(SRC)))
prog:$(OBJ)
        $(CC) -o $@ $(OBJ) $(LIBS)
include $(OBJ:.o=.d)
%.d: %.c
        depend.sh `dirname $*.c` $(CFLAGS) $*.c >$@
.PHONY :clean
clean:
        rm -f prog $(OBJ) $(OBJ:.o=.d)

bee模块的module.mk文件如下:

SRC += bee/parse.y
LIBS += -ly
%.c %.h: %.y
$(YACC) -d $*.y
mv y.tab.c $*.c
mv y.tab.h $*.h

现在来分析新设计是如何解决前面的问题的,假如我们现在仅仅修改了parse.y文件。

一旦开始执行make命令,会将所有include指令中的文件加载进来,然后才开始根据所有规则产生目标文件。加载进来bee模块的module.mk以后,就会更新parse.c和parse.h,接着就会更新依赖parse.c和parse.h的目标文件,即parse.o、parse.d和main.o,所以这里main.o感知到了变化。

安卓模拟器过检测实战:如何用LSPosed和Magisk隐藏你的夜神模拟器 本文详细介绍了如何利用Magisk和LSPosed对夜神模拟器进行深度隐匿,以构建无痕测试环境。通过部署核心工具、配置隐匿模块(如Hide My Applist、Device Simulator)以及深度伪造系统属性,有效应对硬件传感器、系统属性、文件进程等多层次环境检测,帮助开发者和安全研究人员在合规场景下绕过模拟器检测。 阅读详情

相关推荐

逍遥模拟器安卓9上搞定Magisk Delta和EdXposed,解决‘无法获取’和‘框架未安装’报错

本文详细指导在逍遥模拟器安卓9环境中配置Magisk Delta和EdXposed,解决常见的'无法获取'和'框架未安装'报错问题。通过版本兼容性检查、精确安装顺序和日志分析,提供全面的排错方案,帮助用户顺利完成环境搭建。

new is I 456

读《深入理解Android内核设计思想》===>Android系统编译

链接:https://pan.baidu.com/s/1mjdlwbY 密码:4vsk

UPON的博客 801

安卓逆向入门:雷电模拟器中使用Frida绕过检测与脱壳实战

在移动安全领域,逆向工程是分析应用逻辑、发现潜在漏洞的核心技术。其基本原理是通过动态或静态分析,获取并理解程序的执行流程与数据结构。这项技术的核心价值在于安全评估、漏洞挖掘与恶意软件分析。在安卓平台,应用常使用加固技术保护代码,这催生了脱壳需求——即从内存中提取解密后的原始DEX文件。Frida作为一种动态代码插桩框架,通过注入JavaScript或Python脚本,能够实时Hook函数、修改内存,成为对抗检测与实现脱壳的关键工具。本文聚焦于在雷电模拟器环境中,利用Frida绕过常见的模拟器检测、调试检测等

HJ921004的博客 413

安卓/Android 模仿支付宝/微信 支付密码输入框的自定义View

类似这个密码输入框相信在博客上已经不少了,但是我稍微看了一下,大都是通过XML布局,然后组合成的一个自定义View。但是我想只用一个java文件,拿来就用该怎么办呢? 那就需要自己画出来了。水平有限,这里提供我自己自定义的一个过程,哪里不好,大家提提意见。 先上个效果图预览吧,我这里只是实现了那个框,具体输入布局大家可以在xml随意定义。 使用起来还是比较方便的,主要开放有四个方法和

天才小汪汪 1710

夜神模拟器安卓7安装Burp系统证书:突破HTTPS抓包限制

HTTPS抓包是移动应用安全测试与网络调试中的关键技术,其核心原理在于中间人代理对加密流量进行解密与重签名。要实现这一过程,客户端必须信任代理的CA证书。自Android 7.0起,系统引入了更严格的网络安全配置,默认不再信任用户安装的证书,只认可位于系统受保护目录下的根证书。这一机制直接影响了安全测试人员对App流量的拦截能力。为了突破此限制,技术实践的关键在于将代理证书正确安装到系统信任区。本文以夜神模拟器这一常用安卓虚拟环境为平台,详细解析了在Android 7系统上挂载系统分区、转换证书格式并完成推

cuankuangzhong6373的博客 479

Unity安卓真机性能调试:使用Profiler与雷电模拟器打通数据链路

在移动应用与游戏开发中,性能优化是保障用户体验的核心环节。其原理在于通过实时监控应用在目标设备上的运行时数据,定位CPU、内存及渲染瓶颈。这项技术的价值在于弥合了开发环境与真实运行环境之间的性能鸿沟,使开发者能够精准发现并解决仅在真机或模拟器上出现的卡顿、掉帧与内存问题。典型的应用场景包括移动游戏、AR/VR应用以及高交互性App的性能调优。本文聚焦于利用Unity Profiler的远程连接功能,通过ADB(Android Debug Bridge)与雷电模拟器建立稳定的调试通道,提供了一套从环境配置、端

weixin_30732487的博客 429

Android编译系统简要介绍和学习计划 . m , mm , mmm 怎么用

http://blog.youkuaiyun.com/luoshengyang/article/details/18466779 是原文,下面是节选。   明白了Android编译系统的设计思想和原则之后,我们就可以通过图5来观察一下Android编译系统的整体架构了: 图5 Android编译系统架构        在使用Android编译系统之前,我们需要打开一个shell进入到Andro

brooknew的专栏 1268

Unity安卓APK模拟器卡顿优化:从图形渲染到性能调优全解析

在移动应用与游戏开发中,图形渲染性能是决定用户体验的核心因素之一。其原理涉及应用层图形API(如OpenGL ES)到系统底层硬件GPU的指令转换与执行流程。在虚拟化环境中,这一过程的性能损耗尤为显著,直接影响了开发调试效率与应用性能评估的准确性。因此,针对模拟器等非原生环境的性能调优,成为提升开发工作流的关键技术实践。本文聚焦Unity引擎打包的安卓APK在模拟器运行时的卡顿问题,深入剖析了由图形管线“翻译损耗”和CPU指令集转换等【性能瓶颈】引发的帧率下降现象,并提供了一套涵盖项目图形设置降级、脚本优化

weixin_34151004的博客 444

gcc: c-parse.c: No such file or directory

reprot when build gcc3.4.6 solved a post by Altera Forum  It can be solved by modifying file nios2-linux/gcc3/gcc/c-parse.y. From the line 1650, 1661, 1670 and 1675 modify $$ to $<ttype>$. For...

shixha的博客 1238

Unity安卓打包与真机调试全流程:从环境配置到连接失败解决方案

移动应用开发中,跨平台部署与真机调试是验证产品实际表现的关键环节。其核心原理在于通过构建工具链将项目编译为目标平台可执行文件,并通过调试协议建立开发环境与设备间的通信链路。这一流程的技术价值在于能及早发现平台兼容性问题、性能瓶颈及用户体验缺陷,是保障应用质量的重要手段。典型的应用场景包括游戏开发、AR/VR应用测试以及跨平台业务应用的快速迭代。本文将聚焦于Unity引擎的安卓平台,深入解析如何配置JDK、SDK与NDK环境,并系统阐述通过ADB连接实现真机调试的完整路径,其中涉及构建参数优化与常见的连接失败

weixin_30788619的博客 662

Windows/Mac双平台实测:一招根治Android Studio模拟器‘闪退’(AVD terminated)

本文详细解析了Android Studio模拟器(AVD)闪退问题的根源,并提供了Windows和macOS双平台下的解决方案。重点介绍了环境变量配置(如ANDROID_SDK_ROOT设置)、SDK路径优化及模拟器性能调优技巧,帮助开发者彻底解决'AVD terminated'错误,提升开发效率。

weixin_28745821的博客 236

Python 3.5.0a1 变更全解读:矩阵乘法运算符、EINTR 重试机制与标准库的 598 项更新

> **导读**:本文以 CPython 仓库的版本发布记录 [Misc/NEWS.d/3.5.0a1.rst](https://link.gitcode.com/i/b5b7bc626fbb4ca8077bbd72a2b94baa) 为骨架,系统梳理 Python 3.5 首个 Alpha 版本(发布日 2015-02-08)相对 3.4 的 598 条变更。你将了解到 PEP 475(EINT

gitblog_00364的博客 245

新书上市《深入解析Android 5.0系统》

《深入解析Android 5.0系统》详细剖析了最新Android 5.0 系统主要框架的原理和具体实现。本书共24章,覆盖了Android 5.0 系统中、下层重要的模块,对于每个模块都详细介绍了它们的架构、原理及代码实现等各个方面,尽量让读者知其然,又知其所以然,达到学以致用的目的。主要内容为: Android Build系统核心、Android的Bionic、系统调用的

u013234805的专栏 5117

ComfyUI-layerdiffuse 硬件选型指南:3 档配置,把图层扩散跑顺

一张 512 像素的图要等十几秒,队列越排越长,你大概率已经动过换显卡的念头。先别急着掏钱——ComfyUI-layerdiffuse 做图层扩散这件事,对算力的胃口没你想象的那么大,真正的瓶颈往往是显存容量和你往一个 batch 里塞了多少东西,而不是显卡的"档次"。这篇选型指南先告诉你怎么买,再讲清楚为什么。 ## 先说结论 - 速度最由 GPU 决定,但"能不能跑"由显存容量决定:图层扩

gitblog_00064的博客 602

安卓模拟器检测与Frida Hook对抗实战:逆向分析与动态绕过

在移动应用安全领域,应用防护机制常通过检测运行环境来识别模拟器,以防范自动化攻击或作弊行为。其核心原理是收集设备软硬件特征,如系统属性、硬件信息和文件系统路径,并与已知模拟器特征进行比对。这项技术对于保障金融、游戏等应用的安全至关重要,广泛应用于反欺诈、反作弊和合规性检查等场景。本文以热门的蓝叠模拟器为例,深入剖析了常见的检测手段,并详细演示了如何使用Frida框架进行动态Hook对抗。通过Hook关键API如System.getProperty和android.os.Build,可以实时伪造设备信息,实现

390

Unity Profiler连接雷电模拟器:解决55000端口错误与安卓性能分析实战

在游戏开发与移动应用性能优化中,性能剖析是定位瓶颈、提升用户体验的核心环节。其原理在于通过运行时数据采集与分析工具,监控CPU、GPU、内存等关键指标,从而精准定位性能热点。这项技术的价值在于将优化工作从经验猜测转变为数据驱动,能有效解决卡顿、掉帧、内存泄漏等常见问题,广泛应用于游戏、VR/AR及高交互性应用的开发调试阶段。本文聚焦于Unity引擎的Profiler工具,针对开发者在安卓模拟器(特别是雷电模拟器)上进行性能分析时,频繁遇到的“Unable to connect to Unity Profil

weixin_29017445的博客 255

从逆向分析到实战:揭秘模拟器DeviceID的修改与对抗

本文深入探讨了模拟器DeviceID的修改与对抗技术,从逆向分析到实战操作,详细解析了DeviceID的生成机制及修改方法。通过逆向工具链定位关键代码,并提供了常见模拟器的配置文件修改步骤,帮助开发者理解设备标识体系并实现设备伪装。同时,文章还介绍了进阶的指纹混淆技术和安全防护建议,为开发者和安全研究人员提供了全面的技术参考。

weixin_30352191的博客 796

爬虫逆向:原生 Android 系统 AOSP 详解与底层对抗架构、实战案例

本文从AOSP源码视角解析Android系统分层架构与App风控检测机制,为爬虫工程师和安全研究人员提供对抗思路。文章指出现代App风控覆盖环境层、设备层、网络层和行为层,多数检测逻辑最终落在Native层或Framework层。通过分析AOSP五层架构(App、Framework、Native、HAL、Kernel),重点剖析系统属性(如ro.*)的来源与修改方式,强调多维一致性的伪造原则。最后给出检测端与采集端的对抗架构,列举真机池、定制ROM等解决方案,并指出WebView等H5爬虫相关的AOSP实现

数据知道的博客 1524
上一篇: Makefile容易犯错的语法
下一篇: 为android系统添加产品的过程
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值