组件导入

更新时间: 2024/09/27 13:16:43

网易云信即时通讯 IM Android UIKit (V10) 采用 Gradle 进行构建,您可以采用添加远端仓库依赖或者本地代码依赖的方式,将所需组件快速导入到您的项目中。

  • 添加远端仓库依赖:适用于采用 IM UIKit 默认界面的集成。
  • 添加本地代码依赖:适用于通过 IM UIKit 进行界面自定义的集成。

开发环境要求

导入组件前,请确保您已准备如下开发环境及工具:

  • Android Studio Bumblebee
  • Java 11
  • Gradle 7.4
  • Android Gradle Plugin 7.3.1

实现流程

方式 1:添加远端仓库依赖

本节以会话列表组件为例,介绍如何采用添加远端依赖的方式,将该组件导入到您的项目中,构建项目。

  1. app 目录下的 build.gradle 中添加远端依赖。

    Groovydependencies {
        //通讯录组件
        api 'com.netease.yunxin.kit.contact:contactkit-ui:${LATEST_VERSION}'
        //会话列表组件
        api 'com.netease.yunxin.kit.conversation:conversationkit-ui:${LATEST_VERSION}'
        //群组设置组件
        api 'com.netease.yunxin.kit.team:teamkit-ui:${LATEST_VERSION}'
        //会话消息组件(聊天界面,包括单聊和群聊)
        api 'com.netease.yunxin.kit.chat:chatkit-ui:${LATEST_VERSION}'
        //位置消息模块
        api 'com.netease.yunxin.kit.locationkit:locationkit:${LATEST_VERSION}'
    
        //如果使用呼叫组件,添加如下呼叫组件依赖,包括呼叫组件包和 IM 信令包
        api 'com.netease.yunxin.kit.call:call-ui:2.2.0'
        api 'com.netease.nimlib:avsignalling:${LATEST_VERSION}' //信令组件
    }
    
    

    如果是 Kotlin 脚本配置,在应用根目录下,打开 build.gradle.kts,声明网易云信 IM UIKit 代码仓库。

    Groovydependencies {
        api("com.netease.yunxin.kit.contact:contactkit-ui:${LATEST_VERSION}")
        api("com.netease.yunxin.kit.conversation:conversationkit-ui:${LATEST_VERSION}")
        api("com.netease.yunxin.kit.team:teamkit-ui:${LATEST_VERSION}")
        api("com.netease.yunxin.kit.chat:chatkit-ui:${LATEST_VERSION}")
        api("com.netease.yunxin.kit.locationkit:locationkit:${LATEST_VERSION}")
        //如果使用呼叫组件,添加如下呼叫组件依赖,包括呼叫组件包和 IM 信令包
        api("com.netease.yunxin.kit.call:call-ui:2.2.0")
        api("com.netease.nimlib:avsignalling:${LATEST_VERSION}") //信令组件
    }
    

    上述示例代码中的 ${LATEST_VERSION} 表示版本号,仅用于示例。

  2. 在项目根目录下,打开 gradle.propertes, 修改资源依赖配置。

    Javaandroid.nonTransitiveRClass=false
    
    • 如果导入之后,出现资源找不到的问题,请修改此处配置。
    • IM UIKit 模块化设计,所以存在资源依赖,以减少包体积。

方式 2:添加本地代码依赖

本节介绍如何通过添加本地代码依赖的方式,将所需的 IM UIKit 组件导入到您的项目。

  1. 前往 网易云信开源代码仓库,下载 nim-uikit-android 源码组件到本地。

  2. 在 Android Studio 中打开工程后,依次单击 File > New > Import Module,选择您需要的组件导入,或者将组件直接复制到您的项目中。

    开源工程中包括的源码组件如下:

    组件 说明
    chatkit-ui 会话消息组件(聊天界面,包括单聊和群聊)
    conversationkit-ui 会话列表组件
    contactkit-ui 通讯录组件
    teamkit-ui 群组设置组件
    locationkit 地图消息组件
  3. 在项目根目录下,打开 gradle.propertes, 修改属性资源依赖配置。

    Javaandroid.nonTransitiveRClass=false
    
    • 如果导入之后,出现资源找不到的问题,请修改此处配置。
    • IM UIKit 模块化设计,所以存在公共资源依赖,以减少包体积。
  4. 在 Android Studio 项目根目录下,打开 settings.gradle,添加依赖组件。

    如果第 2 步操作采用导入方式,会自动添加依赖组件,此时您只需要检查即可。

    Javainclude ':app'
    //添加您需要的组件即可
    include ':contactkit-ui'
    include ':chatkit-ui'
    

    如果是 Kotlin 脚本配置,在项目根目录下,打开 settings.gradle.kts,进行添加。

    kotlininclude(":app")
    include(":conversationkit-ui")
    include(":teamkit-ui")
    include(":contactkit-ui")
    include(":chatkit-ui")
    include(":locationkit")
    
  5. 在 Android Studio 项目应用目录下,打开 app/build.gradle,添加依赖组件。

    Java//添加您需要的组件即可
    api(project(":contactkit-ui"))
    api(project(":conversationkit-ui"))
    api(project(":teamkit-ui"))
    api(project(":chatkit-ui"))
    api(project(":locationkit"))
    
  6. (可选)源码依赖处理冗余文件,减少资源引入。

    网易云信 IM UIKit 提供两套风格的 UI 组件库,您可任意选择一种使用。确定后,可移除另一套 UI 组件相关文件,从而减小包体积。可删除的文件如下:

    • 代码文件:在各个模块中,根目录下有 normal 和 fun 文件夹,分别用于存放所有与基础版 UI 相关的文件和所有与通用版 UI 相关的文件。可直接删除您不需要的 UI 版本目录。

      //以 chatkit.ui 模块为例,目录如下
      com.netease.yunxin.kit.chatkit.ui
      -normal 协同版 UI
      -fun 通用版 UI
      
    • 资源文件:在各个模块的 main 目录中,分别有 res-normalres-fun 文件夹。可直接删除您不需要的 UI 版本目录。

      同时在 build.gradle 中移除对应的编译资源目录。

      Groovyandroid {
      buildFeatures {
          viewBinding = true
      }
      
      //如果使用通用版本则,删除"src/main/res-normal"。如果使用基础版则移除"src/main/res-fun"
      sourceSets["main"].res.srcDirs("src/main/res","src/main/res-fun","src/main/res-normal")
      }
      

    对应 UI 版本的路由注册代码需要单独移除。(以 chatkit-ui 为例,contactkit-uiconversationkit-uiteamkit-ui 同理。)

    chatkit-ui 包的 ChatUIService 中移除您不需要的 UI 版本路由注册代码。

    单击查看示例代码。
    Javapublic ChatService create(@NonNull Context context) {
        // 基础版路由,如果使用通用版本则删除该部分。
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_P2P_PAGE, ChatP2PActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_TEAM_PAGE, ChatTeamActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_SEARCH_PAGE, ChatSearchActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_LOCATION_PAGE, LocationPageActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_PIN_PAGE, ChatPinActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_SETTING_PAGE, ChatSettingActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_ACK_PAGE, ChatReaderActivity.class);
        //基础版路由结束
    
        // 通用版路由,如果使用基础版本则删除该部分。
        XKitRouter.registerRouter(RouterConstant.PATH_FUN_CHAT_P2P_PAGE, FunChatP2PActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_FUN_CHAT_TEAM_PAGE, FunChatTeamActivity.class);
        XKitRouter.registerRouter(
            RouterConstant.PATH_FUN_CHAT_SEARCH_PAGE, FunChatSearchActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_CHAT_LOCATION_PAGE, LocationPageActivity.class);
        XKitRouter.registerRouter(RouterConstant.PATH_FUN_CHAT_PIN_PAGE, FunChatPinActivity.class);
        XKitRouter.registerRouter(
            RouterConstant.PATH_FUN_CHAT_READER_PAGE, FunChatReaderActivity.class);
        XKitRouter.registerRouter(
            RouterConstant.PATH_FUN_CHAT_SETTING_PAGE, FunChatSettingActivity.class);
        //通用版路由结束
    
        //以下内容不可删除
        chatKitInit(context);
        registerSendTeamTips();
        registerAitNotifyTrigger();
        registerSendText();
        IMKitClient.registerInitService(new ChatUIInitService());
        return this;
    }
    

防止代码混淆

代码混淆是指使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度,保障 Android 程序源码的安全性。

为了避免因上述的重命名而导致调用 IM UIKit 异常,请在 `proguard-rules.pro`` 文件中加入以下代码,将 NIM SDK 和 IM UIKit 的相关类加入不混淆名单。

Java## NIM SDK 防混淆
-dontwarn com.netease.nim.**
-keep class com.netease.nim.** {*;}

-dontwarn com.netease.nimlib.**
-keep class com.netease.nimlib.** {*;}

-dontwarn com.netease.share.**
-keep class com.netease.share.** {*;}

-dontwarn com.netease.mobsec.**
-keep class com.netease.mobsec.** {*;}

## 如果您使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}

## IM UIKit 防混淆
-dontwarn com.netease.yunxin.kit.**
-keep class com.netease.yunxin.kit.** {*;}
-keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions
-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;}

## 呼叫组件防混淆
-keep class com.netease.lava.** {*;}
-keep class com.netease.yunxin.** {*;}

-dontwarn com.netease.yunxin.kit.**
-keep class com.netease.yunxin.kit.** {*;}
-keep public class * extends com.netease.yunxin.kit.corekit.XKitInitOptions
-keep class * implements com.netease.yunxin.kit.corekit.XKitService {*;}

## glide 4
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
   **[] $VALUES;
    public *;
}

## okhttp
-dontwarn okhttp3.**
-keep class okhttp3.**{*;}

## 如果您使用全文检索插件,需要加入
-dontwarn org.apache.lucene.**
-keep class org.apache.lucene.** {*;}

## 如果您开启数据库功能,需要加入
-keep class net.sqlcipher.** {*;}

下一步

导入组件后,您需要进行 初始化

问题排查

集成过程中的常见问题的排查说明,请参考 IM UIKit 常见问题排查

此文档是否对你有帮助?
有帮助
去反馈
  • 开发环境要求
  • 实现流程
  • 方式 1:添加远端仓库依赖
  • 方式 2:添加本地代码依赖
  • 防止代码混淆
  • 下一步
  • 问题排查