kingfeng's Notes

“SDK打包致其依赖的第三方jar包无法识别” 问题的解决

问题

昨天同事问了一个问题:对base-sdk打成jar包,sample引用的时候一直提示开发的SDK第三方依赖库的时候无法识别的问题,一直报NClassFoundError错误。
导致转测试的时候把base-sdk 作为一个module扔给测试去测,这哪能行。
于是帮忙查找定位了原因,也记录一下。

以前用过Ant进行打包, 首先想到的就是用ant工具把多个jar打成一个jar(包括基础的以及所有第三方依赖的),ant工具的配置就不说了。

先对除第三方库之外的内容进行打包:

1
2
3
4
5
task packagingJar(type: Jar) {
from zipTree(zipFile)
from fileTree(dir: 'src/main',includes: ['res/**']) // 对src/main 目录下的内容进行打包
// from fileTree(dir: 'libs', includes: [ '**/*.jar']) // '**/*.so',
}

打成一个 xxxx-base.jar

下面我们通过ant进行把这个xxx-base.jar 和这个base-sdk依赖的 第三方jar打成最终的jar包。

ant打包

在build里面的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<project
name="test"
basedir="d:\ant_demo"
default="makeSuperJar" >

<target
name="makeSuperJar"
description="description" >

<!--合并后的jar-->
<jar destfile="xxx-base-v1.0.jar" >
<zipfileset src="xxx-base.jar"/>
<zipfileset src="BASE64Encoder.jar" />
<zipfileset src="bdr_V3_20180320_9066860.jar" />
<zipfileset src="cos-xxx-sdk-5.4.6.jar" />
<zipfileset src="okio-1.13.0.jar" />
<zipfileset src="okhttp-3.8.1.jar" />
<zipfileset src="xxx-foundation.1.3.2.jar" />
</jar>
</target>

</project>

执行ant -buildfile build.xml 后, 生成xxx-base-v1.0.1.jar,

其他

拿到xxx-base-v1.0.jar 之后,sample里面试了一下,不再出现Class找不到的问题。
另外,如果sdk的 build.gradle中的dependencies 有gradle配置的依赖,我们构建完成之后,可以到本地目录去找对应的jar包,
windows下一般在Users\xxx\.gradle\caches\modules-2\files-2.1\ 目录下。

还有3个小问题待解决:

  1. base-sdk中引用的so库也找不到;
  2. base-sdk中引用的第三方的库中申请的APP_ID以及APP_SECRET,配置在manifest.xml的 节点下,sample中调用xxx-base-v1.0.jar测试的时候,会提示两个值没配置好;
  3. base-sdk中依赖的jar跟我们的测试项目中的库冲突(duplicate entry)的问题;

针对1:可以把base-sdk中使用的so库放置到使用者使用时进行配置阶段;
针对2:可以在代码中初始化的时候动态设置APP_ID以及APP_SECRET,不配置在manifest里了。
针对3:我们可以按照下面类似的方法来搞;当然,通过在configurations{} 里面进行配置也可以。

1
2
3
4
compile(project(':base-http')) {
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
// without or without this one
}

搞定。

您的支持将鼓励我继续创作