MDCC 2016 蚂蚁金服楼勇(焱鑫) Android安全无障碍密码键盘的实现

2020-02-27 316浏览

  • 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.“技术的发展,是为了跨越鸿沟,而 不是带来新的不平等。”