本文是《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应用相关推荐

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

    本文是<Android内核开发>系列的第十二篇文章,上一篇文章介绍了如何从源码中删除出厂的app应用,本文则在此基础上,详细介绍一下如何在Android内核源码树中添加一个新的app应用. ...

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

    我想很多初学者或许跟我一样,看完Android源码下载相关的文章以后,就开始兴致勃勃地去下载Android源码了,但是下载完了源码后,有没有像我一样产生如下几个困惑呢? (1) Android版本有哪 ...

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

    本文是<Android内核开发>系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点. 要学会分析系统 ...

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

    本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系 ...

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

    由于Android源码是用repo工具来管理的,因此,搞Android内核开发,首先要搞清楚repo是什么东西,它该怎么使用?作为<Android内核开发>系列文章的第二篇,我们首先谈谈对 ...

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

    本文是<Android内核开发>系列的第六篇文章,前面的几篇文章介绍了Android内核开发相关的基础知识,包括:Android源码的下载.版本和分支介绍.编译和烧写等等,从本文起就要开始 ...

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

    本文是<Android内核开发>系列的第五篇文章,本文重点介绍如何把编译输出的镜像文件烧写到Android设备中. 玩过刷机的朋友肯定对fastboot这个工具并不陌生,它是Android ...

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

    转自:http://ticktick.blog.51cto.com/823160/1677216 在做Android内核开发的过程中,我们会发现,每次编译完系统源码,烧录到设备/手机中后,第一次启动都 ...

  9. Android内核开发:系统启动速度优化

    在学习新知识的过程中,我一直很推荐结合实战任务去学习,只有经历实战,才能加深对理论知识的理解.<Android内核开发>系列已经写了八篇了,本文就结合前面的内容,给大家布置一个实战任务:  ...

最新文章

  1. 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!
  2. Linux服务器程序编程的几个坎
  3. 什么是Incremental Link Table[转]
  4. NavicatPremium连接MySQL出现异常Authentication plugin ‘caching_sha2_password‘ cannot be loaded的解决方案
  5. 攻防世界 web(二)
  6. python获取渲染之后的网页_Phantomjs抓取渲染JS后的网页(Python代码)
  7. GWT MVP变得简单
  8. Android RecyclerView(九)滑动监听综述
  9. 一个批量转换文件编码的python脚本
  10. qml中使用combobox实现多级菜单_Excel教程:还不会做Excel三级下拉菜单?其实它跟复制粘贴一样简单...
  11. linux-磁盘结构
  12. 基于FPGA的电梯控制器设计(任意楼层)
  13. C/C++ 找出最大素数 算法
  14. mediawiki php7,centos7搭建mediawiki
  15. 手把手教学弟用js写的打砖块游戏,学弟乐哉~ 附(思路注释+源码)
  16. html播放iOS铃音,ios – 如何在Cordova的HTML5视频播放过程中忽略铃声设置
  17. 做人要知足、做事要知不足、做学问要不知足
  18. 按字段和行项目数量拆单
  19. 电子技术基础(三)__第1章 并联电路的电阻_电阻的分流公式
  20. 判断bug属于前端还是后端

热门文章

  1. 《高性能Linux服务器构建实战Ⅱ》一书纠错汇总(12月30日更新)
  2. 使用jquery 动态操作添加/删除tr td
  3. virtualbox vdi extend the disk usage
  4. 12月 Web 服务器调查:nginx 增长最快,微软市场份额最高
  5. 矩阵奇异值分解(SVD)
  6. Vue学习笔记之16-tarbar地开发思路
  7. php json数组大小,php json转换成数组形式
  8. oracle建库并使用HR范例,Oracle HR样例数据库建立
  9. java好的代码_做java软件工程师,怎样才能写出好的代码?
  10. mysql pdo 安全_使用PDO查询Mysql来避免SQL注入风险