Android如何写一个SDK



上一章节我们从零到一完成了一个App开发,今天这个章节我们编写我们的第一个SDK

App 开发更偏向于用户层面,从 UI 展示到业务逻辑处理,全程处理用户的行为。而 SDK 面向的是开发者,开发更偏向于功能方面,注重功能的开发实现。

什么是 SDK?

SDK全称 Software Development Kit,广义上的 SDK 是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合。 做 Android 开发避免不了要使用很多第三方的 SDK,比如极光 SDK、支付宝 SDK、微博 SDK 等等。所谓 SDK 就是一个开发工具包,全称是 Software Development Kit,翻译过来是软件开发工具包。SDK 通常是为辅助开发某类软件而编写的特定软件包。

SDK 设计的基本原则

  1. SDK 安全,稳定
  2. 接口命名规范
  3. library 小而精
  4. 不依赖第三方SDK

SDK是嵌入App里面去,SDK 的首要就是保证基本的安全性,不能乱开放接口导致App数据泄露,其次是SDK的稳定性, SDK 的crash 如果没有被try catch 捕获到,会导致App崩溃,这样会导致第三方接入的 App 体验性非常差,会造成接入方的用户流失。 对于 SDK 开发来说,统一命名规范很重要,最好的状态是接入方看到接口命名就能知道是哪家厂商的 SDK。换句话说就是 SDK 的命名规范统一,形成自己公司的品牌效应。同时也方便接入方使用。 对于编码规范,网上都有各个大厂的规范模板,可以选择其中一个或自定义自己团队的规范,尽早统一代码风格。 避免造成接入方的App增加很大,不然会引起接入方的不满,甚至下架。 精是指功能要专注,比如极光推送, 就是专注推送相关的功能。不依赖第三方SDK,这个也和很好理解,SDK 如果依赖的第三方SDK, 这样既会导致SDK增加,也会增加接入方的集成成本,不利于SDK 小而精的原则。

Android SDK 介绍

Android App集成第三方SDK的文件类型,主要有三种,一种是 jar 包文件,和 so 文件 ,另外一种是 aar 文件, jar 包是Java 提供的SDK 文件类型,里面包含的是纯Java编译过后的代码。so 一般是 C和 C++打包的成库的文件。 aar 名字来源于 Android Archive,见名知义,是一个 Android 库项目的二进制归档文件,使用 Android Studio ,非常简单可以生成一个 AAR 文件。aar 库文件里面,包含了 jar 和 so,还有资源res等文件,结构等同一个app。 它可以提供构建应用所需的一切内容,包括源代码、资源文件和 Android 清单。不过,Android 库将编译为您可以用作 Android 应用模块依赖项的 Android ARchive (AAR) 文件,而不是编译为在设备上运行的 APK。与 JAR 文件不同,AAR 文件会为 Android 应用提供以下功能:

  • AAR 文件可以包含多项 Android 资源和一个清单文件,让您除了能够在 Java 类和方法中进行捆绑以外,还能够在布局和可绘制对象等共享资源中进行捆绑。
  • AAR 文件可以包含 C/C++ 库,供应用模块的 C/C++ 代码使用。

SDK 工程创建

打开上一个章节我们创建的工程,在工程上创建一个library module,命名为GPush,我们模拟实现一个推送简短新闻的接口 image.png image.png image.png

添加依赖项

如需在同一项目中的另一个应用或库模块中使用新的 Android 库代码,请添加一个项目级依赖项:

  1. 依次转到 File > Project Structure > Dependencies
  2. 选择要在其中使用库的模块。
  3. Declared Dependencies 标签页中,点击 +,然后在下拉菜单中选择 Module Dependency

image.png image.png

接口设计

Client#onReceiveMessage GPush#pushMessage 从下面给出UML图可以看出,只需要一个方法就可以监听到新闻推送了,GPushImpl#start(Client client) image.png

GPush 类

package com.myname.library;
interface GPush {
    void pushMessage(String msg);
}

GPushImpl 类

package com.myname.library;

import android.os.Handler;
import android.os.HandlerThread;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;

public class GPushImpl implements GPush {

    private List<Client> mClients;
    private HandlerThread mHandlerThread;
    private Handler mHandler;
    private Random mRandom = new Random();
    private List<String> msgs = new ArrayList<String>() {
        {
            add("1、文旅部:严查以中老年为目标的包价游产品");
            add("2、加快推进沿长江户籍改革,服务长江经济带高质量发展。");
            add("3、今年首批10家非法社会组织网站被关停,含中国文艺名人协会等。");
            add("4、上海:5月1日起,电动自行车骑乘人员必须戴头盔。");
            add("5、广州:清明祭扫实行实名预约,倡导网上祭扫、错峰延后祭扫。");
            add("6、河北武安铁矿致6死事故涉嫌瞒报,企业相关人员被控制。");
            add("7、黄峥辞任拼多多董事长:将放弃超级表决权,投入科学研究。");
            add("8、打破国外20年垄断,国产人工心脏研发成功,但商用落地时间暂不确定。");
            add("9、调查:六成青年入睡时间晚于23点,梦多睡眠浅成年轻人睡眠主要问题。");
        }
    };

    GPushImpl() {
        mClients = new ArrayList<>();
        mHandlerThread = new HandlerThread("Push-Thread");
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
    }

    @Override
    public void pushMessage(String msg) {
        Iterator<Client> iterator = mClients.iterator();
        while (iterator.hasNext()) {
            iterator.next().onReceiveMessage(msg);
        }
    }

    public static void start(Client client) {
        GPushImpl gPush = new GPushImpl();
        gPush.mClients.add(client);
        gPush.mHandler.post(gPush.mRunnable);
    }

    private Runnable mRunnable = new Runnable() {

        @Override
        public void run() {
            mHandler.postDelayed(mRunnable, mRandom.nextInt(10000));
            pushMessage(msgs.get(mRandom.nextInt(msgs.size())));
        }
    };
}

Client 类

public interface Client {
    void onReceiveMessage(String msg);
}

开始监听新闻推送

GPushImpl.start {
            Toast.makeText(MainActivity@this,it,Toast.LENGTH_LONG).show()
        }

SDK 打包

 ./gradlew :GPush:assembleRelease

image.png 打包完成后就行生成一个aar文件, 这个文件就是我们打包的结果了。

最后注意事项

混淆

基于代码保护的目的,Gradle 打包默认会根据build.gradle和proguard-rules.pro配置的混淆规则,来对代码进行一个混淆, 如果library里面使用了如GSON或者反射等技术则需要对部分类keep

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
-keep class com.myname.library.** {*;}



【作者】:岑晓中

【公开范围】:公司内和公司外

© FinClip Product Team all right reserved,powered by Gitbook最后更新时间: 2021-12-20 03:53:41

results matching ""

    No results matching ""