支付宝会在启动的时候从服务器上动态加载执行一个 so 文件,加载之后,还会在这个 so 文件的资源区段解压出一个 dex 文件,用 classloader 加载并执行,整个支付宝很大一部分都是动态加载的,在这件事已经被发出来之后再去抓证据,已经没有太大的意义了, 抓到的[可能]只有正常的行为。
------ 更新 ------- 某群友提供的图片 暴露了支付宝的拍照过程 (2月9日他没有使用支付宝)
startPreview 会开启摄像头,就是你拍照之前的相机的那个预览画面。
setPreviewDisplay 是设置预览的 view,他可以设置成一个1x1像素的区域,也可以搞个透明的悬浮窗?(未测试),也可以瞬间拍完了就隐藏。
setPreviewCallback 参考文档
http:// developer.android.com/r eference/android/hardware/Camera.html#setPreviewCallback(android.hardware.Camera.PreviewCallback)Installs a callback to be invoked for every preview frame in addition to displaying them on the screen. The callback will be repeatedly called for as long as preview is active. This method can be called at any time, even while preview is live. Any other preview callbacks are overridden.
参数是 a callback object that receives a copy of each preview frame
也就是说,他不需要调用 takePicture() 函数,也就不会在那些必须带有拍照声音的手机上出现声音。
通过读取拍照预览画面的缓冲拿到 bitmap ,这个 bitmap 就是摄像头正在捕获的内容。
------- 再次更新 -------
看到评论有人提,支付宝的 so 文件 其实是假的 so,根本就是一个完整的 APK,里面五脏俱全,也就是说支付宝是直接动态加载 APK 的。。。。千真万确
以及半夜打开支付宝手机有咔嚓声的版本是 7 月的版本,我一个朋友的电脑里面还留着当时讨论这个声音的聊天记录。当时那个版本是通过支付宝自己的渠道推送更新的,所以应用市场里面也没有,第二天就被更新掉了。。。目前还没有找到。。。
如果大家也对那个版本有印象并且保存了的话,可以传 APK 上来,或者录个像,就有铁证了。
支付宝没有对这个版本进行热修复拍照声,说明在这个版本中,拍照的功能是残留在应用代码里面的,而不是云端动态加载的代码,只要能找到这个版本,就能找到具体的拍照代码。