现在最新AndroidStudio已经把jcenter标为过时的仓库了,因为jcenter的营运公司发公告说要停止jcenter的使用了,在2022年初,后来又说改成可永久获取,即只能获取,不能上传新的。虽说是这样吧,但是看着是被Google标志过时了,我就不想用它啊,有些我们使用的第三方开源库的作者比较懒,没有把项目上传到其它仓库,这样的话就只能用jcenter了,但是我又不想用jcenter啊,那就可以把开源库的aar、source.jar、javadoc.jar获取下来,直接放到项目的libs目录。操作步骤如下:
查看依赖的路径。在项目视图下找到需要的aar,然后右击并选择“Library Properties"
如上图,点击“Library Properties”后就可以看到这个aar库的属性了,如下:
可以看到,这个aar是关联了一个source.jar和一个annotations.zip的,有些还会关联javadoc.jar,如下:
从库属性对话框可以看到aar关联的源码或doc的路径,其实aar的路径也差不多在那个位置,比如上图的agentweb:4.1.4@aar这个库,我们看它关联的源码和doc的路径,都是在4.1.4(aar的版本号)这个目录下的,则aar也会在这个目录,我们把aar、source.jar、javadoc.jar都找出来,复制到libs目录下,如下:
配置gradle
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar", "*.aar"])
。。。
}
配置好之后记得同步一下Gradle,然后就可以在项目的“外部库”中看到依赖的aar了,如下:
关联source.jar和javadoc.jar
右击依赖的aar,然后选择“Library Properties”,效果如下:
如上图,可以看到,默认是不会自动帮我们关联source.jar和javadoc.jar的。点击最左边的加号来添加,如下:
在添加javadoc的时候,会弹一个框出来让你选择它是什么类型的,如下:
提示是说不知道这个javadoc.jar是什么文件各类,所以弹框让我们选择类型,就选JavaDocs即可,而在添加source.jar的时候Android Studio是自动识别类型的,就不会弹出这个对话框。
添加了source.jar和javadoc.jar之后,在敲代码时就可以看到对应的类的文档,或者看类的源代码。
需要注意的是,一个库项目中不能使用aar,因为在把这个库项目再打包为aar时就会报错,提示错误如下:
Execution failed for task ':AppList:bundleReleaseAar'.
> Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :AppList project caused this error: E:\11_Workspace\01_AndroidStudio\AppListLib\AppList\libs\agentweb-4.1.4.aar
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
如果要在库项目中依赖第三方库,而且是jcenter中的依赖库,但又不想使用jcenter了,但又不能使用本地aar,怎么呢?可以去github上把该开源项目的源码拿下来,直接放到自己的库项目中,这样就没有问题了。 还有一个更简单的,如果确定这个开源项目没有使用到Android的资源文件,只是一个纯class包的话,可以使用source.jar,把这个放到libs目录即可,后来我又发现,source.jar中的源码有些时候并不是完整的,也就是说我们在使用aar的时候,点击某些类发现看不到源码,而有些类有源码,这说明aar对应的source.jar是不完整的,所以,为了安全起见,我们直接解压aar,里面有一个classes.jar,这里面对应的就是编译好的*.class文件了。
这样,我们就有了classes.jar和sources.jar,classes.jar需要我们手动重命令一下,加上开源项目的名称和版本号,然后和sources.jar一起放到libs目录中,如下:
然后在gradle中添加依赖,注意,不能使用下面这种依赖:
implementation fileTree(dir: "libs", include: ["*.jar"])
这样的话我不知道它是否会把source.jar也编译了,会不会和classes.jar造成冲突,我没有去实验,我使用了下面的依赖方式:
implementation fileTree(dir: "libs", include: ["commons-base-0.10.8-classes.jar", "anko-sdk27-0.10.8-classes.jar"])
这样我们就单独指定了只依赖两个classes.jar,同步gradle之后,classes.jar并不会出现在外部库列表,而是直接在libs目录中可以展开,当我们点击查看一个类的源码时,也是直接跳到libs目录的,如下:
我们随便打开一个class文件,这时在窗口右上方就有“选择源(S)…”,我们点击它来关联源代码,如下:
设置好source.jar之后,关闭这个class再次打开的时候就能看到源码了!
OK,这次我们使用的是classes.jar,这用在库项目中也是没问题的!当我们在别的项目引用这个库项目的时候,展开aar会看到有三个classes.jar,如下:
有一个问题,就是在这个项目中看class时是没有源码的,需要把源码复制到这个项目中再关联一次源码才行。
后来我想,能不能把classes.jar和sources.jar合并成一个jar,即带源码的classes.jar,但是发现简单的把classes.jar和sources.jar解压后合并到一起,再打包成一个classes.jar,发现并没有实现源代码关联,哎,算了,懒得去搞了!