如何通过Android Studio为特定版本的AOSP开发应用程序?

时间:2018-11-17 12:55:03

标签: android android-studio android-source

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

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

似乎我需要一个新的framework.jar,但是在哪里可以找到呢?请不要告诉我,我需要在本地下载并构建整个AOSP。

2 个答案:

答案 0 :(得分:2)

我怀疑它是在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引入了对访问隐藏方法和类的限制。在奥利奥(Oreo)中,您可以只使用反射。在Pie中,您尝试访问的大多数类都将抛出ClassNotFoundNoSuchMethodError异常,因为系统会阻止第三方应用程序访问它们。某些隐藏的API仍可访问,但没有明确的列表。

答案 1 :(得分:1)

您不需要整个框架。

一种方法是按照TheWanderer的建议使用反射,另一种方法是将链接到的源文件SignlaStrength.java添加到项目中。

您只需要确保将其添加到原始包路径/ android / telephony

下即可

工作室将使用它进行编译以解析方法签名,但是当在电话上运行时,调用将转到原始框架类。 我没有在文件中看到任何非公共导入,但是如果它不能编译,则可能需要通过删除一些函数内部将其放入存根。