由于客户网络环境无法访问我提供的广域网的maven仓库地址,需要我提供本地jar包的方式,因此来看看我们需要怎么弄。

一、导出jar

1.首先需要创建一个app工程并且new 一个moudle,既然想封装成一个库那么肯定要在moudle里进行编代码吧,这里就不做过多的陈述,我直接拿项目作为案例。这里你要保证app依赖moudle模块,并且能正常运行。

android studio 导出所有res android studio导出_jar包


2.在library下的build.gradle文件添加如下代码

//打jar包
task makeJar(type: Copy) {
    //这行表示要打包的文件的路径,根据下面的内容,其实是该路径下的classes.jar
    //这里注意下,网上很多人都说在intermediates/bundles目录下,但是比较新版本的AS该目录下intermediates/packaged-classes替换intermediates/bundles了,本人AS4.0
    from('build/intermediates/packaged-classes/release/')
    //这行表示打包完毕后包的生成路径,也就是生成的包存在哪
    into('build/libs/')  
    //看到这行,如果你对分包有了解的话,你就可以看出来这行它只是将一些类打包了
    include('classes.jar')  
    //重命名为mySdk.jar
    rename ('classes.jar', 'mySdk.jar')
}
makeJar.dependsOn(clearJar, build)
//在终端执行生成JAR包
// gradlew makeJar

3.生成的jar,如图所示

android studio 导出所有res android studio导出_jar_02


4.使用jar包

新创建一个app工程,将新打好的mySdk.jar文件放入到libs目录下,点击运行

android studio 导出所有res android studio导出_so文件_03


5.app崩溃,查看下日志提示缺失so文件,这个libface_api.so是moudle中lib目录下的so文件,这说明mySdk.jar并不会存在so文件,需要额外自己放入到项目中去,放进去后成功运行。

android studio 导出所有res android studio导出_jar_04


android studio 导出所有res android studio导出_so文件_05


6.能运行不代表没有问题,仔细查看日志,发现mySdk.jar中的一个Service并没有成功开启。原因是因为mySdk.jar文件里不存在清单文件,需要宿主app自己去清单文件里注册,注册成功后才是真正大功告成。

android studio 导出所有res android studio导出_android studio_06

二、导出aar

相比第一种方式打jar包来讲,第二种方式要简单很多,点击下assembleRelease命令即可,会在build/outputs/aar目录下生成aar的release文件。

android studio 导出所有res android studio导出_jar_07


直接在新创建的app项目中使用即可,引入aar文件记得要在app build,gradle文件里加如下代码

repositories {
   flatDir {
     dirs 'libs'
   }
}

android studio 导出所有res android studio导出_android studio_08


注意事项

如果sdk里存在第三方依赖库,如果不做处理,默认无论是jar包还是aar文件都不会存在第三方依赖库的代码,所以需要宿主app自己去依赖相关sdk。其实也可以将moudle所依赖的jar包打入到新的jar包里,这里不做讨论。

三、分别解压jar和aar

将两个文件后缀改成zip,然后解压,发现jar里只有class文件,并且不包含其他第三方jar的class文件,而aar文件包含了jar包,以及清单文件,资源文件,so文件等。

jar文件解压后

android studio 导出所有res android studio导出_jar_09


aar文件解压后

android studio 导出所有res android studio导出_java_10

四、总结

1.jar包里不存在清单文件,资源文件,so文件,只包含了class文件,而aar文件几乎包含了上述所有。
2.如果sdk里存在第三方依赖库,如果不做处理,默认无论是jar包还是aar文件都不会存在第三方依赖库的代码。

五、参考文章

1.https://www.jianshu.com/p/0a2572a63ed5
2.https://www.jianshu.com/p/1589be7962cd