听说 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 的调用,你有什么独特的看法?欢迎在留言区分享!
今天在承香墨影公众号的后台,回复『成长』。我会送你一些我整理的学习资料。
我另外还维护了一个技术交流的微信群,有兴趣可以在公众号后台回复:"加群"
推荐阅读:
- 站在Android开发的角度,聊聊Airbnb的Lottie
- 这些工具,让你写博客的时候,只需要专注写作!
- 找了一天找不到 Bug ? 试试 Git 的二分法吧!!!
- 如何更精准的在 Github 上搜索开源库?你需要这些技巧!
- Android 开发,遇上 Emoji 头疼吗?
听说 Android 9.0 要禁用 @Hide Api 的调用,你怎么看?的更多相关文章
- Android 7.0 新增功能和api
Android 7.0 Nougat 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 请务必查阅 Android 7.0 行为变更以了解平台变更可能影响您的应用的领域. 要详细了解 A ...
- android 5.0 受欢迎的API简介
android 5.0 作为系统的一次重大升级,给用户和开发者带来了全新的体验.Material Design不但在视觉和操作上更胜一筹,扩展UI工具包同时也引入了大量新的API. 1. 3D视图和实 ...
- Android 8.0 功能和 API
Android 8.0 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能. 用户体验 通知 在 Android 8.0 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的 ...
- AppCompat v21 — Android 5.0之前版本设备的Material Design实现
博客原文地址:http://android-developers.blogspot.com/2014/10/appcompat-v21-material-design-for-pre.html,要想打 ...
- android 5.0新特性
Android Lollipop 面向开发人员的主要功能 Material Design 设计 注重性能 通知 以大屏幕呈现 以文档为中心 连接性能再上一级 高性能图形 音频处理功能更强 摄像头和视频 ...
- Android 5.0之后屏幕截图的方法
截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...
- Android 5.0之前屏幕截图的方法
截图的几种方法 Android获取屏幕截图主要有以下三种方法 1.通过view.getDrawingCache()获取指定View的绘制缓存来实现截屏. 这种方式Android 5.0之前也可以,且不 ...
- Android 4.0以后正确的获取外部sd卡存储目录
刚解决这个棘手的问题 找了很久,随笔记下. 网上搜索 android 获取外部sd卡存储目录 普遍都是: 1) Environment.getExternalStorageDirectory() 这个 ...
- Android 6.0 新功能及主要 API 变更
运行时权限 这个版本中引入了新的权限模型,现在用户可以在运行时直接管理应用程序的权限.这个模型基于用户对权限控制的更多可见性,同时为应用程序的开发者提供更流畅的应用安装和自动升级.用户可以为已安装的每 ...
随机推荐
- xamarin android menu的用法
在Android中的菜单有如下几种: OptionMenu:选项菜单,android中最常见的菜单,通过Menu键来调用 SubMenu:子菜单,android中点击子菜单将弹出一个显示子菜单项的悬浮 ...
- 查看内存和cpu
top: 主要参数 d:指定更新的间隔,以秒计算. q:没有任何延迟的更新.如果使用者有超级用户,则top命令将会以最高的优先序执行. c:显示进程完整的路径与名称. S:累积模式,会将己完成或消失的 ...
- mkdir 命令详解
rmdir <man.linuxde.net> 作用: rmdir 命令用来创建目录,该命令创建由dirname 命名的目录.如果在目录名的前面没有添加任何路径名,则在当前目录下创建由d ...
- MyBatis map foreach
以下资料来源于网络,仅供参考学习. mybatis 遍历map实例 map 数据如下 Map<String,List<Long>>. 测试代码如下: public vo ...
- Effective Java 第三版——12. 始终重写 toString 方法
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- js控制图片自动缩放,实现铺满盒子,不变形,完全局中
此js一般用于控制图片铺满盒子,但是比例不变,并且绝对局中原理:判断图片的高宽与盒子高宽的大小的关系,然后通过比例来控制图片的缩放及定位<!DOCTYPE html PUBLIC "- ...
- Git详解之九:Git内部原理
Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各章一直到这,你都将在本章见识 Git 的内部工作原理和实现方式.我个人发现学习这些内容对于理解 Git 的用处和强大是非常重要的, ...
- JavaScript的DOM编程--11--插入节点
插入节点: 1). insertBefore(): 把一个给定节点插入到一个给定元素节点的给定子节点的前面 var reference = element.insertBefore(newNode,t ...
- Optimize For Ad Hoc Workloads
--临时工作负载优化 即席查询:也就是查询完没放到Cache当中,每次查询都要重新经过编译,并发高的时候很耗性能: 参数化查询: 一方面解决了重编译问题,但随着数据库数据数据的变更,统计信息的更新 ...
- sql优化原则与技巧
加快sql查询是非常重要的技巧,简单来说加快sql查询的方式有以下几种:一.索引的引用 1.索引一般可以加速数据的检索速度,加速表与表之间的链接,提高性能,所以在对海量数据进行处理时,考虑到信息量比较 ...