前言

上一篇《定制ROM采坑之路(2):魔趣OS刷入小米5A手机过程详解》我们已经知道了怎么将魔趣刷入到我们的手机中了。接下来,这篇文章我想通过开发一个入门级别的系统级App把我们的流程走通,对系统级的App有个最初步的认识,本文章没有涉及到一些高级的功能比如调用系统级API引用本地库。在文章结尾会有一篇推荐文章,会比我这篇文章的内容多一点大家可以点击观看。

系统级App的开发

参考用例——HelloActivity

今天我们开发的第一个系统级应用,主要的参考例子就是源码树中给的例子:[your android source path]/development/samples中的HelloActivity

以此项目为基础,构建我们的第一个系统级App。我通过Ftp把源码下载下来使用sublime3打开,下面来张截图看下源码。


可以看见源码很简单,接下来就是修改我们的Android.mk文件

创建Android.mk文件

  • 首先,我们将HelloActivity项目拷贝到我们的/packages/apps目录下,并更名为FirstSystemApp。
$ sudo cp -r HelloActivity /var/android/rom/mokee/source/packages/apps/HelloActivity
$ cd /var/android/rom/mokee/source/packages/apps/
$ mv HelloActivity FirstSystemApp

  • 其次,通过对复制HelloActivity的Android.mk文件内容为模版修改为下面的内容。
    LOCAL_PATH:= $(call my-dir)#清理缓存变量include $(CLEAR_VARS)#表示目标模式LOCAL_MODULE_TAGS := userdebug#表示源文件编译路径 这个应用里面只有java源文件LOCAL_SRC_FILES := $(call all-java-files-under, src)#表示项目包名也就是模块名,在项目中唯一LOCAL_PACKAGE_NAME := FirstSystemApp#签署当前应用的证书名称LOCAL_CERTIFICATE := platform#指定编译sdk版本为当前版本LOCAL_SDK_VERSION := current# 使用该指令编译目标Apk.include $(BUILD_PACKAGE)#搜索编译该源码目录下所有的mk文件,如果没有可以不写include $(call all-makefiles-under,$(LOCAL_PATH))

上面大部分都是通用写法,但是有几个变量定义我们需要这种了解一下

  • LOCAL_PACKAGE_NAME
    该变量的值是FirstSystemApp,所以会在<Android 源代码根目录>//out/target/product/[your product]/system/app/目录生成FirstSystemApp.apk文件。

  • LOCAL_CERTIFICATE
    Android系统中包含了4个签名,前面使用的platform就是其中之一。这些签名文件中在如下的目录中。

<Android 源代码根目录>/build/target/product/security

下面解释一下含义:

  1. testkey:适用于未另外指定密钥的 apk 包的通用默认密钥。
  2. platform:适用于核心平台所包含的 apk 包的测试密钥。
  3. shared:适用于家庭/联系人进程中的共享内容的测试密钥。
  4. media:适用于媒体/下载系统所包含的 apk 包的测试密钥。

此变量表示签名类型,系统应用通常设为platform,表示Platform签名。具体参考《证书和私钥》

  • LOCAL_MODULE_TAGS
    在针对特定产品进行编译时,如果能在最终发布版本的基础上进行细微修改,通常会非常有用。在模块定义中,模块可以通过 LOCAL_MODULE_TAGS 指定标记,这些标记可以是以下一个或多个值:optional(默认)、debug、eng。更多可以参考官网的文章《使用编译类型》

配置Makefile,添加新的项目

注意,这是很关键的一步,如果忽略了你是没办法在编译成的system.img里面找到这个工程的。

这一步,我们需要将我们刚才创建的FirstSystemApp添加到系统的mk文件下,编译后会产生一个FirstSystemApp项目。
选择 <Android 源代码根目录>/device/xiaomi/rolex/device.mk或者从 build/target/product/ 目录下选择一个被引用的.mk文件,比如我用的是build/target/product/core.mk ,如果是在/devices/下指定产品下修改添加,则只会在指定目标产品生效,如果你的工程对所有产品有效,建议添加在/build/target/product/core.mk中。

最重要的是在其中的PRODUCT_PACKAGES参数列表中添加本工程:如果不添加的话整编出来的镜像里面是没有添加到源码树的应用的。下面要提到的添加公用so文件也是需要在这个地方添加,添加的方式则是把mk文件中的标识名填上(LOCAL_PACKAGE_NAME或者LOCAL_MODULE)。

编译

在FirstSystemApp目录下输入mm命令或者切换到Android源码根目录下执行下面任意一条命令即可:
make FirstSystemApp或者mmm package/apps/FirstSystemApp

耐心等待十几分钟等编译,编译生成的apk会放到在<Android 源代码根目录>/out/target/product/[your product]/system/app/目录下。

安装

因为我编译是在服务器上进行的,所以需要将APK下载到本地后,安装到手机上。系统级app的安装和普通的应用安装不同,在有root的情况下,我们只需要将Apk使用adb命令push到手机的/system/app下就好了执行命令。

$ adb remount
$ adb push FirstSystemApp.apk /system/app
$ adb shell
$ cd /system/app
$ ls


下面图可以看见,确实已经是系统级的App了,因为只可以停用但不可以卸载。

结束语

总的来说系统级应用的入门开发并不难,出去掉图片和命令,并没有多少内容。这篇文章还有很多都没有涉及比如:jar包的引用so库的引用makefile细节编写调用系统隐藏API等否没有涉及。这里我推荐一篇文章《android系统源码中添加app源码(源码部署移植)》,因为本文也是通过这篇文章的编写出来的基础篇,他的文章要更全面一点。

参考链接

  • 《Vim中如何快速进行光标移动?》

定制化ROM采坑之路(3):基于魔趣OS开发入门级的系统级应用相关推荐

  1. 定制化ROM采坑之路(1):魔趣8.1版本源码下载和编译过程

    前言 记得当年刚接触Android的时候,就看有关老罗的文章倒是让我的安卓内功提升不少,但是由于工作都是停留在应用层的缘故,我几乎对这块并没有深入研究,最近公司的新产品对Framework层的开发有所 ...

  2. 定制化ROM采坑之路(2):魔趣OS刷入小米5A手机过程详解

    前言 上一篇文章<魔趣8.1版本源码下载和编译过程>我们讲解了源码的下载和编译过程,这篇文章我们就需要将我们编译的刷机包刷入到我的红米5A手机中,让我们体验下我们自己的劳动成果,不过在这之 ...

  3. Android原生OS风格ROM包,ZUK Z1 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...

    刷机包说明: 刷机之前请实现解锁BootLoader,并刷入TWRP专用版 本ROM也适用于小米红米以及魅族手机账户锁手机 如果你是账户锁手机,刷入魔趣ROM后将不再有锁 基于魔趣OS刷机包制作,纯净 ...

  4. 高并发采坑之路-----linux学习-----VMware虚拟机安装及介绍1

    在最美语言php的攻击下,java在几年时间里失去了很多的市场份额,甚至有一段时间java已经被互联网抛弃了,什么老旧啊,不灵活啊,速度慢啊,只适合机场,银行,运营商啊.不过适合机场,银行,运营商却也 ...

  5. mac上brew安装swoole扩展,采坑之路

    1.官网下载最新扩展 wget http://pear.php.net/go-pear.phar 说明:如果提醒你需要更新,则更新命令 2.开始安装 sudo pecl install swoole ...

  6. ELK集群+Kafka集群+FileBeat——命运多舛的安装采坑之路

    欢迎大家关注我的公众号,添加我为好友! 开始的时候感觉日志监控是比较NB的技术,感觉很神奇,那么多日志,为什么一下子就能够找到自己想要的?后来初步了解到了ELK(ElasticSearch + Log ...

  7. Redis(三)------采坑之路续集

    前言 首先我用的是JAVA语言,如果您也遇到了与我类似的问题,即使用JedisPool的时候出现Could not get a resource since the pool is exhausted ...

  8. Flutter之Android Studio环境配置采坑记录

    Flutter之Android Studio环境配置 IDE和SDK的安装 Device配置 AVD Genymotion 安装 ADB设置 AS中安装Genymotion插件 踩坑记录 IDE和SD ...

  9. 安卓刷机时代不再!魔趣开源项目创始人宣布:“决定删库跑路了”

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) "刷机",一个 00 后听着可能有些陌生,却能勾起许多 80 后.90 后青春记忆的词语--如今,它可能要进一步退出 ...

最新文章

  1. Cloudify — 安装部署与基础使用
  2. 多选月份的日期选择器_GitHub - ylmyg/SelectionTime: Android下日期选择器,支持范围选择、多选、单选、根据输入天数选择日期...
  3. android中的AIDL进程间通信
  4. Vue导入非模块化的第三方插件功能无效解决方案
  5. es6 ArrayBuffer对象
  6. mysql数据库简单语句
  7. 翻译pdf中的英文 python_浅谈python实现Google翻译PDF,解决换行的问题
  8. 在登陆AD的机器上测试模拟经过验证的用户
  9. java151和152_编写高质量代码:改善Java的151个建议(性能和效率)132-133
  10. 数据结构与算法python—9.二叉树及python实现
  11. flink开发案例_Flink 在人工智能领域的应用实践
  12. 热启动计算机的快捷键,电脑快捷键的用法
  13. 基于Java+Springboot+mybatis+lyaui的学科竞赛管理系统设计和实现
  14. MySQL查看索引和数据所占内存
  15. 2020-12-01 剖析 Linux hypervisor
  16. 【过关斩将】高胜寒带你理清 “为什么从上家公司离职?”
  17. 人工智能的前世今生(二)
  18. Python爬虫实战:抓取淘宝MM照片
  19. vue 表单验证常见问题
  20. Api-gateway服务网关gravitee.io的探索之路(一)

热门文章

  1. 动态面板:拖动滑块解锁(1)
  2. C++开发支持Android共享库(so)教程
  3. “碳”零排放是什么意思
  4. 查询电话号码归属地的PHP接口(处理过可供前端使用的)
  5. UNCTF2022中RSA题目总结
  6. Google PR 劫持方法
  7. 欧盟对湾区建设_欧盟委员会对.EU域名进行掉头处理
  8. 学会这5招优化技巧,让你的 iPhone 变得更好
  9. 安装elasticsearch无法访问9200:Empty reply from server
  10. 浅谈舞蹈链(DLX)