如何将系统 api 类 添加到非 AOSP 构建的 android 项目

How to add system api classes to your android project for non AOSP builds

我有一个 android 系统应用程序,目前正在使用 android 构建系统构建。使用的 SDK 是 system_current,因为它使用了一些系统 API。

出于外部依赖性原因、易于开发、调试等原因,最好将此应用移至 Android Studio 并使用 Gradle 进行构建。

将源代码转换为使用 Gradle 构建非常简单。但是,在构建时,找不到系统 API,因为它们在普通 SDK 中不可用。我认为通过从 AOSP 源代码生成 SDK 我会得到一个我可以使用的 SDK,但目标输出似乎也没有可用的系统 API。

如何更改我的 gradle 构建以能够使用系统 SDK 进行编译?

不确定我是否理解您所说的普通 SDK 等的确切含义

来自https://developer.android.com/studio/build

关键是要有一个

apply plugin: 'com.android.library'

...

android {
   ...
}

另一方面,如果您想使用桌面 JDK 进行构建,但针对 java API 进行编译,您可以添加对 robolectric 的依赖,然后您可以获得一个 jar,您可以导入另一个 Android 项目。

implementation "org.robolectric:android-all:11-robolectric-6757853"

Android Studio 并非真正设计用于使用系统 API。即使您 Gradle 构建您的平台应用程序,您也需要使用与 AOSP 构建相同的证书对其进行签名(这样您就可以 运行 ).正如您所注意到的,如果您决定使用 Roboelectric,您还需要自己修改它以匹配您当前的 AOSP 版本(系统 API 不如 Public API 稳定,Roboelectric 需要不断追踪所有更改)。

我建议继续使用 AOSP 构建系统,但优化我们的工作流程。

易于开发

对组件中的每个更改进行完整 build/flash 一定很痛苦。但是,如果您只是修改单个应用程序,则只需构建该单个组件即可:

  1. ~/aosp/ $ m -j -- 首先进行完整构建
  2. 刷新干净的映像(使用您的平台证书)
  3. ~/aosp/path/to/your/app/ $ mma -j -- 在您进行更改后使用所有依赖项构建您的应用程序
  4. $ adb root && adb remount && adb sync

基本上,如果您不接触 Android 框架的任何 API 或部分(这会导致重建数千个其他对象),adb sync 会很好用。如果您看到 adb sync 更新了很多文件,您可能会遇到一个坏系统,需要进行全面更新。

调试

虽然 Android Studio 是常规应用程序的外置解决方案,但框架和平台应用程序与 InteliJ 一起使用(您可能可以使用 Android Studio,但不会有太多在 InteliJ 上使用 Android 插件)加上一些配置(参见 idegen.sh - example)。

有两种方法,具体取决于您是仅尝试使用当前的非 public API,还是您自己添加了自定义的并尝试访问它们。

  • 如果您只想使用当前系统级别的 API,您可以使用此存储库 https://github.com/anggrayudi/android-hidden-api

    中的 android.jar
  • 如果您添加了一些不属于标准 AOSP 的新方法,则需要更多工作。
    所有方法都没有显示为 Android SDK 的一部分的原因是在 AOSP 代码中它们被注释为 @hide。这意味着在生成SDK时,它们被排除在外。
    您需要为要使用的方法删除该注释。那你需要


还可以在不生成 SDK 的情况下通过运行时反射访问方法。不过,它的编码速度更慢、更混乱。