在《为什么SDK加固会那么重要?网易易盾专家的四点解读》中,我们介绍了SDK加固的重要性以及易盾SDK加固的2种方案的基本实现原理。作为姊妹篇,这篇文章将为大家解读下易盾SDK加固的特点与优势,以及和某友商的对比测评。
一、易盾SDK加固有什么特点?
对于接入者而言,一个SDK或通用框架的易用性、稳定性、兼容性、性能是非常重要的指标,而对于安全加固而言加固强度与加固体积又是非常重要的因素,因此我们将从接入的易用性,加固强度、稳定性、性能、加固后体积等核心指标上进行分析。
易用性
易盾SDK加固后直接替换加固前SDK即可,集成后无需做初始化,就像使用未加固前的SDK一样,对接入者完全透明。这一点在自动化构建上将非常方便(后文将具体讲),因此在易用性上易盾SDK加固对开发者是非常友好的。
加固强度
易盾SDK加固方案包含VMP以及Java2C两种方案。VMP方案将待保护类的方法进行抽空,对抽取的指令进行加密处理,在运行时通过自定义虚拟机执行,同时对指令操作码做了重新映射,极大的提高了分析破解的难度。
Java2C方案将待保护类的方案进行Native化,Java层原函数逻辑转为了JNI层的C/C++代码实现,由于该过程不可逆,因此从Native层还原回原Java层逻辑的门槛与难度会大大增加,几乎不可能。
稳定性与兼容性
易盾SDK加固VMP与Java2C方案,不仅应用在SDK加固业务,在Apk加固也早已应用多时,经受过大量的真机测试与线上环境的考验。这两种方案对对市面上Top 100的应用通过云真主机的百台测试机进行测试,通过率达到99.6%以上,远远超出资质要求的90%的标准。对于安卓的操作系统从4.x到10.x版本均可全面兼容,适配的范围广。从各类的应用中挑出一个代表性的进行测试,测试的通过率如下所示:
另一方面在客户对接中,我们也遇到过一些先试用友商SDK加固,但运行测试时出现崩溃转而试用易盾SDK加固的客户,试用后未出现稳定性和兼容性问题。
性能
对于绝大部分场景,SDK加固的VMP方案的性能足以满足用户需求。在少数对性能要求比较高的场景,比如图像绘制,涉及到View与UI状态的实时更新,如果每一帧绘制性能都有所降低,最终可能会造成用户视觉上的卡顿。对于这种场景,可以使用Java2C方案进行SDK加固。另一方面,对于某些对性能影响很大但不是很重要的类,也可以通过加类名单过滤的方式过滤掉。
因此在性能方面,易盾SDK加固完全可以覆盖满足用户的各种业务场景。
加固后体积
由于SDK的特殊性,SDK作为一个独立组件,将最终被开发者的用户集成,而SDK相对Apk而言一般体积较小,同样的增量对于SDK而言,用户增量感知上是比较明显的,因此SDK加固后体积增量是一个非常重要的指标。
实际上在对接客户过程中,我们了解到某些客户对于SDK加固后的体积,的确是非常在意的,因此我们在体积增量控制这方面也做了很多优化。
部分客户加固前后体积对比数据
通过上表客户的数据可以看到易盾SDK加固前后体积增量非常小,即使so包含主流的5种abi,体积增量也基本不会超过800kb;另一方面,因为VMP方案会将Java层代码指令抽空,然后加密压缩,因此SDK加固后的体积不会随着AAR本身的体积增大,而导致增量越来越大,甚至在某些情况下可能会略有减少。
二、测评
以下测评来自使用易盾SDK加固服务的某客户给的原始包,以及友商加固包。该客户原始包为4830kb的aar包,该aar包含java代码以及so,其jni目录只包含一个armeabi架构的so。
从上表可以看出:
另外易盾SDK加固在客户对接过程中,也积累了一些真实场景下与友商相比的差异化方案,比如多AAR模式,易盾SDK加固支持多个AAR加固后随意搭配,更加灵活,同时这些多个AAR同时集成也无需初始化操作。