aar与source.jar,aar文件jar文件区别,以及Android.mk如何引用aar文件和jar文件
2017-11-22 19:35
696 查看
1,aar与source.jar的区别 原文地址:http://blog.csdn.net/csdn_yudong/article/details/48090535
关于.jar与sources.jar到底是什么,区别是什么,我为大家讲解一下。
首先,当我们在下载jar包与引入jar包的时候可能会发现,存在jar文件与相应的cources jar文件。如下图所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/378d5628ff69e9e0b703f103c89175e2)
这个时候,到底该下载哪一个,或者我们需要的是哪一个。是junit-4.7.jar还是junit-4.7-sources.jar?
明确的告诉你,我们需要的是junit-4.7.jar,也就是我们需要在项目中引入的是junit-4.7.jar。
------------------------------------------------------------------------------------------------------------
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
那这个source.jar有什么用呢?
我们知道,我们在项目中引入外部jar文件,肯定是要用到这个jar文件里面的类库才引入的,虽然我们只需要能引入进来,完成我们需要的功能即可,但有时候,我们还是想看看功能具体的实现,看看别人的源码是怎么写的。这个时候我们打开jar包。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/e6205d0ff1c2013f704c6d5efa8d957b)
比如,打开mysql-connector-java-5.1.5-bin.jar。
打开com.mysql.jdbc这个包。
发现里面都是编译后的class文件。
这种文件是看不到源码的(当然,你可以选择反编译)
打开第一个class文件,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201911/04/c032086a270718ad474cc466266e1646)
如果,我们想看源码怎么办,这个时候就需要点击Attach Source.关联源码。
源码在哪里,没错,就在对应的source.jar里面。
Attach Source完了以后,就可以直接看jar包中的类的源码了,是不是整个世界都明亮了。
Attach Source的过程很简单,相信大家可以自己完成。
-----------------------------------------------------------------------
原文地址:https://neveryu.github.io/guestbook/
Github: https://github.com/Neveryu
新浪微博:http://weibo.com/Neveryu
2,jar和aar区别:
*.jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
*.aar:包含所有资源,class以及res资源文件全部包含
如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件。
3,这才是重点
最近遇到一个问题,在更改Android的系统应用时,要引用一个aar文件。之前引用的主要是jar包,而aar文件包含Android的资源文件,如:布局、样式、图片等,如果按照源码中jar的引用方式会遇到编译不过的问题,提示找不到相关的资源文件。
国内的相关论坛也有同行遇到相同的问题,不过相关的解决方案并没有,不过在stackoverflow有相关的解决方案,网址如下:
aar-support-in-android-mk: http://stackoverflow.com/questions/31205856/aar-support-in-android-mk
2
3
4
5
6
7
8
9
10
11
其中,
2
3
4
5
6
7
这里主要是LOCAL_STATIC_JAVA_AAR_LIBRARIES,剩下的和jar包大同小异,注意在manifest文件里minSdkVersion要满足aar文件的要求。
搜索Android源码,也可以发现:
#LOCAL_STATIC_JAVA_AAR_LIBRARIES are special LOCAL_STATIC_JAVA_LIBRARIES
LOCAL_STATIC_JAVA_LIBRARIES := (strip(LOCAL_STATIC_JAVA_LIBRARIES)
$(LOCAL_STATIC_JAVA_AAR_LIBRARIES))
这一步完成后,代码可以顺利编译过了,不过在运行apk时如果使用到aar文件里面的资源可能会crash,所以还需要加上以下语句:
2
3
关于LOCAL_AAPT_FLAGS,可以参考以下网址,在开发Android系统应用时可能会遇到和这个相关的一些小坑,比如修改完相关代码后,push进机器却不起作用。
Android AAPT and Overlay: http://blog.csdn.net/sunny09290/article/details/20943261
这里把相关aar文件的资源打包到我们的apk里,apk即可正常运行。
另外一点是在make文件中可以指定具体的manifest文件:
Android AAPT and Overlay: http://blog.csdn.net/sunny09290/article/details/20943261 aar-support-in-android-mk: http://stackoverflow.com/questions/31205856/aar-support-in-android-mk Android4.4 Makefile属性:LOCAL_AAPT_FLAGS的使用: http://blog.csdn.net/visionliao/article/details/43233743 4,自己总结
1,LOCAL_STATIC_JAVA_LIBRARIES := amap map3d core butterknife eventbus glide
这一行的,都是第三方的没有资源的jar然后在下面LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES写一下就好了,对应的是 别名:路径
2,
内容贴出来:
由于新版本Eclips中ADT插件的升级,Google为了兼容旧版本的Activity Action样式,特意导入了android-support-v7-appcompat.jar库。
更新ADT版本后,使用新版Eclips所建立的Android工程,默认会改为继承ActionBarActivity,而不是以前旧的Activity类。
这样导致的直接结果是:使用新版本Eclips所生成的源码放入Android源码中,使用mmm编译通常都会报错。
特意花了些时间研究了一下。下面针对大家常见的三种情况,分别给出解决办法:
1、准备从头开始编写新APK?
这种情况下最简单的解决办法是:新建apk的时候,将sdk最低版本选择为4.0以上,这样会默认生成继承Activity类的apk,使用该方法写出的apk,放入源码中就能和旧时一样,修改Android.mk后直接使用mmm去成功编译apk src了。
2、直接将Eclips中编译好的apk文件放入源码,计划使用mmm打sign?
如果别人虽然用了新的Eclips编写code,但提供的不是源码,而是pre-build apk文件,那么对这种apk的源码编译操作方法也同旧时一样处理即可(mmm搭配Android.mk)。
3、最麻烦的就是别人提供了写好的apk src,并且这种src刚好也使用了新的v7库,那我们应该怎么办呢?
针对这种情况。首先,需要对常见的Android.mk添加res文件和lib文件的支持(尤其是res文件的支持,一般新版apk 编译不过的根本原因是由于 Theme中所定义的资源无法找到)
(修改好的Android.mk源文件如下)
##################################################
LOCAL_PATH := $(call my-dir)
include
$(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := \ //增加lib的支持
android-support-v4
\ android-support-v7-appcompat \
android-support-v7-gridlayout \
android-support-v7-mediarouterLOCAL_RESOURCE_DIR = \
$(LOCAL_PATH)/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/gridlayout/res \
frameworks/support/v7/mediarouter/res //增加res的支持
(若不填写,则默认会自动查找工程路径下的res目录,所以很多v7的资源包会找不到。(补充下,假设仅仅只添加了v7的lib而未添加res资源文件,则由于res资源文件本身并不包含在lib里面的,故mmm编译时一样会报找不到res的相关错误)
LOCAL_AAPT_FLAGS := \
–auto-add-overlay \
–extra-packages android.support.v7.appcompat:android.support.v7.gridlayout:android.support.v7.mediarouter //将编译出的三种资源包组件,使用aapt
tool打包到即将生成的Apk中,从而保证生成的Apk运行正常! What?? aapt tool你不知道是什么?? 哈哈,好吧,这个tool确实用的不多,例如与telephony相关有个叫做PhoneCommon的Apk中也用到了,该Apk被使用aapt tool集成到了call相关Apk中(由于Android L有变化,所以就不实名举例了)。综合,该tool的目的就是把另外一个Apk功能直接集成到一个Apk中。
#LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := myapk
include $(BUILD_PACKAGE)
##################################################
include $(call all-makefiles-under,$(LOCAL_PATH))
最后的最后,我需要为大多数刚入门的朋友做一下补充:
那就是由于绝大多数情况下,Android Source Code编译过程中,默认并不去编译V7包相关的这三个lib,所以需要在编译apk之前手动mmm编译一次。
命令如下:
mmm framework/support/v7/appcompat
mmm framework/support/v7/gridlayout
mmm framework/support/v7/mediarouter(各个平台的v7包所放位置可能需要自行去查找)
最后,我们再用mmm去编译前面的apk就成功了。
世界又美好了!!!
3,第三方的aar,添加方法
LOCAL_STATIC_JAVA_AAR_LIBRARIES:= easyrecyclerview design
下面这一行是编译资源文件
下面是java代码编译
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
amap:libs/AMap_Location_V3.6.0_20170918.jar \
core:libs/core-3.0.0.jar \
map3d:libs/Android_Map3D_SDK_V5.3.0_20170815.jar \
butterknife:libs/butterknife-7.0.1.jar \
eventbus:libs/eventbus-3.0.0.jar \
easyrecyclerview:libs/easyrecyclerview-4.2.3.aar \
glide:libs/glide-3.7.0.jar \
design:libs/design-24.2.1.aar
关于.jar与sources.jar到底是什么,区别是什么,我为大家讲解一下。
首先,当我们在下载jar包与引入jar包的时候可能会发现,存在jar文件与相应的cources jar文件。如下图所示:
这个时候,到底该下载哪一个,或者我们需要的是哪一个。是junit-4.7.jar还是junit-4.7-sources.jar?
明确的告诉你,我们需要的是junit-4.7.jar,也就是我们需要在项目中引入的是junit-4.7.jar。
------------------------------------------------------------------------------------------------------------
![](https://oscdn.geek-share.com/Uploads/Images/Content/201707/61c17ed2eb67211a84e137429ac3f7ad.gif)
那这个source.jar有什么用呢?
我们知道,我们在项目中引入外部jar文件,肯定是要用到这个jar文件里面的类库才引入的,虽然我们只需要能引入进来,完成我们需要的功能即可,但有时候,我们还是想看看功能具体的实现,看看别人的源码是怎么写的。这个时候我们打开jar包。
比如,打开mysql-connector-java-5.1.5-bin.jar。
打开com.mysql.jdbc这个包。
发现里面都是编译后的class文件。
这种文件是看不到源码的(当然,你可以选择反编译)
打开第一个class文件,
如果,我们想看源码怎么办,这个时候就需要点击Attach Source.关联源码。
源码在哪里,没错,就在对应的source.jar里面。
Attach Source完了以后,就可以直接看jar包中的类的源码了,是不是整个世界都明亮了。
Attach Source的过程很简单,相信大家可以自己完成。
-----------------------------------------------------------------------
原文地址:https://neveryu.github.io/guestbook/
Github: https://github.com/Neveryu
新浪微博:http://weibo.com/Neveryu
2,jar和aar区别:
*.jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
*.aar:包含所有资源,class以及res资源文件全部包含
如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件。
3,这才是重点
最近遇到一个问题,在更改Android的系统应用时,要引用一个aar文件。之前引用的主要是jar包,而aar文件包含Android的资源文件,如:布局、样式、图片等,如果按照源码中jar的引用方式会遇到编译不过的问题,提示找不到相关的资源文件。
国内的相关论坛也有同行遇到相同的问题,不过相关的解决方案并没有,不过在stackoverflow有相关的解决方案,网址如下:
aar-support-in-android-mk: http://stackoverflow.com/questions/31205856/aar-support-in-android-mk
LOCAL_STATIC_JAVA_AAR_LIBRARIES:= <aar alias> . . . include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := <aar alias>:libs/<lib file>.aar include $(BUILD_MULTI_PREBUILT)1
2
3
4
5
6
7
8
9
10
11
其中,
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := <aar alias>:libs/<lib file>.aar也可以如下面这样写:
include $(CLEAR_VARS) LOCAL_MODULE := <aar alias> LOCAL_SRC_FILES := <lib file>.aar LOCAL_MODULE_CLASS := JAVA_LIBRARIES LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX) LOCAL_BUILT_MODULE_STEM := javalib.jar include $(BUILD_PREBUILT)1
2
3
4
5
6
7
这里主要是LOCAL_STATIC_JAVA_AAR_LIBRARIES,剩下的和jar包大同小异,注意在manifest文件里minSdkVersion要满足aar文件的要求。
搜索Android源码,也可以发现:
#LOCAL_STATIC_JAVA_AAR_LIBRARIES are special LOCAL_STATIC_JAVA_LIBRARIES
LOCAL_STATIC_JAVA_LIBRARIES := (strip(LOCAL_STATIC_JAVA_LIBRARIES)
$(LOCAL_STATIC_JAVA_AAR_LIBRARIES))
这一步完成后,代码可以顺利编译过了,不过在运行apk时如果使用到aar文件里面的资源可能会crash,所以还需要加上以下语句:
LOCAL_AAPT_FLAGS := \ --auto-add-overlay \ --extra-packages <aar package name>1
2
3
关于LOCAL_AAPT_FLAGS,可以参考以下网址,在开发Android系统应用时可能会遇到和这个相关的一些小坑,比如修改完相关代码后,push进机器却不起作用。
Android AAPT and Overlay: http://blog.csdn.net/sunny09290/article/details/20943261
这里把相关aar文件的资源打包到我们的apk里,apk即可正常运行。
另外一点是在make文件中可以指定具体的manifest文件:
LOCAL_MANIFEST_FILE := <manifest file path>
参考链接:
Android AAPT and Overlay: http://blog.csdn.net/sunny09290/article/details/20943261 aar-support-in-android-mk: http://stackoverflow.com/questions/31205856/aar-support-in-android-mk Android4.4 Makefile属性:LOCAL_AAPT_FLAGS的使用: http://blog.csdn.net/visionliao/article/details/43233743 4,自己总结LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_STATIC_JAVA_AAR_LIBRARIES:= easyrecyclerview design LOCAL_STATIC_JAVA_LIBRARIES := amap map3d core butterknife eventbus glide LOCAL_STATIC_JAVA_LIBRARIES += \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-appcompat LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \ frameworks/support/v7/appcompat/res LOCAL_AAPT_FLAGS = --auto-add-overlay \ --extra-packages android.support.v7.appcompat \ --extra-packages com.jude.easyrecyclerview LOCAL_PACKAGE_NAME := DamiManager LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true $(warning $(shell mkdir -p $(PRODUCT_OUT)/system/lib)) $(warning $(shell cp -R $(LOCAL_PATH)/libs/armeabi/* $(PRODUCT_OUT)/system/lib)) # LOCAL_MULTILIB := 32 LOCAL_PREBUILT_JNI_LIBS := \ libs/arm64-v8a/libGNaviData.so \ libs/arm64-v8a/libGNaviMap.so \ libs/arm64-v8a/libGNaviMapex.so \ libs/arm64-v8a/libGNaviSearch.so \ libs/arm64-v8a/libGNaviUtils.so \ libs/arm64-v8a/libRoadLineRebuildAPI.so include $(BUILD_PACKAGE) include $(CLEAR_VARS) LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \ amap:libs/AMap_Location_V3.6.0_20170918.jar \ core:libs/core-3.0.0.jar \ map3d:libs/Android_Map3D_SDK_V5.3.0_20170815.jar \ butterknife:libs/butterknife-7.0.1.jar \ eventbus:libs/eventbus-3.0.0.jar \ easyrecyclerview:libs/easyrecyclerview-4.2.3.aar \ glide:libs/glide-3.7.0.jar \ design:libs/design-24.2.1.aar include $(BUILD_MULTI_PREBUILT) include $(call all-makefiles-under,$(LOCAL_PATH))上面是我的makefile
1,LOCAL_STATIC_JAVA_LIBRARIES := amap map3d core butterknife eventbus glide
这一行的,都是第三方的没有资源的jar然后在下面LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES写一下就好了,对应的是 别名:路径
2,
LOCAL_STATIC_JAVA_LIBRARIES += \ android-support-v4 \ android-support-v7-recyclerview \ android-support-v7-appcompat上面这类型是android自带的包,按这写法就可以,但是如果用到里面的资源可以参考这个链接:http://blog.csdn.net/a4262562/article/details/51469979
内容贴出来:
由于新版本Eclips中ADT插件的升级,Google为了兼容旧版本的Activity Action样式,特意导入了android-support-v7-appcompat.jar库。
更新ADT版本后,使用新版Eclips所建立的Android工程,默认会改为继承ActionBarActivity,而不是以前旧的Activity类。
这样导致的直接结果是:使用新版本Eclips所生成的源码放入Android源码中,使用mmm编译通常都会报错。
特意花了些时间研究了一下。下面针对大家常见的三种情况,分别给出解决办法:
1、准备从头开始编写新APK?
这种情况下最简单的解决办法是:新建apk的时候,将sdk最低版本选择为4.0以上,这样会默认生成继承Activity类的apk,使用该方法写出的apk,放入源码中就能和旧时一样,修改Android.mk后直接使用mmm去成功编译apk src了。
2、直接将Eclips中编译好的apk文件放入源码,计划使用mmm打sign?
如果别人虽然用了新的Eclips编写code,但提供的不是源码,而是pre-build apk文件,那么对这种apk的源码编译操作方法也同旧时一样处理即可(mmm搭配Android.mk)。
3、最麻烦的就是别人提供了写好的apk src,并且这种src刚好也使用了新的v7库,那我们应该怎么办呢?
针对这种情况。首先,需要对常见的Android.mk添加res文件和lib文件的支持(尤其是res文件的支持,一般新版apk 编译不过的根本原因是由于 Theme中所定义的资源无法找到)
(修改好的Android.mk源文件如下)
##################################################
LOCAL_PATH := $(call my-dir)
include
$(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_JAVA_LIBRARIES := telephony-common
LOCAL_STATIC_JAVA_LIBRARIES := \ //增加lib的支持
android-support-v4
\ android-support-v7-appcompat \
android-support-v7-gridlayout \
android-support-v7-mediarouterLOCAL_RESOURCE_DIR = \
$(LOCAL_PATH)/res \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/gridlayout/res \
frameworks/support/v7/mediarouter/res //增加res的支持
(若不填写,则默认会自动查找工程路径下的res目录,所以很多v7的资源包会找不到。(补充下,假设仅仅只添加了v7的lib而未添加res资源文件,则由于res资源文件本身并不包含在lib里面的,故mmm编译时一样会报找不到res的相关错误)
LOCAL_AAPT_FLAGS := \
–auto-add-overlay \
–extra-packages android.support.v7.appcompat:android.support.v7.gridlayout:android.support.v7.mediarouter //将编译出的三种资源包组件,使用aapt
tool打包到即将生成的Apk中,从而保证生成的Apk运行正常! What?? aapt tool你不知道是什么?? 哈哈,好吧,这个tool确实用的不多,例如与telephony相关有个叫做PhoneCommon的Apk中也用到了,该Apk被使用aapt tool集成到了call相关Apk中(由于Android L有变化,所以就不实名举例了)。综合,该tool的目的就是把另外一个Apk功能直接集成到一个Apk中。
#LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := myapk
include $(BUILD_PACKAGE)
##################################################
include $(call all-makefiles-under,$(LOCAL_PATH))
最后的最后,我需要为大多数刚入门的朋友做一下补充:
那就是由于绝大多数情况下,Android Source Code编译过程中,默认并不去编译V7包相关的这三个lib,所以需要在编译apk之前手动mmm编译一次。
命令如下:
mmm framework/support/v7/appcompat
mmm framework/support/v7/gridlayout
mmm framework/support/v7/mediarouter(各个平台的v7包所放位置可能需要自行去查找)
最后,我们再用mmm去编译前面的apk就成功了。
世界又美好了!!!
3,第三方的aar,添加方法
LOCAL_STATIC_JAVA_AAR_LIBRARIES:= easyrecyclerview design
下面这一行是编译资源文件
LOCAL_AAPT_FLAGS = --auto-add-overlay \ --extra-packages android.support.v7.appcompat \ --extra-packages com.jude.easyrecyclerview
下面是java代码编译
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := \
amap:libs/AMap_Location_V3.6.0_20170918.jar \
core:libs/core-3.0.0.jar \
map3d:libs/Android_Map3D_SDK_V5.3.0_20170815.jar \
butterknife:libs/butterknife-7.0.1.jar \
eventbus:libs/eventbus-3.0.0.jar \
easyrecyclerview:libs/easyrecyclerview-4.2.3.aar \
glide:libs/glide-3.7.0.jar \
design:libs/design-24.2.1.aar
相关文章推荐
- Android mk 引用 jar 包、so 库、aar 包,系统签名
- android学习第七讲:学习Android.mk编译jar包,如何编译APK,APK中如何导入jar包和库文件,如何在Android.mk中添加判断语句
- Android 打包jar,aar以及在项目中的引用
- Maven 的Android项目里面的jar包(本地)、library及libs目录下so文件如何引用
- android中.aar文件与.jar文件的区别
- Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
- Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
- Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
- Android studio jar冲突 文件冲突 aar引用相同的文件 引用相同的jar包 重复导入相同依赖包
- Android 将Android项目打包成aar文件并在其他项目中引用,打包成jar包
- Eclipse下的package,source folder,folder的区别以及在Eclipse项目中如何正确引用资源
- AndroidStudiod如何打包aar文件包和引用小记
- (转载)Android xml资源文件中@、@android:type、@*、?、@+引用写法含义以及区别
- Android.mk引用aar文件
- Android Studio 如何引用jar & so文件
- 什么是AAR文件以及如何在Android开发中使用
- Android 系统生成jar文件和aar 文件区别
- androidstudio 引用本地aar文件 和aar文件中包含jar该如何引用
- Android中打包含有Activity以及资源文件的jar包在工程中调用
- android工程中引入第三方JAR包后安装APK时老是提示找不到库文件 || Android如何将程序打成jar包 || 运行java.lang.noclassdeffounderror错误