最近在用到系统开发的时候,接手了同事开发的一个APP的移植,在里面使用了xjava、xandroid两个库文件。
在Android studio里面调用这两个库是在build.gradle里面直接配置,很简单,AS会根据配置自动去相应的下载地址,将依赖的库下载
dependencies {
compile 'io.reactivex:rxjava:1.2.6'
compile 'io.reactivex:rxandroid:1.2.1'
}
当时因为赖得去官网下载,就直接将AS下载到本地的两个jar文件直接提取出来,然后直接放在源码目录下对应APP的lib目录,然后通过Android.mk去编译,结果蛋疼的事情发生了,一直报错,找不到库文件。 纠结了很久,不断的测试查找原因,最后把rxandroid-1.2.1.jar去掉后,编译的报错没有了,后来怀疑是jar包损坏了,我就直接去官网下载jar包,结果发现官网并没有rxandroid-1.2.1.jar的下载,只有rxandroid-1.2.1.aar这个文件的下载。到这里笔者瞬间明白了,他丫的,Android studio下载的那个引用jar不能直接放源码里面编译,只能用aar文件的。后来又去查询了一下什么是aar.
何为aar?大家都知道jar文件把,如果你有一个Android Library项目,可以很容易的导出jar文件,然后在其他项目中很方便的引用,aar和jar类似,区别就是一个Android Library项目导出的jar文件不能包含资源文件,比如一些drawable文件、xml资源文件之类的,所以这就有很大的限制,在gradle之前我们要引用带资源文件的Android Library必须要把整个library导入进来进行引用,但是有了gradle之后,Android Library项目可以直接导出成aar,然后其他项目像引用jar的方式直接方便的引用。
下面附上源码的Android.mk文件的aar部分,然后编译通过,搞定收工
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := commons rxjava android-support-v7-appcompat android-support-v4
LOCAL_STATIC_JAVA_AAR_LIBRARIES := rxandroid
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_RESOURCE_DIR += \
$(LOCAL_PATH)/res \
$(LOCAL_PATH)/../../../prebuilts/sdk/current/support/v7/appcompat/resLOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages android.support.v7.appcompat \
--extra-packages rx.android \
--extra-packages rx.android.plugins \
--extra-packages rx.android.schedulers \
#LOCAL_SDK_VERSION := currentLOCAL_PACKAGE_NAME := YOUR_APP_NAME
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := commons:libs/commons-net-3.3.jar \
rxjava:libs/rxj