美文网首页
写出一个自己的Android移动应用和小程序

写出一个自己的Android移动应用和小程序

作者: BlueSocks | 来源:发表于2022-07-27 14:43 被阅读0次

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

    我们来试试编写一个SDK吧!

    一、SDK是什么?

    SDK 全称 Software Development Kit,广义上的 SDK 是为特定的软件包、软件框架、硬件平台、操作系统等建立应用程序时所使用的开发工具的集合(在 iOS 项目中,SDK 也被称为库)。

    在 iOS 开发或 Android 开发中,不可避免会需要使用第三方工具提升产品的开发效率,比如用于消息推送的极光,用于第三方支付与登录的支付宝,微信等等。但大多数商用产品都不会直接给出源码(可能只有为爱发电的开源项目才会无私提供源码),而我们在开发 App 时就需要将这些第三方 SDK 集成在我们的项目之中。

    SDK 的全称是 Software Development Kit,翻译过来是软件开发工具包,这是一种被用来辅助开发某类软件而编写的特定软件包。

    二、SDK 设计的基本原则有哪些?

    一款好用且设计充分的 SDK 必须要遵循以下 4 条基本原则,即:

    1. SDK 安全,稳定
    2. 统一的开发规范
    3. Library 小而精
    4. 不依赖第三方 SDK
    • 安全,稳定:考虑到 SDK 是需要嵌入到 App 里面去的,所以 SDK 最重要的特性就是安全性,不会因为乱开放接口而导致 App 数据泄露;其次重要的是 SDK 的稳定性, SDK 的 Crash 如果没有被捕获进行处理,则会导致应用彻底崩溃(这样就会导致第三方接入的 App 体验性非常差),甚至会直接导致接入方的用户流失;
    • 统一的开发规范:对于 SDK 开发规范来说,统一的命名规范很重要,最好的状态是“接入方看到接口命名就能知道是哪家厂商的 SDK”,换句话说就是 SDK 的命名规范统一,形成自己公司的品牌效应,此外也方便开发者进行接入使用。此外也需要具有自己的编码规范,你可以在网上找到大厂的规范模板,并通过借鉴整理出属于自己的规范,从而尽早统一代码风格;
    • Library 小而精:小是指要避免造成接入方的App增加很大,不然会引起接入方的不满,甚至下架。精是指功能要专注,比如极光推送,就是专注推送相关的功能;
    • 不依赖第三方 SDK:这个也很好理解,SDK 中如果又依赖其他第三方 SDK, 不仅会导致 SDK 的体积变大,也会影响接入方集成 SDK 的相关成本。

    三、在 Android 环境中如何开发 SDK

    1. 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++ 代码使用。

    2. 创建 SDK 工程

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

    选择 Android Library,并在名称中输入 GPush

    添加成功后我们会在左侧看到对应的 Libray 文件

    3. 添加依赖项

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

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

    先点击加号,再选中对应的 Module Dependency

    将其加入依赖中

    4. 接口设计

    既然是做一个推送新闻的接口,那就必须要分为客户端和推送端,即 Client#onReceiveMessage 和 GPush#pushMessage。

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

    可以看我画的 UML 图,帮助你更进一步理解

    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 
    

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

    5. 最后注意事项 — 混淆

    基于代码保护的目的,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.** {*;}
    

    如果正确按照教程,那相信你已经成功的做出了属于自己的第一个 Android SDK,本期教程依然基于 mac 电脑进行实现,如果你的电脑是 Windows 或者其他操作系统,还需要进行一些其他的灵活配置。

    作者:火爆的茶壶
    链接:https://segmentfault.com/a/1190000042196633

    相关文章

      网友评论

          本文标题:写出一个自己的Android移动应用和小程序

          本文链接:https://www.haomeiwen.com/subject/dpjzirtx.html