我用的是android studio 2.0正式版

1、简介

aar包是Android studio下打包android工程中src、res、lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件

2、生成aar包步骤

2.1、用android studio打开一个工程,然后新建一个Module,新建Module时候选择Android Library,后面按新建普通工程操作

2.2、新建Module 类型为android Library 后如下图所示

2.3、在新建的Module中编写完代码后,接下来编译整个工程后就会自动生成aar包,选中自己创建好的Module(我的就是paysdk)

点击菜单栏 Build里面的Make Module ‘xxx’  如下图:

2.4、编译完成之后会在Module的build-->outputs-->aar-->xxxxx.aar 如图:

3、其他androidstudio工程引用aar包

3.1、将aar包复制到libs目录下 如下图:

3.2、配置build.gradle文件:

加入

  repositories {
        flatDir {
        dirs 'libs'
    }

compile(name:'paysdk-debug', ext:'aar')   name后面是自己的aar的名字

完整的配置文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.umpay.paydemo"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


}
repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile(name: 'paysdk-debug', ext: 'aar')
}

3.3、最后一个同步gradle

在这里说一下发布一个aar的注意事项:

修改Module(也就是生成aar的工程,我的是paysdk)里面的代码的时候,重新编译好之后,需要把引用aar项目当中的aar文件删掉,并且也需要删除掉build--intermediates--exploded-aar--paysdk,完了在重新同步

1 、要尽量避免定义内部接口,
这其实是一个编程习惯, 接口interface最好是独立定义, 避免定义在类的内部.
因为当你发布aar时, 内部的接口在混淆后会独立成一个外部的接口Outer$InnerInterface.
然后麻烦来了, 别人在实现这个类的时候必须也写成XXX implement Outer$InnerInterface{}的形式. 否则是找不到这个类的.


想写成XXX implement Outer.InnerInterface{}是不行的, 因为在Outer里没有这个InnerInterface的定义, 在混淆后, 所有的内部类都被改写成了形如Outer$Inner的外部类了. 包括interface, enum, 等等.
更糟糕的是, 你很可能只是发布项目的一部分代码作为aar, 那你的项目内已经引用的Outer.Inner的类或接口都必须写成Outer$Inner的形式, 否则编译不过, 否则运行时找不到类. 所以, 为了以后不必要的麻烦, 尽量避免使用内部类, 内部接口,
除非你确认不会混淆代码, 或者会将所有定义和调用都参与混淆.


2、 使用maven发布需要将所有依赖都发布到maven上

如果你发布多个aar, 每个aar互相依赖, 那么你需要将这些依赖都以maven的形式定义, 否则会在编译时, maven解析某个aar的pom时会报空指针异常.

maven的形式定义:

apply plugin: 'maven'
compile 'com.nineoldandroids:library:2.4.0+'

3、 res内定义的属性或者名称, 都应当加上前缀

你的aar里定义资源文件是很正常的事, 资源文件很有可能和别人的资源重名, 而悲剧的是, 别人很有可能是引用了另外一个aar导致与你重名. 他无法修改那个aar的资源名, 就像他不能修改你的aar资源名一样. 为了避免这种尴尬, 最好在定义的资源程前加上一个前缀, 比如你的模块简写,商标简写等等. 避免冲突。

4、补充aar和jar的区别:

无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Java Archive,即java归档文件。
在用AS的过程中,你会发现有aar这么个东西,经查阅资料了解到,aar是android归档文件,我想全称应该是:Android Archive。

他们两个有什么区别呢?

个人理解:

jar是java文件编译后的class文件压缩包。

aar是android module中所有resource文件和编译后的java文件的总压缩包。

区别在于:aar除了包含class文件,还包含resource文件。

在Android Studio中如何引入aar文件呢?

拿RecyclerView的aar文件为例。

1、找到aar文件:..\Android_SDK_Windows\extras\android\m2repository\com\android\support\recyclerview-v7\24.0.0\recyclerview-v7-24.0.0.aar
copy到Android Studio项目中的libs目录下。

2、然后在Android Studio对应的module的build.gradle文件中输入一下内容:

1

2

3

4

5

6

7

8

9

dependencies {

  ...

  compile(name:'recyclerview-v7-24.0.0',ext:'aar')

}

repositories {

  flatDir {

    dirs 'libs'

  }

}

3、然后重新build下整个项目即可。

在Android Studio中如何把某一个module导出为aar文件呢?

以testlibrary为例:

1、执行对应module的assembleRelease命令:

上图切记,如果是项目的主module,即app,则生成的是apk包。

2、在对应module的build\outputs\aar\目录下即是:

如果想把aar文件导入到Eclipse中呢?

如图:把aar文件用WinRAR等压缩软件打开后,会发现是上面的结构,classes.jar即为class文件的jar包,其他的为android相关的资源文件。

如果你想把导入到Eclipse中,就需要把这里面的所有资源和class文件转换成一个library工程了。

用Eclipse新建一个library工程,导入res资源、清单文件和发编译后的java文件。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐