1.Android安全无障碍密码键盘的实现
2.背景 背景 今年年初,因为 安全问题支付宝 安全键盘辅助功 能被迫下架 1
3.背景 背景-原生方案 Android 原生的无障 碍解决方案 2
4.背景 背景-语音提示 Video 1: 3
5.背景 背景-Accessibility 什么是Accessibility辅 助功能? 1. 抢红包 2. 静默安装 3. 自动化测试 4
6.背景 背景-安全问题 隐私泄漏 5
7.背景 背景-泄漏详情 #adb shell uiautomator events 6
8.紧急方案 紧急方案 - 阻止Accessibility Accessibility系列方法: public void xxx(…) { if (mAccessibilityDelegate != null) { mAccessibilityDelegate.sendAccessibilityEvent(this, …); } else { xxxInternal(…); } } public void setAccessibilityDelegate(@Nullable AccessibilityDelegate delegate) { mAccessibilityDelegate = delegate; } 7
9.分析 分析- NullAccessibilityDelegate 自定义 AccessibilityDelegate Class NullAccessbilityDelegate extends AccessibilityDelegate { …… public void onInitializeAccessibilityEvent(View arg1, AccessibilityEvent arg2) { //Do nothing. } …… public void sendAccessibilityEvent(View arg1, int arg2) { //Do nothing. } ……. } 8
10.问题 问题 • 语音反馈 • 焦点 Video 2: 9
11.分析 分析 Q:如何做到安全 & 无障碍? 10
12.深入分析 事件传递 public boolean performClick() { …… sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED); …… } //View.java public void sendAccessibilityEventUncheckedInternal(AccessibilityEvent event) { ……. getParent().requestSendAccessibilityEvent(this, event); } //View.java 11
13.深入分析 事件传递 public boolean requestSendAccessibilityEvent(……) { …… mAccessibilityManager.sendAccessibilityEvent(event); …… } //ViewRootImpl.java public void sendAccessibilityEvent(AccessibilityEvent event) { ……. doRecycle = service.sendAccessibilityEvent(event, userId); } //AccessibilityManager.java 12
14.深入分析 TalkBack的语音反馈 //TalkBack 代码片段: mTempTts = new TextToSpeech(mContext, mTtsChangeListener, engine); private int speakCompat(CharSequence text, HashMapparams) { return mTts.speak(text.toString(), SPEECH_FLUSH_ALL, params); } TextToSpeech 13
15.方案 14
16.难点 拦截-Accessibility Event //Accessibility事件出口 public void sendAccessibilityEvent(int eventType) { boolean handled = false; if (null != mSabEventListener) { handled = mSabEventListener.handleAccessiBilityEvent(this, eventType); } if (!handled) { super.sendAccessibilityEvent(eventType); return; } } 15
17.难点 控制-Accessibility Focus public boolean requestAccessibilityFocus() { ...... viewRootImpl.setAccessibilityFocus(this, null); ...... sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED); ...... } //View.java代码片段 16
18.效果 实现效果 Video 3: 17
19.计划 任重道远 目前,支付宝已经和业界权威的无障碍机 构达成了合作意向,持续关注视障用户的反馈 意见。 支付宝内部也将无障碍支持作为标准列入 开发规范,支付宝的产品将进一步完善无障碍 功能的支持。 18
20.“技术的发展,是为了跨越鸿沟,而 不是带来新的不平等。”