终端开发

Android开发之FileProvider相关知识 Android 权限 及设置描述信息 局域网开启 Android ADB 无线调试 安卓开发那些事之开发规范 安卓组件化之组件通信及拦截 安卓开发那些事之版本管理 安卓组件化之持续集成与自动构建 安卓组件化之组件调试和运行 安卓组件化之组件管理(导入、依赖、升级) 安卓组件化之框架设计 安卓开发那些事总纲 Android Textview 对HTML 的支持 appium 爬坑之基于 Chromedriver 测试 Android webview Linux 搭建 Android 编译构建环境 appium爬坑之iMac上基于appium多设备并发测试 appium爬坑之iMac上appium环境搭建及使用真机测试Android项目简介 H5页面通过指定Schema拉起Android应用 Android JSBridge简介 Gradle插件开发系列之发布gradle插件到开源库 Gradle插件开发系列之开发第一个gradle插件 Gradle插件开发系列之gradle插件调试方法 Gradle插件开发系列之总纲 一款检查Gradle依赖配置是否冲突的插件 记一次升级Android Gradle Plugin后databing编译报错填坑经历 iMac上 Xcode 相关设置及常见问题 iOS开发 -- 首次使用Xcode运行iOS项目代码 使用Android Studio开发可独立运行(runnable)混淆过的Jar程序 Android安装包精简系列之资源精简 Android安装包精简系列之图片优化 Android安装包精简系列之为什么要优化精简安装包 Android安装包精简系列(总纲) Android安装包精简系列之图标转字体 Gradle 相关资料汇总 Android编译常见错误解决 Android编译编译速度提升 终端基于gradle的开源项目运行环境配置指引 制作终端产品演示的gif 一个关于APK Signature Scheme v2签名的神奇bug定位经历 如何随apk一起打包并使用SQLite SDK热更之gradle插件(如何在SDK代码中自动插桩及如何生成补丁包) 关于Android的APK Signature Scheme v2签名相关的资料汇总 封装HttpURLConnection实现的简单的网络请求库 一款基于Java环境的读取应用包名、签名、是否V2签名等基本信息的工具 Android的APK Signature Scheme v2签名及一款基于Java环境的校验工具介绍 如何使用Eclipse开发可执行Jar程序,并生成混淆过的jar程序 Android 相关的学习资料整理(持续更新) macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio Android开发常用命令备忘 Google也看不下去被玩坏的悬浮窗了么? Android开发常用工具资源 SDK热更系列之概述(持续整理编辑中~) SDK热更系列之SDKHotfix待优化点 Android 终端开发相关的一些神图(持续更新) SDK热更系列之Demo项目介绍概述 SDK热更系列之Demo体验方法 SDK热更系列之如何获取应用在当前设备上的so对应的指令集 Gradle Android插件使用的中那些特别注意的点 Experimental Plugin User Guide(From Android Tools Project Site) 基于Android Studio使用gradle构建包含jni以及so的构建实例 基于Instrumentation框架的自动化测试 - Android自动化测试系列(四) Instrumentation框架介绍-Android自动化测试系列(三) 关于终端设备的设备唯一性的那些事之MAC地址 关于终端设备的设备唯一性的那些事之IMEI Android 检查应用是否有root权限 ant常见错误解决方案 Gradle介绍 iMac上Android Studio 相关设置及常见问题 ADB命令系列之再说ADB 再看Android官方文档之分享 再看Android官方文档之Fragment&数据保存 再看Android官方文档之Activity&Intent 再看Android官方文档之ActionBar和兼容性 ADB命令系列之 adb shell input(Android模拟输入)简单总结 再看Android官方文档之建立第一个APP Android开发调试常用工具 ANR(网络资料整理) Java参数引用传递引发的惨案(又一次Java的String的“非对象”特性的踩坑经历) android.view.WindowManager$BadTokenException,Unable to add window Android签名校验机制(数字证书)及命令行获取 keystore 公钥等信息 Robotium二三事-Android自动化测试系列(二) Robotium介绍-Android自动化测试系列(一) Android开发中遇到的那些坑 Eclipse使用中部分经验总结 Android中关于Nativa编译(NDK、JNI)的一些问题 Android简单实现的多线程下载模块 Android内存耗用之VSS/RSS/PSS/USS ADB命令系列之 Advanced Command URL编码中的空格(编码以后变为+) Android MD5后 bye数组转化为Hex字符串的坑(记一次为女神排忧解难的经历) Android学习之路 ADB命令系列之 Base Command Android Log的那些坑…………

开发工具

Linux JDK 安装、卸载、路径查看 替换Jcenter,发布开源代码到 Sonatype Maven Central 使用 gitstats 分析代码仓库 使用 Jekyll 搭建技术博客并部署到 CentOS 服务器 开发中常用的文档管理、云端笔记等效率工具介绍 iMac(OS X)常用图片处理工具介绍 使用 Octopress 搭建技术博客并使用腾讯云静态网站托管 使用腾讯云静态网站托管个人博客 使用 Jekyll 搭建技术博客 iMac上安装Python2.7 和 Python3 iMac 使用自带的 Apache 启用本地web服务 发布开源代码到jcenter Gradle环境变量那些事 iMac搭建jekyll本地环境 iMac(OS X)开发和使用中经验汇总(持续更新) iMac配置基于crontab的定时任务 iMac配置支持读取NTFS硬盘 新iMac机器装机及开发环境搭建攻略 git常用命令整理(已包括branch、tag等持续更新~) iMac使用过程中的简单故障解决 iMac上RubyGems相关的问题汇总 开发中常用的一些Chrome插件介绍 iMac(OS X)日常开发中各种代理设置方法汇总(shell、Android Studio、gem、npm) Markdown格式优化及使用技巧 iMac下制作含透明度图片及判断图片透明度 iMac(OS X)中设置大小写敏感的分区并切换 Linux & MacOS中一些常用命令备忘 iMac(OS X)搭建私有maven仓库,提供Nexus Responsitory镜像 iMac(OS X)El Capitan 更新遇到的那些坑 vi常用命令 iMac(OS X)常用开发工具介绍 iMac(OS X)不可或缺的套件管理器 —— Homebrew 开发环境通用设置 windows中一些常用命令备忘 问题定位之快速模拟请求 Ant中的SVN 使用 Markdown语法简介 SVN 常用命令

标签

android 50

ADB快捷输入法 - AAF 开发中图片图标处理常用工具资源 Linux 搭建 Android 编译构建环境 H5页面通过指定Schema拉起Android应用 Android编译常见错误解决 一个关于APK Signature Scheme v2签名的神奇bug定位经历 关于Android的APK Signature Scheme v2签名相关的资料汇总 封装HttpURLConnection实现的简单的网络请求库 一款基于Java环境的读取应用包名、签名、是否V2签名等基本信息的工具 Android的APK Signature Scheme v2签名及一款基于Java环境的校验工具介绍 如何使用Eclipse开发可执行Jar程序,并生成混淆过的jar程序 Android 相关的学习资料整理(持续更新) macOS(Sierra 10.12)上Android源码(AOSP)的下载、编译与导入到Android Studio Android开发常用命令备忘 Google也看不下去被玩坏的悬浮窗了么? Android开发常用工具资源 Android 终端开发相关的一些神图(持续更新) Gradle Android插件使用的中那些特别注意的点 Experimental Plugin User Guide(From Android Tools Project Site) iMac(OS X)搭建私有maven仓库,提供Nexus Responsitory镜像 基于Android Studio使用gradle构建包含jni以及so的构建实例 基于Instrumentation框架的自动化测试 - Android自动化测试系列(四) Instrumentation框架介绍-Android自动化测试系列(三) 关于终端设备的设备唯一性的那些事之MAC地址 关于终端设备的设备唯一性的那些事之IMEI Android 检查应用是否有root权限 iMac(OS X)El Capitan 更新遇到的那些坑 ant常见错误解决方案 Gradle介绍 iMac上Android Studio 相关设置及常见问题 ADB命令系列之再说ADB 再看Android官方文档之分享 再看Android官方文档之Fragment&数据保存 再看Android官方文档之Activity&Intent 再看Android官方文档之ActionBar和兼容性 ADB命令系列之 adb shell input(Android模拟输入)简单总结 再看Android官方文档之建立第一个APP Android开发调试常用工具 ANR(网络资料整理) Java参数引用传递引发的惨案(又一次Java的String的“非对象”特性的踩坑经历) android.view.WindowManager$BadTokenException,Unable to add window Android签名校验机制(数字证书)及命令行获取 keystore 公钥等信息 Eclipse使用中部分经验总结 Android内存耗用之VSS/RSS/PSS/USS ADB命令系列之 Advanced Command URL编码中的空格(编码以后变为+) Android MD5后 bye数组转化为Hex字符串的坑(记一次为女神排忧解难的经历) Android学习之路 ADB命令系列之 Base Command Android Log的那些坑…………

tags 53

替换Jcenter,发布开源代码到 Sonatype Maven Central Android开发之FileProvider相关知识 子勰开源项目展示 照片整理系之视频归档整理方案 使用 gitstats 分析代码仓库 Android 权限 及设置描述信息 局域网开启 Android ADB 无线调试 安卓开发那些事之开发规范 安卓组件化之组件通信及拦截 安卓开发那些事之版本管理 安卓组件化之持续集成与自动构建 安卓组件化之组件调试和运行 安卓组件化之组件管理(导入、依赖、升级) 安卓组件化之框架设计 安卓开发那些事总纲 Android Textview 对HTML 的支持 使用 Jekyll 搭建技术博客并部署到 CentOS 服务器 2018年春节仙本那海岛游行程规划 照片整理系列之单次整理流程 照片整理系列之整理及归档的总体方案 使用 Octopress 搭建技术博客并使用腾讯云静态网站托管 使用腾讯云静态网站托管个人博客 使用 Jekyll 搭建技术博客 颜色透明度对照表 Android JSBridge简介 Gradle插件开发系列之发布gradle插件到开源库 Gradle插件开发系列之开发第一个gradle插件 Gradle插件开发系列之gradle插件调试方法 发布开源代码到jcenter Gradle环境变量那些事 Gradle插件开发系列之总纲 一款检查Gradle依赖配置是否冲突的插件 记一次升级Android Gradle Plugin后databing编译报错填坑经历 服务器 迁移到 腾讯云 记录 2018年春节沙巴仙本那海岛游 聚会桌游助手 nodejs入门之后台服务的几种启动方式 nginx下多域名配置示例 nodejs入门之连接mysql mysql迁移之新建用户、备份还原数据库 iMac配置基于crontab的定时任务 iOS开发 -- 首次使用Xcode运行iOS项目代码 新iMac机器装机及开发环境搭建攻略 旅行中不可或缺的软件 iMac上RubyGems相关的问题汇总 接口设计六大原则 Canvas上更高效的画SVG 微信小程序开发之SVG的使用 旅行出行前准备列表 使用Android Studio开发可独立运行(runnable)混淆过的Jar程序 2017年端午川西滇北香格里拉环线(近200张图慎点) 照片整理系列之基于命令行的照片整理及查看工具 Gradle 相关资料汇总

SDK之关于SDK的一些想法

「 经验总结 」 ——  2015年06月15日

先废话上几句吧。

终于开始写这一篇了。这篇是规划的SDK总结系列的最后一篇,也是比较难写的一篇了。之前以为经过了这么多的坑,再来写这个系列没那么难,规划的就比较多。真的开始写的时候发现问题还是很多,加上中间一些个人的事情耽误,陆陆续续就写了两个月了(最近有点碎碎念,发现时间过的太快了)。希望这个周可以第一次完结!

和之前规划一致,这篇文章主要是对SDK的前路的一些思考。也是自己一直在思考,感觉团队也在思考的事情。从去年开始,我们的SDK就开始进入了稳定期,不会再有太多的新功能,很大的版本。这个时候SDK的主要功能,或者所有功能都已经完成以后,基于这个SDK我们还可以做什么?这里就说一说我们现在在做和自己认为还可以做的东西吧。

技术优化

除非一开始有一个比较牛逼或者有经验的开发来设计一套有效的成熟的架构(很可惜,我觉得我们当时设计的架构并不是很好),一般SDK前期的开发时间都很紧张,而且更多的精力聚焦在功能的实现上,因此很多时候采用的都是最快的解决方案,紧工难出细活,因此时间久了就会积累一些问题。而当SDK的功能开始稳定的时候,就该是划出时间和精力来通过重构优化代码模块和一些具体的实现了。

代码重构

这部分主要是针对SDK的一些技术上的改善和优化。通过模块化和插件化,SDK的开发者和使用者都可以很大的提高开发效率。

  • 模块化

    将SDK代码进行重构,让SDK可以更加容易扩展,尽量减少模块之间的耦合。让各个功能模块更加独立,甚至可以做到轻松的添加和删除模块而不会对别的模块有任何影响。这种做法可以轻松应对下面两种很常见的需求:

    • 时间久了以后,SDK就会出现功能模块的上线和下线,彻底的模块化可以轻松的移除下线的模块,很方便的处理这种变化。
    • 模块的彻底独立,可以最大的程度降低多人协同开发的沟通成本。
  • 插件化

    模块化主要是为了方便SDK的开发者适应各种需求的变化。而插件化则更主要的是为了方便SDK的使用者。当SDK的功能越来越多带来的最直接的问题就是SDK的包也会越来越大。对于有些开发者他只接入部分SDK功能却要集成整个包其实是不合理的。

    插件化就是指SDK开发者可以根据使用者需求提供接入相对应功能的差异化的SDK包,开发者可以自由动态生成SDK包来适应不同的需求。

业务配置

这部分主要是针对SDK的云端控制、业务隔离等的一些思考。通过全局限频、配置管理等模块一方面可以降低业务之间的相互影响,也更有利于SDK一些简单问题的修复。

  • 后台控制

    这部分主要是对于后台接口的调用的控制。包括权限控制、和全局限频等。权限控制用于控制应用对于接口访问的合法性,全局限频主要是针对每个APP,对于调用量应该给出限制。防止单个业务被攻击或者流量突然升高引起其余业务接口调用的不稳定。

    这里额外补充两点点关于全局限频的。

    • 全局限频怎么做:

      最简单的就是有一个地方记录调用额度,定时刷新额度,在接口调用时,每调用一次去减一。这种对于单台服务器比较容易,当分布部署以后就比较复杂,需要考虑更多的细节。

      因此一般的分布部署都是通过另一种方法:分布部署必然会有负载均衡,因此根据机器的数量将应用调用总量均分到每台机器上,当对应机器的限额用完,就提示超频。

    • 全局限频怎么限

      首先所有的应用会有一个预先的配额,作为预警配额,这个配额是根据应用情况预估的;其次除了预警配额还会有一个阈值的配合

  • 客户端配置

    云端配置是指客户端的一些开关、关键是配置值可以通过后台来修改。这样做可以:

    1. 当有业务配置错误的时候,我们可以通过云端控制修改配置,而无需业务修改版本。
      • 当某写功能出现异常的时候,可以通过云端修改配置,临时关闭相关功能。

数据上报

  • 关键日志

    关键日志上报同样是为了SDK的开发方便问题定位。主要用在以下场景:

    • 当游戏客户端遇到问题的时候,打开指定用户的日志控制开关,他就可以把本地日志远程上传。协助开发者分析错误,定位问题。

    • 对于业务逻辑下的某些异常逻辑增加关键日志自动上报,就可以协助开发者提前发现和定位解决问题,不再被动。

  • 数据上报

    数据上报的意义更加重大了,尤其是当数据上报和关键日志、云端配置配合,就是客户端问题定位的神器。这个地方的数据上报不包括一些接口调用数据等正常数据的上报。

    通过异常数据的实时上报,我们可以:

    • 建立一套客户端的监控和告警机制,实时了解客户端版本情况。当某一接口异常的时候,提前开启关键日志分析问题。

    • 除了解决问题,客户端的异常上报如果包含了后台接口的返回异常,就可以同时监控后台接口的稳定性,尤其是当后台接口的监控和告警不可信的时候,可以及时通知后台。(别不信,现实中这种情况太多太多)

安全性

网络请求、配置、DB数据存储等,采用更高效、更安全的处理措施。具体的例如:

  1. 网络请求

    可以使用https,既可以提高安全性,还可以防止国内运营商常见的DNS劫持等问题。

  2. 配置、DB数据存储

    • SDK的配置、SDK相关的数据以及用户数据都是SDK的核心内容,一定要使用有效的加密方案来保存。对于加密以后带来的性能问题可以通过尽可能少的加解密次数以及不同级别的加密算法等来解决。
    • 加解密的密钥以及加解密的算法的本身的安全性也要保证,建议是直接放在SO,然后再通过SO的加固增强安全性。
    • 所有的加密行为最终使用的加密密钥最好时和设备相关,防止因为用户手机被恶意程序攻击远程拷走应用私有目录的信息以后带来问题。而因为imei和mac地址的不唯一,建议加密时不要简单的使用imei或者mac地址。

稳定性

这部分主要包括:

  1. SDK的质量保证
  2. SDK遇到问题时候如何快速解决问题。

具体的做法可以有:

  • SDK的各种测试:这部分主要是针对SDK的版本,除了常规的SDK的功能测试,兼容性测试以外,建议可以通过自动化测试、性能测试、以及后台配合的异常测试对SDK的版本进行更加全面完备的测试。
  • 使用Coverity或者FindBugs之类的代码静态扫描工具每日或者每次提交都进行代码扫描,尽可能降低一些可以遇见的编码错误。
  • SDK自身的热更新:SDK的热更新主要是为了解决SDK遇到问题时自身的bug修复,因为如果通过正常的版本发布,SDK的线上紧急bug的修复成本就会很高。SDK的热更新包括Java代码和Native的代码的热更新,通过后台的下发策略,保证当线上的SDK版本遇到问题的时候,可以通过后台直接下发更新包,尽可能的减小影响范围以及问题的修复成本。

增值服务

上面讲的都是当SDK的基础功能开发结束以后,技术侧还能做什么。当技术相关的优化工作都做完的时候,还能继续做什么呢?下面主要是从非技术的角度进一步分析一下:

分级服务

分级服务是指对与接入SDK的业务进行分级支持(当然如果你的人力充足,完全不用分级)。分级服务的原因就是给开发者提供更多有利于他开发的支持。比如:

  • SDK详细介绍

  • SDK的接入教程,甚至是视频的,图文的等。

  • 面对面的联调支持

  • 一般的游戏开发者都只熟悉引擎,不熟悉Android系统,所以协助游戏解决一些他们遇到的系统相关的问题等

  • 熟悉开发者常用的框架或者工具,了解SDK与这些框架和工具结合的时候会有哪些问题,怎么解决

对于这部分工作,个人其实是比较有争议的,虽然我也认同SDK发展到最后就是提供服务,就是做服务。但是应该有一个红线或者一个度在里面。我们应该是尽最大的努力做好份内的事,而不死越俎代庖去协助开发者解决开发者开发中遇到的问题。

数据运营

这部分内容主要说一下SDK相关的数据分析和数据挖掘相关的内容。这部分内容本来计划用一篇文章来规划说明的,竟然忘了。那就简单汇总一下添加到这里吧。

SDK的数据有哪些

  1. 接口调用数据

    接口调用数据,包括接口调用的成功率,失败率,调用次数等。这部分主要用来监控接口的稳定性,及时的发现问题。另一方面这些数据也是SDK的品牌数据,用于进行数据推广等。

  • 开发者、接入应用相关数据。

    开发者和应用相关的数据包括,开发者的地域分布、接入应用的类型、单开发者接入应用的数量等等。这部分数据有助于了解当前开发者的活跃地带,为商务提供支持,了解目前的接入应用的分布,可以了解应用市场的走向。

  • SDK的使用习惯数据。

    SDK的使用习惯数据包括某个功能开发者一般用来做什么等,例如SDK面向用户的公告,开发者一般用来发公告还是活动,一般同一时间内有效的会有几条,发送的频率一般是多久等。这部分数据可以协助新的开发者更有经验的使用SDK的相关功能,同时将SDK的功能最大化。

  • SDK的用户数据。

    用户数据内容比较多,再细分一下,包括用户个人数据,用户设备数据,用户使用习惯数据、用户和应用的相关性数据。

    • 用户个人数据,包括用户的地域分布、性别、职业等。这部分数据用于制作用户画像,让运营更加了解用户的实际情况。
    • 用户设备数据,包括用户设备的机型、系统、系统版本、内存、CPU、网络、分辨率、DPI、传感器等数据。这部分可以让开发者们更了解当前使用者的设备情况,更好的做兼容和后续方向的规划。
    • 用户的使用习惯数据,包括使用时段、使用时长、打开次数、打开频率、留存、活跃等数据。通过这部分数据,可以让运营更加了解用户的使用习惯,更容易掌握推广的时机。
    • 用户应用的相关性数据。包括单一用户手机上同类型APP的安装数量,每天的使用APP的数量等数据。这部分数据对于市场的开拓会有很大的效果。

在大数据的时候,数据的拥有者是大有可为的,基于SDK的数据分析,可以为SDK的开发者,SDK的使用者提供更多的基于数据分析的运营、开发、决策等建议。然而这部分缺又是最容易忽略的。

另外做大数据的前提是,SDK的接入量要足够多,使用用户要足够大,这是一个持续而且旷日持久、前人栽树,后人乘凉的过程。


赞赏

取消
微信扫一扫,赞赏子勰
扫码支持
屌丝程序猿,鸡血攻城狮!努力学技术,潜心做精品!