首页 > 解决方案 > 如何从 Android Studio 为特定版本的 AOSP 开发应用程序?

问题描述

我当前的手机 (Pixel 2 XL) 正在运行构建 PQ1A.181105.017.A1。根据source.android.com,这意味着它是从分支 android-9.0.0_r16 构建的。查看来自该特定分支的源文件,例如SignalStrength.java,有一个名为 getWcdmaRscp() 的公共方法。但是,似乎此方法是在 SDK 版本 28 发布后添加的,因此如果我在面向 28 时尝试从 Android Studio 中的应用程序调用它,它不会构建。

我猜我的手机会很乐意让我调用有问题的方法,那么如何设置我的 Android Studio 以便能够针对该版本的框架进行构建?

看来我需要一个新的 framework.jar,但我在哪里可以找到它?请不要告诉我我需要在本地下载和构建整个 AOSP。

标签: androidandroid-studioandroid-source

解决方案


我怀疑它是在 API 28 发布后添加的。它的注释@hide意味着,当 SDK 被构建时,它并没有被内置。它仍然在框架本身中,但 Android Studio 不知道这一点。

为了解决这个问题,你必须使用反射。就像是:

try {
    Method getWcdmaRscp = SignalStrength.class.getMethod("getWcdmaRscp");
    int rscp = Integer.parseInt(getWcdmaRscp.invoke(signalStrength).toString()); //signalStrength is the instance you have
} catch (Exception ignored) {}

但是,这可能行不通。Android Pie 引入了访问隐藏方法和类的限制。在奥利奥,你可以只使用反射。在 Pie 中,您尝试访问的大多数类都会抛出ClassNotFound异常NoSuchMethodError,因为系统会阻止第三方应用程序访问它们。某些隐藏的 API 仍然可以访问,但没有明确的列表。


推荐阅读