准备依赖环境(必读)
由于历史原因,专有钉钉在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等),避免和专有钉钉冲突导致编译冲突。
<application>
<!-- 建议application节点不要添加任何参数-->
<!-- 如果依赖了某个sdk的miniSDKVersion和专有钉钉不一致,请配置overrideLibrary属性-->
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="29"
tools:overrideLibrary="com.airbnb.lottie"/>
<meta-data
android:name="mysdk_appkey"
android:value="12345" />
<activity
android:name="xxx.MyActivity"
android:launchMode="singleTop"
android:screenOrientation="portrait"/>
</application>
1.5 FileProvider
假如使用了FileProvider,请自定义class 并继承FileProvider,避免直接在AndroidManifest文件中配置指定FileProvider,会导致互相冲突,同时对应的xml文件建议附带sdk tag的命名,避免冲突导致异常。
// 建议改为如下形式
<provider
// 此处Provider命名请注意,请使用自定义Provider类
android:name="com.xxx.mydemo.MyFileProvider"
android:authorities="com.xxx.xxx.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/mydemo_provider_paths" />
//此处android:resource的文件名命名请注意,避免重复!!!
</provider>
2. 关于SO
请避免和专有钉钉的SO冲突,可和专有钉开发者沟通获取对应的安装包,解压后在lib目录下核对是否有同自己的SDK冲突的SO,如果有,打包请排除掉。
(SO必须提供32位版本,即armeabi;未来会支持64位,建议提供;x86版本不做要求)
3. 关于外部依赖三方SDK冲突
注意:
1)请务必不要将开源库直接通过源码的方式打包到SDK中。
2)对于开源的库请使用MVN仓库的方式远程依赖,避免类冲突。
3)请根据下文优先使用专有钉钉依赖的版本,对于版本号冲突(比如必须依赖高版本)可联系专有钉钉技术人员确认方案。
专有钉钉中会存在比如okhttp等sdk,为了避免版本号冲突请使用专有钉钉版本, 常见库版本如下,如果存在版本冲突,请fix,打包时排除冲突库:
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72")
implementation("org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.3.72")
implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.72")
implementation("org.jetbrains.kotlin:kotlin-stdlib-common:1.3.72")
implementation("com.alibaba:fastjson:1.1.71.android")
implementation("com.alibaba:arouter-api:1.5.0")
implementation("com.alibaba:arouter-annotation:1.0.6")
implementation("io.reactivex.rxjava2:rxjava:2.2.11")
implementation("org.jsoup:jsoup:1.9.2")
implementation("org.ccil.cowan.tagsoup:tagsoup:1.2.1")
implementation("com.squareup.okhttp3:okhttp:4.8.0")
implementation("com.atlassian.commonmark:commonmark:0.8.0")
implementation("nl.dionsegijn:konfetti:1.1.0")
implementation("com.google.android:flexbox:1.0.0")
implementation("com.squareup.okio:okio:2.7.0")
implementation("com.google.code.gson:gson:2.8.5")
implementation("com.readystatesoftware.systembartint:systembartint:1.0.4")
implementation("com.airbnb.android:lottie:2.7.0")
implementation("com.nineoldandroids:library:2.4.0")
implementation("com.github.bumptech.glide:glide:4.2.0")
implementation("com.belerweb:pinyin4j:2.5.1")
implementation("com.yqritc:recyclerview-flexibledivider:1.2.9")
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。