android - 如何从 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。
解决方案
我怀疑它是在 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 仍然可以访问,但没有明确的列表。
推荐阅读
- c# - Xamarin.Forms - 从主页查看缺少的菜单
- java - tomcat 不支持的major.minor 52.0版
- javascript - 仅适用于 Chrome 的脚本(不适用于 FF、Safari)
- javascript - A-Frame 鼠标组件未在移动设备上发布
- elasticsearch - ElasticSearch 将文本转换为小写
- python - 今年最后3个月在python
- excel - 与不同用户共享自定义文件 (exportedUI)
- c# - 反序列化时如何检查JSON字符串中是否存在属性
- python - Pandas 多索引到 csv 文件
- c# - 按钮 onClick 未绑定到 Activity 中的方法