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

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 的截图,有兴趣可以去这里 AOSP 里看看细节。

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

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

具体用来做什么的,也没有深入深究,不过单纯从这个 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;
    }

Google 提供的一系列 Support Library 的库,本质上都是 Google 为开发者准备的一些 APIs 扩展包,但是它不同于系统本身的 APIs。

我们在开发 Android 的阶段,会指定一个 Api Level ,从 IDE 的表现来看,它会引用一个 android.jar ,本质上是为了我们开发阶段能够成功编译而存在的,这个 Jar 包本身是不会被打包在 APK 中的。

在 Support Library 则不一样,它只是 Google 提供的一个工具包,会真实的被编译进 APK 中,会占用 APK 的体积。这就是为什么 Support v26 删除了一些方法来促使体积减小,是一件让人高兴的事情。

而如果 Google 对 @hide 方法进行了一刀切的限制之后,Support Library 中的一些功能,应该也会受到影响,因为本质上它就是我们 Apk 中的代码,权限级别和我们开发中编写的代码是一样的。

所以这就存在两个方向的问题:

1、区分来自 Support Library 的调用和开发者调用。

2、一刀切,直接修改 Support Library 源码和系统源码,重新审视那些现在被标记为 @hide 的方法,将那些不会影响安全和隐私的 APIs 全部开放出来,允许开发者调用。

下面我们继续开脑洞,仔细说说这些的区别。

1、区分调用来源

如果 Google 有办法区分调用来自哪里,然后针对不同的调用来源来实行不同的调用权限控制。

对开发者而言,实际上就是有漏洞可以让我们模拟成一个来自 Support Library 的调用,就依然可以绕过不允许调用 @hide 方法的限制,这个明显是有隐患的。

2、一刀切

从现有 Support Library 中的代码可以看到,其实它使用的 @hide 方法,并不全都是涉及安全和隐私的。

就拿最近分析的 Autosizing 来说,它其中大量的调用了一些 TextView 的诸如 getHorizontallyScrolling()getLineSpacingMultiplier()getLineSpacingExtra() 方法,这些方法其实并不触及安全和隐私。

只是为了拿个文本控件的属性而已,能有什么不安全或者不隐私的?慎重考虑之后,拿掉这些方法的 @hide 就好了,开放调用,就不需要区分那么多了。

结语

以上都是我的简单猜测和开脑洞后的想法,说了这么多,Android 依然为向着安全、易用的方向发展,所以无论是限制或是不限制,都是为了让用户好的使用。

对 Google 可能会限制 @hide APIs 的调用,你有什么独特的看法?欢迎在留言区分享!

今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料。

我另外还维护了一个技术交流的微信群,有兴趣可以在公众号后台回复:"加群"

推荐阅读:

原文地址:https://www.cnblogs.com/plokmju/p/8334869.html

时间: 2024-08-02 07:03:00

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

android 5.0 受欢迎的API简介

android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实时阴影: 只要重新设定elevation,图像下的实时阴影就会出现,漂浮在屏幕之上的感觉. 2. Activity Transaction 主要是实现不同Activity之间的动画切换. 3. Heads-up,主要是设置通知中心以卡片的模式出现,比如可以设置heads-up讲来电提醒显示在屏幕的顶

Android 7.0 Nougat(牛轧糖)---对开发者来说

android 7.0出来了.让你的app准备迎接最新的android版本吧,支持节省电量和内存,这样新的系统行为.使用多窗口UI.直接恢复通知以及其他操作来扩展你的app. android 7.0介绍了各种各样的新功能给用户和开发者, 本文重点介绍面向开发者的一些新功能. 确保检查android 7.0的行为变化,了解有关平台的变化可能会影响你的app. 如果要了解更多的关于用户的新功能,请查看www.android.com. 1.支持多窗口 在android 7.0中,我们介绍了在支持多窗口

【译】Android 7.0 for Developers

译者注: 译者:aroundme 原文地址:https://developer.android.com/about/versions/nougat/android-7.0.html 主要是介绍Android 7.0提供新特性. 翻译的动机主要是为了适配Android 7.0,提前踩点.防止大坑. 就翻译来看,除去一些可有可无的更新之外,关注点主要是集中在四点: * 通知栏一系列更新 * 对于应用后台优化(或者说限制) * WebView持续性更新(混合开发需要注意) * 对于GPU的优化,优化3

[翻译]AppCompat v21 — Android 5.0之前版本设备的Material Design实现

博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打开,请FQ. Android 5.0 SDK在上周五发布,它以新的UI控件.材料设计-我们专注于良好设计的可视化语言为特色.为了能够让你把最新的设计应用到之前的Android平台上,我们扩展了我们的支持包,包括具有较大更新的AppCompat,同样还有新的RecyclerView.CardView和

Android 5.0之后屏幕截图的方法

截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不需要权限.可以截取本应用内任意位置的屏幕截屏,可能会有些webview会截取不到. 注意这种方式只能获取当前应用内的截图(连顶部状态栏中的时间等都信息都获取不到,获取到的状态栏是一片空白). 2.通过Linux底层驱动来实现截屏. linux的图像信息都是通过FrameBuffer来写到显示设备上的

android 5.0新特性

Android Lollipop 面向开发者的主要功能 Material Design 设计 注重性能 通知 以大屏幕呈现 以文档为中心 连接性能再上一级 高性能图形 音频处理功能更强 摄像头和视频处理进一步完善 Android 在办公中的应用 屏幕截图和共享 新型传感器 Chromium WebView 辅助功能和输入 构建低电耗应用 欢迎使用 Android 5.0 Lollipop,这是迄今为止规模最大最为雄心勃勃的 Android 版本! 此版本为用户推出了各种崭新的新功能,为开发者则提

Android 5.0 Lollipop介绍

Android Lollipop介绍 Android 5.0 Lollipop,此版本为用户提供了丰富的新功能,并为开发者新增了数以千计的 API,它进一步扩展了 Android 的应用范围,从手机.平板电脑和可穿戴式设备,扩展到电视和汽车. 1.Android 5.0新增功能与特性 Material Design: 简介:Material Design语言的一些重要功能包括 系统字体Roboto的升级版本 ,同时颜色更鲜艳,动画效果更突出.杜拉特还简要谈到了新框架的一些变化--这个新框架也于今

Android 6.0权限管理的解析与实战

一.引言 随着Android6.0发布,系统增加了一些新的特性和功能.这次的发布介绍了一种新的权限机制.用户可以在运行时直接管理应用程序的权限.这个功能提升了权限控制的可见性和可控性.同时简化了安装和自动升级过程,用户可以单独撤销或者授予应用程序某项权限,对应用拥有更多的控制权. 二.Android 6.0权限机制 当你应用程序target是Android 6.0及以上(API level 23),确保在运行时检查和请求权限.为了确定你的app是否授予某个权限,通过checkSelfPermis

使用内部(com.android.internal)和隐藏(@hide)API[第4部分,定制ADT]

本文翻译自http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/ 在前面的文章中,我讲述了如何创建定制的original-android.jar和创建定制的android平台以使用original-android.jar.这仅仅能够使用隐藏API,还为内部API留有一个障碍: ADT.ADT定义了一个规则禁止使用来自com.android.internal的类. 有几种方