准备依赖环境(必读)

由于历史原因,专有钉钉在gradle、java、support库等有固定的版本要求,开发者提供的集成应用(Bundle)可能会存在相关的版本冲突,为了减少正式集成时出现的各种编译问题,请先阅读本文。

专有钉钉平台当前也正在努力适配Android新特性,比如AndroidX,建议自身代码能够备份一份AndroidX的版本,用于未来的升级。

1. SDK依赖版本限制说明

为了避免提供的SDK出现编译不过等问题,减少双方无效沟通时间,请关注以下几点:

1.1 Android SDK版本

android:minSdkVersion=”21”:当配置>21时,将导致编译无法通过或低版本运行crash,请关注
android:targetSdkVersion=”29”:请适配最新的target 29
android:compileSdkVersion=29

1.2 Gradle版本号

com.android.tools.build:gradle:3.5.3

1.3 Support包

com.android.support:support-compat:28.0.0
com.android.support:appcompat-v7:28.0.0
com.android.support:design:28.0.0
避免使用androidx或v13(专有钉钉未来会升级AndroidX,建议代码保留相关分支)。

1.4 AndroidManifest.xml文件

该文件中的 节点请尽可能的避免配置allowBackup、tool:replace等属性,该节点属性应尽可能为空,只包含子节点(Activity、Service等),避免和专有钉钉冲突导致编译冲突。

  1. <application>
  2. <!-- 建议application节点不要添加任何参数-->
  3. <!-- 如果依赖了某个sdk的miniSDKVersion和专有钉钉不一致,请配置overrideLibrary属性-->
  4. <uses-sdk
  5. android:minSdkVersion="21"
  6. android:targetSdkVersion="29"
  7. tools:overrideLibrary="com.airbnb.lottie"/>
  8. <meta-data
  9. android:name="mysdk_appkey"
  10. android:value="12345" />
  11. <activity
  12. android:name="xxx.MyActivity"
  13. android:launchMode="singleTop"
  14. android:screenOrientation="portrait"/>
  15. </application>

1.5 FileProvider

假如使用了FileProvider,请自定义class 并继承FileProvider,避免直接在AndroidManifest文件中配置指定FileProvider,会导致互相冲突,同时对应的xml文件建议附带sdk tag的命名,避免冲突导致异常。

  1. // 建议改为如下形式
  2. <provider
  3. // 此处Provider命名请注意,请使用自定义Provider
  4. android:name="com.xxx.mydemo.MyFileProvider"
  5. android:authorities="com.xxx.xxx.fileprovider"
  6. android:exported="false"
  7. android:grantUriPermissions="true">
  8. <meta-data
  9. android:name="android.support.FILE_PROVIDER_PATHS"
  10. android:resource="@xml/mydemo_provider_paths" />
  11. //此处android:resource的文件名命名请注意,避免重复!!!
  12. </provider>

2. 关于SO

请避免和专有钉钉的SO冲突,可和专有钉开发者沟通获取对应的安装包,解压后在lib目录下核对是否有同自己的SDK冲突的SO,如果有,打包请排除掉。
(SO必须提供32位版本,即armeabi;未来会支持64位,建议提供;x86版本不做要求)

3. 关于外部依赖三方SDK冲突

注意:
1)请务必不要将开源库直接通过源码的方式打包到SDK中。
2)对于开源的库请使用MVN仓库的方式远程依赖,避免类冲突。
3)请根据下文优先使用专有钉钉依赖的版本,对于版本号冲突(比如必须依赖高版本)可联系专有钉钉技术人员确认方案。
专有钉钉中会存在比如okhttp等sdk,为了避免版本号冲突请使用专有钉钉版本, 常见库版本如下,如果存在版本冲突,请fix,打包时排除冲突库:

  1. implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72")
  2. implementation("org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.72")
  3. implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.72")
  4. implementation("org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72")
  5. implementation("com.alibaba:fastjson:1.1.71.android")
  6. implementation("com.alibaba:arouter-api:1.5.0")
  7. implementation("com.alibaba:arouter-annotation:1.0.6")
  8. implementation("io.reactivex.rxjava2:rxjava:2.2.11")
  9. implementation("org.jsoup:jsoup:1.9.2")
  10. implementation("org.ccil.cowan.tagsoup:tagsoup:1.2.1")
  11. implementation("com.squareup.okhttp3:okhttp:4.8.0")
  12. implementation("com.atlassian.commonmark:commonmark:0.8.0")
  13. implementation("nl.dionsegijn:konfetti:1.1.0")
  14. implementation("com.google.android:flexbox:1.0.0")
  15. implementation("com.squareup.okio:okio:2.7.0")
  16. implementation("com.google.code.gson:gson:2.8.5")
  17. implementation("com.readystatesoftware.systembartint:systembartint:1.0.4")
  18. implementation("com.airbnb.android:lottie:2.7.0")
  19. implementation("com.nineoldandroids:library:2.4.0")
  20. implementation("com.github.bumptech.glide:glide:4.2.0")
  21. implementation("com.belerweb:pinyin4j:2.5.1")
  22. implementation("com.yqritc:recyclerview-flexibledivider:1.2.9")
  23. implementation("in.srain.cube:ultra-ptr:1.0.11")

Step 2:确认SDK的集成方式

为了完成双方的解耦,需要将SDK按照专有钉钉的规范做一次封装。
场景1:当你的SDK仅用于提供给专有钉钉时,建议你直接按照规范对原有功能封装,并打包生成一个AAR用于集成。
场景2:当你的SDK可能面向不同的平台时

  • 方式1:建议你按照规范对原有AAR封装,集成时可提供:专有钉钉适配层SDK(.AAR) + 功能SDK(.AAR)。
  • 方式2:可以放在一个工程中封装并打包生成一个最终的AAR。

备注:

  • 专有钉钉支持一次提供多个AAR的方式集成,请根据自身需要选择提供方式。
  • 专有钉钉支持.jar和.aar两种格式的SDK。