Android SDK 类产品开发总结

原作者:snow,转载已获得作者授权。

原文链接:https://democome.com/article/android-sdk-development-summary

在开发Android应用时,我们需要用到Google提供的SDK。当我们的开发的某一个模块足够通用也可以封装成SDK给其他业务方使用。什么是一个良好的SDK类产品?站在开发者和接入方的角度我认为应该满足以下几点:

# 对于开发者

  • 良好的可维护性
  • 设计合理、可扩展性强
  • 代码逻辑清晰合理
  • 监控及数据打点完备

# 对于接入方

  • 集成简单,最好一行代码搞定
  • 接入文档,接入实例详细
  • 崩溃率低、内存占用小、SDK尽量小
  • 出现问题及时响应解决

以上总结起来就是对开发者友好、对接入方友好。当别人接手代码没有砸键盘的冲动甚至想和你干一杯82年的雪碧。当业务方接入你的SDK时感到神清气爽。下面总结一下本人在开发过程中总结的一些点,抛砖引玉,共同探讨。

# 注意点

# 1、熟悉你的代码

这个放在第一条,是每个人要对自己的代码逻辑负责。

# 2、合理的接口设计

接口设计尽量简单,尤其是对业务方来说,没有那么多时间研究你的方法。接入越简单对业务方成本越低。

# 3、内存分配与回收

申请合适的内存,如果数组只放10个数据,就没必要申请20个空间大小。不用的资源及时回收。对于有多个进程的应用,要考虑是否有必要在每个进程都初始化SDK。

# 4、慎重选择第三方库

本身我们要做的就是一个SDK类的产品,尽量不使用第三方库。因为它会增大我们SDK包的大小。如果必须要使用,要选择稳定的第三方库,同时需要注意第三方库冲突的问题。你的接入方可能也依赖了这个第三方库,甚至和你的版本不一样。这时有两种选择,在你的SDK中以provided的方式依赖。二是修改第三方库的包名以解决冲突(这样会增大最终应用的大小)。关于修改包名可以使用jarjar.jar。可参考这篇文章

# 5、ContentProvider authorities 冲突导致应用无法安装

<provider
    android:name="com.democome.SPContentProvider"
    android:authorities="com.democome.sdk.sp"
    android:exported="false"
    android:process=":push" />

 

像上面这样,如果多个应用接入了我们的SDK,那么第二个安装就会出问题“应用组件的命名与已安装应用有冲突”,导致第二个应用无法安装,正确的做法是authorities和包名相关,如下:

<provider
    android:name="com.democome.SPContentProvider"
    android:authorities="${applicationId}.sdk.sp"
    android:exported="false"
    android:process=":push" />

# 6、异常处理和日志

什么样的异常自己处理,什么样的异常抛给业务方。我认为如果是业务方接入问题导致的异常,可以给业务方抛出异常。某些流程的关键环节打印出日志,当然这个日志是个可以开关的。

# 7、多进程操作SharedPreferences

多进程操作SharedPreferences是有问题的,尽管SharedPreferences有一个MODE_MULTI_PROCESS模式,但这个模式也是不靠谱的,在一个进程中修改SharedPreferences中的值,另一个进程不会同步更新。解决办法是可以通过ContentProvider进行进程的同步操作。

8、安全问题

本地拒绝服务漏洞,getIntent()的intent附带空数据、异常或畸形数据,会导致应用崩溃。解决办法需要加try catch。

9、打包管理

规范的打包管理系统,版本的管理,发布的管理等。

10、aar资源名称

aar中资源的名字加上一个前缀避免引用错误。

11、混淆

这个仁者见仁,有些大名鼎鼎的SDK都没有混淆。

12、内存泄漏

用leakcanary检测,不要有内存泄漏。

13、打点统计

SDK有良好的运行时监控机制,在某些关键地方以及崩溃打点上报,及时获取SDK运行状态,保证运行时稳定。但是打点也不能太频繁,避免对业务方业务造成影响。

14、特定机型适配

这点没什么好说的,其实也是最坑的,各种乱七八糟的坑需要填。

以上就是在SDK开发过程中的一些总结,以后有更新会继续补充,如果你在开发过程中有什么经验或教训欢迎留言交流!

使用 Flutter 开发 macOS App

原作者:WhatsXie,转载已获得作者授权。

原文链接:https://zhuanlan.zhihu.com/p/50218676

Flutter 框架

Flutter 是 Google 开发的一套全新的跨平台、开源 UI 框架,支持 iOS、Android 系统开发,并且是未来新操作系统 Fuchsia 的默认开发套件。

Flutter 通过跨平台的 Skia 图形库来实现图形渲染,只依赖各个系统的图形绘制相关的 Api,可能是目前为止真正意义上的全平台 UI 框架。

借助 Feather 平台,我们可以在 MacOS 和 Windows 上运行我们的 Flutter 应用程序,也就是说您可以编写一个可以在所有主要桌面和移动设备上运行的应用程序。

Feather 平台

Feather 是一个在桌面上运行 Flutter 应用程序的平台。

  • 在 Mac 和 Windows 上运行 Flutter 应用程序的编译器和库
  • 一个应用商店,您可以使用它来发布和更新应用,并为用户提供最小的安装阻力
  • 一组可选的扩展 Flutter UI 小部件,用于高级界面设计
  • 目前处于 alpha 测试阶段
  • 免费使用的商业执照

官网:feather-apps.com

配置环境

进入官网,点击 Build an App Now 下载 Mac 端编译器。

下载完成后打开 Feature Workbench,这里就有了墙的存在,非精品网可能要自行处理一下。

Google 账户登录后,可以看到工程列表,如果你第一次做,当然是空的。

项目改造

我们这里新建一个项目为例,教大家怎么把 Flutter 项目运行到 MacOS 上,非常简单哦。

1. 打开终端,新建一个 Flutter 项目

flutter create mac_app

2. 打开 mac_app 项目中 main.dart 修改两处:

1)在代码顶部引入 foundation 架包

import 'package:flutter/foundation.dart';

2)改造 void main() 函数,增加平台覆盖

void main() {  
   debugDefaultTargetPlatformOverride = TargetPlatform.iOS; 
   runApp(MyApp());
 }

保存代码,就可以了。

新建 Feather 项目

点击 Feature Workbench 界面右下角的加号,进入新建页面,点击 BROWSE 找到 Flutter 项目工程。

设置应用名和图标就创建完成了。

点击 TEST 会打开 Xcode, command + r 运行就会看到 Flutter 的官方示例运行在 MacOS 上了。

Flutter 右上角的 DEBUG 是环境标记,不想看见它,切换生产环境它就不见了

发布和使用

点击 PUBLISH 设置应用描述和截图,发布应用到 Feather 商店。

发布完成后再次进入项目列表,就可以看到 WEB 选项,点击就会进入 Feather 应用商店的网站。

更新

和发布流程一样,只是需要注意修改版本号、应用描述和截图,最后上传应用即可。

效果演示

上面使用的是 Flutter 官方的示例工程,有朋友表示看起来不过瘾,so 我从网上找了一个看起来很适合做跨平台服务的示例工程,经过改造后我将其运行到了 macOS 系统上。