业务拓展 SDK 开发教程

更新时间:2024-01-23 07:40:55下载pdf

本文提供手把手教程,介绍如何集成业务拓展 SDK,通过少量代码,从零开始实现一个简单的家庭、设备和家庭成员之间互动的 App。

前提条件

在实现功能以前,按照以下要求准备开发环境:

  • Android Studio 4.1 以上版本。
  • Android API 级别 23 或以上。
  • 一个有效的 智能生活 App SDK 项目。在涂鸦 IoT 开发平台 App 控制台获得以下信息,详情请参考 准备工作
    • 获取 App SDK 的包名,以及 AppKeyAppSecret
    • 下载构建完成的 Android 资料包,解压得到的 security-algorithm-1.0.0-beta.aar 文件。

创建项目

本小节介绍如何创建项目并为项目添加体验业务拓展 SDK 所需的权限。

  1. (可选)创建新项目。详见 Create a project

    1. 打开  Android Studio,选择  New Project
    2. 选择  Phone and Tablet > Empty Views Activity,单击 Next
    3. 设置项目名称和存储路径,选择语言为  Kotlin,单击 Finish,创建 Android 项目。

    创建项目后,Android Studio 会自动开始同步 gradle,稍等片刻至同步成功后,再进行下一步操作。

  2. 添加网络及设备权限。打开 /app/manifests/AndroidManifest.xml 文件,在 <application/> 后面添加如下权限:

     <uses-permission android:name="android.permission.INTERNET"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    

    设备配网激活需要其他权限,例如定位和蓝牙权限。参考设备配网教程,根据需要进行添加。

  3. 配置混淆规则。打开 /app/proguard-rules.pro 文件,添加如下代码,以便防止涂鸦 SDK 的代码被混淆。如果已有,可忽略。

    #fastJson
    -keep class com.alibaba.fastjson.**{*;}
    -dontwarn com.alibaba.fastjson.**
    #mqtt
    -keep class com.thingclips.smart.mqttclient.mqttv3.** { *; }
    -dontwarn com.thingclips.smart.mqttclient.mqttv3.**
    #OkHttp3
    -keep class okhttp3.** { *; }
    -keep interface okhttp3.** { *; }
    -dontwarn okhttp3.**
    -keep class okio.** { *; }
    -dontwarn okio.**
    -keep class com.thingclips.**{*;}
    -dontwarn com.thingclips.**
    # Matter SDK
    -keep class chip.** { *; }
    -dontwarn chip.**
    

集成 SDK

  1. 打开项目根目录下的 build.gradle 文件,添加 Maven Central 依赖。如果已有,可忽略。

    buildscript {
     repositories {
         maven { url 'https://maven-other.tuya.com/repository/maven-releases/' }
         maven { url "https://maven-other.tuya.com/repository/maven-commercial-releases/" }
    
         google()
         mavenCentral()
         mavenLocal()
         maven { url 'https://maven.aliyun.com/repository/public' }
         maven { url 'https://central.maven.org/maven2/' }
     }
     dependencies {
         classpath 'com.android.tools.build:gradle:7.4.2'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10"
     }
    }
    
    allprojects {
     repositories {
         maven { url 'https://maven-other.tuya.com/repository/maven-releases/' }
         maven { url "https://maven-other.tuya.com/repository/maven-commercial-releases/" }
         google()
         mavenCentral()
         mavenLocal()
         maven { url 'https://maven.aliyun.com/repository/public' }
         maven { url 'https://central.maven.org/maven2/' }
         maven { url "https://jitpack.io" }
    
     }
     configurations.all {
         exclude group:"com.thingclips.smart",module:"thingplugin-annotation"
         exclude group:"com.thingclips.android.module",module:"thingmodule-annotation"
         exclude group: "com.thingclips.smart" ,module: 'thingsmart-modularCampAnno'
         resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
     }
    }
    

    如果您使用的是新版本 Android Gradle 插件 DSL 元素结构,可参考如下配置:

    //setting.gradle 配置
     pluginManagement {
     repositories {
         google()
         mavenCentral()
         gradlePluginPortal()
         mavenLocal()
    
         maven { url 'https://maven-other.tuya.com/repository/maven-releases/' }
         maven { url "https://maven-other.tuya.com/repository/maven-commercial-releases/" }
         maven { url 'https://maven.aliyun.com/repository/public' }
         maven { url 'https://central.maven.org/maven2/' }
     }
     }
    dependencyResolutionManagement {
     repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
     repositories {
         google()
         mavenCentral()
         mavenLocal()
         maven { url 'https://maven-other.tuya.com/repository/maven-releases/' }
         maven { url "https://maven-other.tuya.com/repository/maven-commercial-releases/" }
    
         maven { url 'https://maven.aliyun.com/repository/public' }
         maven { url 'https://central.maven.org/maven2/' }
         maven { url "https://jitpack.io" }
     }
    }
     //build.gradle
    plugins {
     id 'com.android.application' version '7.4.2' apply false
     id 'com.android.library' version '7.4.2' apply false
     id 'org.jetbrains.kotlin.android' version '1.8.0' apply false
    }
    subprojects {
     configurations.all {
         exclude group:"com.thingclips.smart",module:"thingplugin-annotation"
         exclude group:"com.thingclips.android.module",module:"thingmodule-annotation"
         exclude group: "com.thingclips.smart" ,module: 'thingsmart-modularCampAnno'
         resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
     }
    }
     ext {
     kotlin_version = '1.8.0'
     sdk_version = '5.8.0'
     expansion_version='5.8.2'
    }
    
  2. 运行或调试项目,打开 /app/build.gradle 文件,在 android 中添加 signingConfigs 的配置。

    从 IDE 中运行或调试您的项目时,Android Studio 会自动使用由 Android SDK 工具生成的 调试证书 为您的应用签名。如果您首次在 Android Studio 中运行或调试项目时,IDE 会自动在 $HOME/.android/debug.keystore 中创建调试密钥库和证书,并设置密钥库和密钥密码。

    生成签名报告

    如果想要查看将要运行的 App 的签名信息报告,请在 Android Studio 中运行 Gradle signingReport 任务,生成签名报告

    1. 依次选择 View > Tool Windows > Gradle,来打开 Gradle 工具窗口。
    2. 依次选择 YourApp > Tasks > android > signingReport,来生成报告。

    也可以直接使用命令行执行:

    1. 使用 cd 命令导航到您的 Android 项目根目录。
    2. 在项目根目录下,运行以下命令 ./gradlew signingReport
    3. 在 Windows 上,您需要使用 gradlew.bat 脚本执行,运行以下命令 gradlew.bat signingReport

    查看签名信息

    执行 signingReport 任务以后,可以查看对应变体的签名信息,如下图所示,是 debug 变体下的签名信息。

    业务拓展 SDK 开发教程
    • 由于调试证书的应用签名不安全,不能用于应用发布和上架,可参考 Android 官方文档 调试证书 获取上架的正式证书。

    • 对于获取到的 SHA-256 加密字符串,登录涂鸦 IoT 开发平台,选择 App > App SDK > SDK 开发,单击项目,到 获取秘钥 页签 设置 SHA256,不然会提示 非法客户端

    android {
    ...
     signingConfigs {
         debug {
             storeFile file("./debug.keystore") //1.可指定调试证书目录,作为调试使用
             storePassword "android"
             keyAlias "AndroidDebugKey"
             keyPassword "android"
             v1SigningEnabled true
             v2SigningEnabled true
         }
     }
    ...
    }
    
  3. 打开 /app/build.gradle 文件,在 android 中添加 defaultConfig 的配置 applicationIdappKeyappSecret 以及 ndk 配置。

     android {
    ...
     defaultConfig {
         applicationId "com.thing.appbizsdk.sample" //使用 App SDK 的包名,"com.thing.appbizsdk.sample" 为示例
         ...
         //在项目根目录 local.properties 文件,设置属性 appKey 和 appSecret
         //appKey=your_app_key
         //appSecret=your_app_secret
         Properties properties = new Properties()
         properties.load(project.rootProject.file('local.properties').newDataInputStream())
         manifestPlaceholders = [
                 TUYA_SMART_APPKEY           : "${properties.getProperty("appKey")}",
                 TUYA_SMART_SECRET           : "${properties.getProperty("appSecret")}",
                 PACKAGE_NAME                : applicationId
         ]
         ndk {
             abiFilters "armeabi-v7a", "arm64-v8a"
         }
     }
     ...
    }
    
  4. 打开 /app/build.gradle 文件,在 android 中添加 packagingOptions 的配置。

    android {
     ...
     packagingOptions {
         pickFirst 'lib/*/libc++_shared.so' // 多个 aar 存在此 so,需要选择第一个
         pickFirst 'lib/*/liblog.so'
         pickFirst 'lib/*/libopenh264.so'
     }
     ...
    }
    
  5. 打开 /app/build.gradle 文件,在 dependencies 中添加 业务拓展 SDK智能生活 App SDK 的依赖。您可以从发版说明中查询 SDK 的最新版本,并将 sdk_versionexpansion_version 替换为具体的版本号。

    ...
    dependencies {
    //记得添加安全资源包中的 security-algorithm-1.0.0-beta.aar 到 app/libs 下
     implementation fileTree(dir: "libs", include: ["*.jar","*.aar"])
    ...
     implementation "com.thingclips.smart:thingsmart:${sdk_version}"
     implementation "com.thingclips.smart:thingsmart-expansion-sdk:${expansion_version}"
    //以下如果已有,请忽略
     implementation 'com.alibaba:fastjson:1.1.67.android'
     implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.14.9'
    ...
    }
    
  6. 初始化 SDK。您需要在 Application 的主线程中初始化 SDK,确保所有进程都能初始化。示例代码如下:

    class TuyaSmartApp:Application() {
     override fun onCreate() {
         super.onCreate()
         ThingHomeSdk.setDebugMode(BuildConfig.DEBUG)
         ThingHomeSdk.init(this)
         ThingOptimusSdk.init(this)
     }
    }
    

实现流程

关于具体的实现流程,参考以下文档:

相关信息

示例项目

涂鸦在 GitHub 上提供了一个开源的业务拓展 SDK 示例项目 BizSdkSample,供您参考。

开发文档

开发文档中详细列出了所有接口详情以及使用示例,供您参考查阅: