一个好的SDK应该具备易用性、稳定性、轻量、灵活的特点,而个推作为国内第三方推送市场的早期进入者,一直致力于为开发者提供高效稳定的推送SDK。
经过十年的深耕与创新,个推夯实了行业地位。截止2019年6月,个推SDK累计安装量超440亿,日活独立设备数达4.3 亿,并成功服务了人民日报、新华社、微博、马蜂窝、酷我音乐等一系列明星APP。辉煌数据的背后是强大的技术支撑。
这期文章,我们特地采访了个推Android 资深开发敬瑜,以个推推送SDK为例,来聊聊打造大型SDK的关键技术点。
APP 和 SDK两者关系密切,APP是SDK的主要载体, SDK 则是 APP开发所需的重要工具。从研发者的角度来看,SDK开发和 APP开发均属于 Android 顶层应用开发,并无本质区别,两者的目的均是要提供产品给客户使用;但从商业角度来讲,APP 是to C 的产品,用户是广大群众;而 SDK 则是to B 的产品,用户为广大开发者,两者在运营模式上有所不同。
SDK没有UI交互,用户使用 APP 时并不会感知到SDK 的存在。但是作为APP的重要部分,SDK的性能直接影响着APP的性能,也间接影响着用户在使用APP时的体验和感受。总结个推推送SDK的开发经验,我们认为SDK开发最需要注意的是其稳定性。
作为一款第三方 SDK,稳定性是第一要素,我们要保证推送SDK在不同环境下(APP、终端设备等)都能正常运行。要想保障稳定性,复杂环境的兼容是关键。减少使用非 SDK 接口也有助于提升稳定性。
除了稳定性外,以下几个问题对于打造优质SDK也很重要。
个推 SDK 支持 Android 端和 iOS 端,以下文章均使用 Android 端来举例。
截止目前,Android 系统从07年发布第一版至今,经历了多次迭代,Android Q为其最新版本。个推Android SDK 支持 Android 2.3及以上版本,几乎可以在市面上现存的所有Android 版本上运行。
** 1)版本适配**
APP 主要在手机上运行,若想 APP 在 Pad、电视之类的智能设备上运行,则基本需要单独适配,也就是说,APP 会根据其使用环境调试相应的版本。而 SDK 的运行环境相对复杂,我们根本不知道自己开发的 SDK 会在什么样的环境下运行,可能是手机、Pad、电视,也可能是车载设备,甚至是冰箱等智能家居设备。这类设备的 Android 系统版本从 2.3至10.0 不等。我们在开发SDK 的时候需要尽量地向下兼容。为此,个推推送 SDK 依旧保留着对 Android 2.3 系统的兼容。
** 2)厂商兼容**
一个成熟的 SDK 势必要保证在不同的厂商设备上正常运行,尤其是当SDK 内部涉及到Android 四大组件时需要特别注意厂商的兼容性,注意其是否会限制固定 action 的广播使用及限制固定类名 service 的启动。而如果 SDK 开发涉及到 Android framewrok 的引用,某些功能可能会失效。比如AndFix 的底层实现依托于 Art/Dalvik 虚拟机的架构,但是大部分厂商会对虚拟机进行定制,修改底层 ArtMethod 结构,这时,AndFix将无法在修改过虚拟机的设备上生效。
所以在 SDK 开发过程中我们要尽量避免Android Framework 的引用。个推在使用Android 四大组件的时候,会要求开发者提供自定义 Service,其Service 只需要继承个推默认的即可,这样可以保证 SDK 在不同厂商上均能正常运行。
04 怎么看待现在市面上的 SDK广泛支持多混合开发这一现象?
大前端开发是必然的趋势,现在新推出的产品会优先使用混合开发,保证一套代码可以在多个终端上运行。因此,一个成熟的 SDK 有必要对不同的语言框架进行适配。目前,个推 SDK 不仅支持 Android、iOS系统,还支持混合开发,如unity3d cocos2dx react-native flutter cordova apicloud等。具体见
个推实验室
05 Android SDK 是否会使用开源项目?
- 使用开源项目会增加包的体积;
- 不能保证开源项目支持复杂的终端环境;
-客户的 APP可能已使用开源项目,将导致编译失败;
开拓Google Play 市场是各大互联网公司的长远规划之一。个推Android SDK Google Play版本自发布以来,积极适配复杂的海外环境,为海外App消息的稳定下发提供强大的支撑和保障。为了有更好的用户体验,个推推送 SDK 还在国外众多地方布置了机房,以保证推送的到达率。另外,个推推送SDK还需要对 Google Play 制定的各种规则进行适配,以及还要考虑不同国家不同版本机型的适配问题。这要求我们在开发过程中尽量使用 Google 生产的手机进行调试与测试。
为了给用户更好的使用体验,我们会尽可能地降低SDK对电量以及流量所造成的消耗。为此,我们不会使用蓝牙这类电量消耗较高的工具。此外,我们还会采用多链路合并技术来节约流量。
为了准确地了解所耗电量、流量的降低情况,我们还会做一个全面的测试。每次发版之前,我们都会采用严格的测试标准,使用特定的 APP 进行电量压测。为了尽可能地排除外来因素的干扰,保证测试的准确性,我们往往会使用集成了个推推送 SDK 的 APP来测量。常见测量 APP 的方式有Batterystats & bugreport和Battery Historian。具体细节可以自行查阅 PowerProfile.java 和 power_profile.xml 的使用与原理。
经过近 10 年的优化与升级,个推推送 SDK 的异常情况已经控制在一个非常非常低的水平,但因为 Android 市场碎片化非常严重,SDK 在如此碎片化的环境下运行难免会出现各种意想不到的突发情况,为此我们专门开发了SDK运行自查系统,类似于精简版的 bugly。该内部产品与 SDK 相辅相成,可以自主检测 SDK 的异常情况,并在发现异常后主动上报。其次,在代码层面,我们也做了一些防控,避免 SDK 因为异常而导致无法正常使用。另外,我们还成立了技术支持团队,服务广大的开发者,定期回访客户,帮助解决客户遇到的问题。
SDK开发过程中,我们还需要注意安全性。安全性不仅仅代表网络数据交互的安全、本地数据存储的安全,也涉及到 SDK 的加固、混淆、第三方安全软件审核。举例来说,个推 Android SDK 提供了四大组件的对接,SDK 内部会特别注意,避免这些组件被反序列化攻击。为了让开发者更加放心地使用我们的SDK,我们公司内部建立了严格的安全管理机制,来保障SDK的安全性。
其实从 Android APP 诞生开始,SDK 的开发就从未中断过。SDK 开发者与 APP 开发者的工作内容基本相同,但是开发 SDK 更注重对 Java 语言以及 Android 底层的理解。如果大家想从事Android SDK 开发,建议多研究 Java 的相关知识,深入理解 Android framework 层。
开发SDK并不难,难的是如何让自己开发的 SDK 在复杂的环境下稳定运行。这需要我们对 SDK 的架构有一个比较清晰的认知,并对前文所提到的问题进行认真思考。
多年来,个推 SDK始终以服务开发者为己任,持续为用户提供优质的体验。为了进一步提升推送后台的保活能力,个推已发布 2.13.3.0版本,并对 Android Q 进行了适配,请前往个推文档中心下载http://docs.getui.com/download.html,即刻体验。
