听说 Android 9.0 要禁用 @Hide Api 的调用,你怎么看?

197

Android 9.0?

Hi,大家好,我是承香墨影!

距离 Android 8.0 发布,已经过了五个月,虽然现在占有率并不高,不过呢,Google 已经着手准备下一版本的 Android 系统。

上周,据快科技爆出来的消息,在 XDA社区 有人发现最近的 AOSP(Android Open Source Project)提交记录中,怀疑是下一代 Android 系统版本的代码:PI,这可能是 Android 9.0 的版本名称。不过根据 Android 之前版本的命名习惯,Google 钟爱使用甜点来命名版本,很多人猜测 Pi可能是 Pie(馅饼)的缩写。

在 AOSP 最新的 commit 中,还暴露出来一些特别的信息,可能会开始限制一些没有被文档提及的非公开 APIs 的调用,例如被标记为 @hide 的 APIs。

commit

上面是 commit 的截图,有兴趣可以去这里 AOSP 里看看细节。

https://android-review.googlesource.com/c/platform/external/doclava/+/589515

简单看了一下这个 commit 的改动,可以看到,在 Stubs 中增加了一个 privateDexApiWriter,应该是用来记录这些被标记为 @hide 的方法。

dexFile

具体用来做什么的,也没有深入深究,不过单纯从这个 commit 里看到的内容猜测,应该是要着手限制一些 @hide APIs 的访问。

那么我们继续开一下脑洞,想想 Google 想要限制 @hide APIs 的调用,有那些需要考虑的。

@hide 方法

众所周知,Android 系统在迭代的过程中,越来越重视安全这个因素。而有一些方法可能会涉及到系统安全、用户隐私或者其他一些原因,总之有一些因素考量,在发布出来的时候,被 Google 标记为 @hide,表示并不希望开发者去使用它们。

而这些标记为 @hide 的方法,我们也是无法直接调用的,只能使用反射的方式去调用它们,这本身就是不安全的操作。

不过呢,我们有时候确实为了实现一些功能,需要使用到这些被标记为 @hide 的方法。

从前面提到的 commit 的描述中,可以看到,这种限制是 Dex-level 层的,也就是它应该可以做到无视反射调用。例如加个权限限制,调用的时候判断无权调用则直接报错或者让你反射的时候调用,也无法起作用,其实都是限制的方式,现在还不用太深究原理。

Support Library

虽然 Google 是可以做到对 @hide 方法的限制的,不过有一点不知道大家注意到没有,那就是 Support Library 中,也包含了大量 @hide APIs 的调用。

例如最近说到的 Autosizing 功能的实现中,就专门用来写了一个方法,来做反射的调用,获取 TextView 中的一些属性值。

private <T> T invokeAndReturnWithDefault(@NonNull Object object, @NonNull final String methodName, @NonNull final T defaultValue) { T result = null; boolean exceptionThrown = false; try { // Cache lookup. Method method = getTextViewMethod(methodName); result = (T) method.invoke(object); } catch (Exception ex) { exceptionThrown = true; Log.w(TAG, "Failed to invoke TextView#" + methodName + "() method", ex); } finally { if (result == null && exceptionThrown) { result = defaultValue; } } return result; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjsws.html