Android内核开发:从源码树中删除出厂的app应用

本文是《Android内核开发》系列的第十一篇文章,本文重点介绍如何从Android源码中删除出厂的app应用。

上一篇文章中提到过,系统出厂的app应用,其实就是被安装到/system分区的app,这些app在Android源码树中被编译后打包到了system.img镜像中,系统启动时,以只读的方式挂载/system目录,因此,非root手机用户是无法删除这些app的。

如果我们已经成功获取了手机的root权限,就可以通过下面的方法直接删除掉系统出厂的app应用,假设某app的安装文件叫做xxxx.apk,那么删除它的命令如下所示:

$ adb root

$ adb remount

$ adb shell rm /system/app/xxxx.apk

同样,我们也可以将自己的app安装到系统的/system目录中去:

$ adb root

$ adb remount

$ adb push xxxx.apk /system/app/

上面的方法只是介绍了通过命令行的方式手动添加/删除系统出厂的app,那么,如何从Android系统源码树中删除指定的出厂的app应用呢?

首先,推荐大家阅读一下这篇文章:《理解 Android Build 系统》,大致了解一下整个Android源码的编译系统架构,本文在这篇文章的基础上,重点关注如何删减系统出厂的app。

Android源码中,在 build/target/product 目录下预先定义了很多app列表的组合,如下所示:

在开发具体的Android产品时,可以通过“引用”这些系统预定义的mk文件,快速形成某类产品的app列表,比如包含了generic_no_telephony.mk的产品,就直接定义了时钟,邮件,日历,照相机的常用的app。

那么,上面这些系统预定义的mk文件,到底哪些被具体的Android产品“引用”了呢?

Android源码树中,真正定义产品配置的文件夹是:device/<company>/<product>,以我手头的beagleboneblack源码为例,如下所示:

$ cd beaglebone/device/ti/beagleboneblack

$ ls *.mk

Android.mk

AndroidProducts.mk

beagleboneblack.mk

BoardConfig.mk

CleanSpec.mk

device.mk

以上就是beagleboneblack产品配置最核心的mk文件了,其中,AndroidProducts.mk和BoardConfig.mk两个文件是必须的,编译系统会首先搜索这两个文件。

AndroidProducts.mk文件一般会直接指向具体产品配置文件,如本例中指向了beagleboneblack.mk文件,在beagleboneblack.mk中,则会详细地定义产品的名称、厂商、出厂的APP、需要拷贝的文件等等; BoardConfig.mk则是用来配置设备的硬件信息,如CPU架构、内核相关信息、bootloader、WIFI模块相关配置等等。

由此可见,要删减系统出厂的app,我们只需要重点关注AndroidProducts.mk所指向的xxxxx.mk文件即可,如本例中的beagleboneblack.mk。

具体决定是否编译某个app的宏是“PRODUCT_PACKAGES”,例如:

PRODUCT_PACKAGES := \

DeskClock \

Calculator \

Calendar \

Camera2 \

Email \

因此,如果希望删减掉某个app,直接从“PRODUCT_PACKAGES”列表删除掉就行了,例如,删除掉 Email,那么系统出厂的app里面就不会有“ Email”这个app了。(注意,具体的xxxx.mk文件通常还会引用其他的mk文件,比如:generic_no_telephony.mk,device.mk 等等,因此,在分析过程中,凡是被依赖的mk文件也需要深入分析和删减),例如:

//beagleboneblack.mk

$(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk)

$(call inherit-product, device/ti/beagleboneblack/device.mk)

关于如何从Android源码树中删除APP就介绍到这里了,有任何疑问或者建议欢迎留言或者来信[email protected]交流,或者关注我的新浪微博@卢_俊获取最新的文章和资讯。

时间: 2024-12-21 01:04:51

Android内核开发:从源码树中删除出厂的app应用的相关文章

Android内核开发:在源码树中添加新的app应用

本文是<Android内核开发>系列的第十二篇文章,上一篇文章介绍了如何从源码中删除出厂的app应用,本文则在此基础上,详细介绍一下如何在Android内核源码树中添加一个新的app应用. 网上也有介绍怎么在源码中添加新的app应用的博文,但大都数只介绍了不含有jni本地代码的app的添加方法,本文会更加全面地介绍三种不同类型的app应用如何添加到Android内核源码树中编译. 假设新的应用名字叫:HelloWorld,并且已经在Eclipse或者Android Studio中编译和调试通过

Android内核开发:源码的版本与分支详解

我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) Android版本有哪些分支可用?每个分支的TAG是什么? (2) Android源码下载完了怎么没有看到Linux内核代码?Android源码对应Linux内核是否可以从kernel.org官网去下载?Android对标准的Linux内核做了哪些修改? (3) Android源码分支与Linux版本分支的对应关系是什么

Android内核开发:学会分析系统的启动log

本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统的启动log信息,首先得了解Android系统的启动过程,建议先阅读<Android内核开发:图解Android系统的启动过程>这篇文章,它详细介绍了Android系统的启动过程.其次,你需要知道如何抓取系统启动log信息,建议阅读<Android内核开发:如何统计系统启动时间>这篇文

Android内核开发:理解和掌握repo工具

由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚repo是什么东西,它该怎么使用?作为<Android内核开发>系列文章的第二篇,我们首先谈谈对repo工具的理解和使用. 1. repo是什么? repo是一种代码版本管理工具,它是由一系列的Python脚本组成,封装了一系列的Git命令,用来统一管理多个Git仓库. 2. 为什么要用repo? 因为Android源码引用了很多开源项目,每一个子项目都是一个Git仓库,每个Git仓库都有很多分支版本,

Android内核开发:系统编译输出的镜像文件

本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的. 1. MLO, u-boot.img 任何操作系统的启动,都离不开"引导程序",比如桌面Windows系统的BIOS.桌面Linux系统常用的是Grub,而在嵌入式系统中,这个引导程序通常叫做"bootloader",它通常由

Android内核开发:序

转眼间我的<Android开发实践>系列文章已经写了三十多篇了,很多文章写得还是蛮用心的,所以很感谢51CTO的编辑们经常加精和推荐.我发现通过写作的确可以逼着自己去深入了解一些平时开发中并不会去挖掘的细节,这对自己帮助挺大的,后面遇到好的主题我还会继续写下去. 以前写的<Android开发实践>这个系列主要偏向Android应用层的开发,从一开始学习Android就计划好了要往底层深入,如今正好在工作中有机会涉及Android源码开发,因此,再开辟一个系列,就叫<Andro

Android内核开发:图解Android系统的启动过程

本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始真正地进行Android内核的学习及实战了. 学习任何软硬件系统,研究系统启动过程都是一种非常有效地起步手段,搞Android内核开发也不例外.网上有很多文章对Android启动相关代码进行分析和走读,大家可以先搜索阅读一下,我个人更喜欢更加直观的方式去理解未知的东西,包括图.表.系统输出的log信息等等,因

Android内核开发:系统分区与镜像文件的烧写

本文是<Android内核开发>系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中. 玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android SDK中提供的一种开发工具,支持通过USB线将手头的镜像文件更新/烧录到Android设备中,常用的fastboot烧录过程如下: fastboot flash boot boot.img fastboot flash system system.img fastboot flash userdata us

Android内核开发:为什么刷机后系统第一次启动会很慢?

在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都会很慢很慢,要好几分钟甚至十几分钟,为什么会出现这样的现象呢?系统刷机后第一次启动与后面再次启动有什么不同呢? 要解答这个问题,首先我们需要了解一下Android Dalvik虚拟机,以及Dalvik-cache. 由于嵌入式设备内存有限.CPU处理器不够强大.功耗敏感等原因,Google没有使用标准的JVM虚拟机,而是为Android单独开发了Dalvik虚拟机. Dalvik虚拟机与JVM虚