如何在我的 phone 上修改系统应用程序 运行

How to modifiy the system apps running on my phone

我想在我的 phone 上修改系统应用程序 运行。我对如何做到这一点的一些重要步骤感到困惑 - 请在下面进一步查看我的问题。

N.B.:我对将这些修改部署到其他 phone 不感兴趣。相反,我想使用原始代码并对其进行改进。因此 "create your own system app" 是不够的答案。

背景

我才刚刚开始进入 Android 开发(虽然有足够的 Java 知识)。那里有很多很棒的教程(例如 here and here),但它们似乎都涵盖了用户应用程序开发。我更感兴趣的是获得(一点)"closer to the metal"。不幸的是,我无法找到好的资源来教授如何做到这一点。

例子

举个例子,假设我想修改内置亮度控制的工作方式(例如更改最小值)或想向呼叫屏幕添加功能(例如线路繁忙时 "Send SMS instead") .

具体问题

我显然需要这些东西才能开始...

来源

phone OS 运行 的(部分?)来源。这是最让我困惑的部分。我可以 download the official sources 还是我的供应商可能进行了修改?

在我的特定情况下(我使用 Fairphone),这些修改是否可以包含在以下任何来源中:

工具

我真的希望留在Java-land。但是无论哪种情况我都需要开发(我希望使用Android Studio or Eclipse ADT) and a debugging environment (I hope the Android Virtual Devices就足够了)。

我可以将这些工具用于系统应用程序是否是一个有效的假设,或者它们通常是用 C 语言实现的吗?

进程

假设我可以下载官方资源并开始使用,例如Android工作室。与开发用户应用程序相反,我是否必须执行任何特殊操作才能在 AVD 上模拟修改后的系统应用程序?

我问是因为我假设 AVD 已经运行了那个应用程序的未修改版本。

I am just starting to get into Android development (have sufficient Java knowledge, though). ... I'm more interested in getting (a little) "closer to the metal".

您当然可以随心所欲,但您可能会发现通过黑客攻击 OS 本身来学习 Android 开发非常令人沮丧。您会发现自己进行了大量 OS 调试,并使用比平时更难使用的工具。

Example

As an example let's say I want to modify how the built-in brightness control works (e.g. changing the minimum)

我知道这只是一个例子,但这可能很难,因为有很多东西有助于亮度控制——有一个带有 UI 的应用程序可以设置它,但是它与框架对话,最终与硬件驱动程序对话,硬件驱动程序与环境光传感器协调,实际处理显示器的亮度曲线。

or want to add features to the call screen (e.g. "Send SMS instead" when the line is busy).

有一个拨号器应用程序,但实现这样的功能将是……困难的,即使它是可行的。我不知道 API.

是否可以使用这种调用状态

Specific Questions

I obviously need these things to get started...

Sources

The sources for (parts of?) the OS running on my phone. This is the part that confuses me the most. Can I just download the official sources or is it likely that my vendor made modifications?

如果您要替换系统应用程序,则需要 运行 使用调试密钥签名的 OS;您无权访问零售版 OS 上已安装系统应用程序的签名密钥,您无法替换它们。这意味着要么获取调试密钥安装,要么从源代码中自行构建,然后将其闪存到您的 phone。我强烈建议您不要将日常 phone 用于此类工作——您不希望它在需要接听重要电话时变砖。

如果您不是 运行Nexus phone,那么是的,您的供应商已经进行了修改。系统应用程序可能已被修改,您几乎肯定无法访问这些应用程序的封闭源代码。此外,将有闭源设备驱动程序,这些驱动程序对于您无法访问的 OS 的操作至关重要。如果你试图在这样的设备上启动 AOSP Android 并 运行ning,作为个人黑客,充其量是非常非常困难的。如果您愿意使用像 CyanogenMod 这样的东西,您可以查看它们是否(以及在多大程度上)支持您的硬件。

如果您运行正在安装 Nexus phone,那么 AOSP 项目的目标是尝试让 OS 在 select Nexus 设备,尽管您不一定会享受零售 OS 版本的全部功能,这取决于驱动程序的状态——甚至 Nexus phones 也可以拥有闭源驱动程序和位使生活更加,嗯,与 AOSP.

一起建设令人兴奋

In my specific scenario (I use a Fairphone), could those modifications be contained in any of these sources:

some core apps deployed by the vendor

几乎肯定

the image binaries (some way down the page)

不确定你的意思

sources for the Linux kernel and some other libraries

不太可能对内核本身进行重大修改,尽管供应商有时会对系统配置做...有趣的...事情。我已经提到了设备驱动程序。供应商也有一些框架 API 的自定义 implementations/modifications。

Tools

供应商特定的工具很少见。

I really hope to stay in Java-land. But either case I need a development (I hope to use Android Studio or Eclipse ADT) and a debugging environment (I hope the Android Virtual Devices suffice).

你想做的很多事情都可以在 Java 中实现,尽管这取决于你离硬件有多近,这可能很难知道。

Is it a valid assumption that I can use those tools for system apps or are they usually implemented in C?

“系统应用程序”在 Java 中实现,但同样,您必须知道分界线在哪里。

Process

Assuming I can download the official sources and get started with, e.g. Android Studio. As opposed to developing a user app, do I have to do anything special to emulate the modified system app on AVD?

这实际上是不同的,因为您处理的是模拟器系统映像而不是 phone 映像。模拟器系统映像是完全开源的,您可以从 AOSP.

构建它们

I'm asking because I assume that AVD already runs an unmodified version of that very app.

没错。

回到我最初的观点,如果你读懂了我所说的字里行间,我不会告诉你这是不可能的,但难度范围从简单的疯狂到花费 -在艰难的一端度过你生命中的岁月。如果你真的想继续,你最好的选择可能是购买 CyanogenMod 最支持的 phone 并在那个角度工作;那里有一个更活跃的开发人员社区可以帮助您。我知道您对尝试自定义 OS 比制作用户 space 应用程序更兴奋,但与前者相比,您对后者的挫败感会更少。