androidstudio导出aar studio,怎么引用aar包

[Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
主要讲解 Studio中生成aar文件以及本地方式使用aar文件的方法。
在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。
分别存储位置:
两者区别:
*.jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。
*.aar:包含所有资源,class以及res资源文件全部包含
如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件。
使用方式:
*.jar:拷贝到:libs目录,eclipse直接导入即可,AndroidStudio项目中添加:
dependencies { compile fileTree(include: ['*.jar'], dir:'libs') }
重新编译一次项目既可完成加载。
*.aar:有两种方式,分别为本地加载以及网络加载,由于网络加载涉及到发布到mavenCentral托管的问题这里不做讨论;另外eclipse很久没有使用了也不做讨论;在这里给大家说一种本地加载的方式,简单快捷。
这里演示的aar文件为:&genius.aar&
第一步:拷贝到:libs目录
第二步:build.gradle 配置文件中更改为
1 2 3 4 5 6 7 8
repositories { flatDir { dirs'libs' } } dependencies { compile(name:'genius', ext:'aar') }
分别添加了&repositories&与更改了&dependencies&,然后重新编译一次项目就可以正常使用了。
这时打开你的项目地址&uildintermediatesexploded-aar&你会发现下面多了一个文件夹&genius&打开后能看见里边包含了一个&classes.jar&文件与一些资源文件和&R.txt&文件。
这就是Android Studio自动解析了aar文件后出现的东西。[Android] AS 中 Gradle 配置运行浅析
既然是浅析,自然也就没有深入的地方,我也写不出深入的地方,自己没有用过,也不会写出来坑人的;仅仅就是在 Android Studio 中的 Gradle 使用配置而已。
Gradle 是以 Groovy 语言为基础,面向Java应用为主。基于DSL(领域特定语言)语法的自动化构建工具。
支持多方式依赖管理:包括从 maven 远程仓库、 nexus 私服、 ivy 仓库以及本地文件系统的 jars 或者 dirs 。这也是我最喜欢的地方,操作简单。
一个新的项目中就包含这些文件,build 是两个,一个项目一个是 APP Model 的。另外在 APP 中可以看见有一个 manifest 文件夹,这意味着着可以有多 AndroidManifest 文件。
另外值得一说的是 gradle.properties 文件也是含有两个,但是却是一个是全局,一个是项目的;这与上面的 Build 文件有何区别?区别在于全局文件存在于 C:Users用户名.gradle文件夹中,该文件有可能没有,需要自己创建,创建后所有项目都将具有访问权限,在该文件中一般保存的是项目的一些变量等,如果是无关紧要的变量可以保存在项目文件中,如果是用户名密码等变量则需要保存在全局文件中。
至于项目的配置文件一般是空的。
local.properties
## This file is automatically generated by Android Studio.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
# This file should *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
sdk.dir=D:ToolKitsAndroidsdk
其中包含了你的 sdk 配置,当然你还可以配置 ndk 路径;格式与 sdk 一样。
settings.gradle
include ':app'
该文件中就仅仅只包含了一句话,在你的项目中如果有多个 Model 存在的时候,就可以选择包含哪些进行编译。
build.gradle
两个大的包围一看就明了,一个是为编译准备的,一个是为所有项目准备的。
其中,Repositories 配置的是上面所说的依赖管理的东西,也就是依赖管理的服务器。默认是 jcenter() 你可以添加其他,多个之间不干扰。
dependencies 这个也是依赖管理的东西,上面是指定依赖管理的服务器,这个就是具体依赖什么库。
联合起来也就是,依赖 jcenter() 服务中的 gradle 库,其包名是:&com.android.tools.build& ,版本是:1.0.0 版本。
在这个中基本可以按照名称来知晓其作用。
apply plugin: 'com.android.application'
表示的是添加插件,其是可以理解为该 model 为一个 com.android.application 程序,也就是应用程序,如果你的 Model 是一个库,那么自然也就是:
apply plugin: 'com.android.library'
dependencies :
这个也就是所谓的依赖了,在这里不光可以进行远程依赖(上面所说的方法),也可以本地依赖:
compile fileTree(include: ['*.jar'], dir: 'libs')
这句话也就是说编译时依赖 libs 文件夹下的所有 jar 文件。
compile project(':library')
这样一句话是什么意思?这也是依赖,不过依赖的是一个 model ,前面说了在一个项目中可以有多个 model ,这句话的意思也就是依赖一个本项目中 名称为 library 的 model 库。
compile 'com.android.support:appcompat-v7:21.0.3'
至于这句话也就是依赖一个远程的库了,这个库的作用是在低版本中使用一定的 Material Design 的东西。
其他一些介绍我以前发过文章可以看看,包括依赖 JNI 本地 aar 等等:
[Android][Android Studio] Gradle项目中添加JNI生成文件(.so文件)[Android][Android Studio] *.jar 与 *.aar 的生成与*.aar导入项目方法
详细说说 android 部分:
先来看看基本完整的一个:
compileSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION as int
buildToolsVersion ANDROID_BUILD_TOOLS_VERSION
defaultConfig {
buildTypes {
compileOptions {
sourceSets {
lintOptions {
productFlavors {
signingConfigs {
storeFile file(&.keystore)
storePassword &&&
keyAlias &&&&
keyPassword &&&
可以看见如果是完整的是有很多可以配置的地方;还让我一个个道来:
compileSdkVersion 21
buildToolsVersion 21.1.2
这两个就是指定的编译SDK以及编辑工具版本,具体可以打开你的 SDK Manager 看看。
defaultConfig
这个自然就是默认配置了,既然是默认配置那么久相当于全局配置,也就是说这里边配置的下面的 buildTypes 中也将自动继承了。
在这个中可以放入很多的控制,如下面 buildTypes/release 中的配置你也可以放到其中:
defaultConfig {
applicationId com.example.qiujuer.application
minSdkVersion 15
targetSdkVersion 21
versionCode 1
versionName 1.0
moduleName genius
cFlags -DANDROID_NDK -D_RELEASE
ldLibs m, log, jnigraphics
abiFilters all
在这里,首先进行了一个 applicationId 配置,该配置不是必须,但 库类型的 Model 将无此配置。
下面自然也就是 最小的SDK版本为 15,目标版本为:21 也就是说其中的代码你使用的全是API21中的 Android。再有就是当前的版本代码,版本名称,在Eclipse 中这两个属性是在 AndroidManifest.xml 文件中,在这里把其提出来单独配置就是为了下面你可以在不同发布版本中配置不同的值。
至于这里的 ndk 部分,这个就是我额外加入的,其作用是可以直接编译 NDK 代码,不需要自己执行,具体详见:[Android] 环境配置之Android Studio开发NDK
buildTypes
在这里进行配置的是你的编译配置,可以看见这里有一个 release ,当然也就是有 debug 部分,两个部分配置都是一样。
在这里主要进行的配置是是否进行代码混淆,所以有一个代码混淆的开关,以及代码混淆的具体文件,文件有两种,无论哪种都行。
compileOptions
很多人或许不知道这个部分是干什么的,其是看看下面就明了了:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
在这里你可以进行 Java 的版本配置,以便使用对应版本的一些新特性。
sourceSets
这个部分,看名字应该有个大概意思就是说设置,其是很多从 Eclipse 中迁移过来的代码,大部分中都将带有这个设置,因为 Eclipse的文件夹与 AS 不尽相同,所以需要手动指定。
sourceSets {
manifest.srcFile 'Manifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
以上是一些常用的设置,其中最后一个是引用 *.so 文件的时候使用的方法。
lintOptions
这个其实应该写到最后的,因为这个是设置 编译的 lint 开关。
程序在buid的时候,会执行lint检查,有任何的错误或者警告提示,都会终止构建,我们可以将其关掉。
lintOptions {
abortOnError false
productFlavors
在这里你可以设置你的产品发布的一些东西,比如你现在一共软件需要发布到不同渠道,且不同渠道中的包名不同,那么可以在此进行配置;甚至可以设置不同的 AndroidManifest.xml 文件。
productFlavors {
packageName='com.example.qiujuer.application1'
manifest.srcFile 'exampleapk/AndroidManifest1.xml'
packageName='com.example.qiujuer.application2'
manifest.srcFile 'exampleapk/AndroidManifest2.xml'
不过,对于这个我并不常用,可以说基本没有用。
signingConfigs
这个相信大伙都知道吧,就是为包签名的配置,你可以设置具体的签名文件,签名密码等等:
signingConfigs {
storeFile file(&.keystore)
storePassword &&&
keyAlias &&&&
keyPassword &&&
这个可以不用自己创建,你可以点击 build/generate signed apk,在其中选择你的文件或者创建签名文件,设置密码等等,然后选择记住密码,然后就会看见有这个配置了。
一些常用的操作配置说完了,来说说,一个简单的小Case 。
在 APP Model build.gradle 文件根部我们加上:
task clearApk(type: Delete) {
delete '../release/' + POM_ARTIFACT_ID + '_' + VERSION_NAME + '.apk'
task makeApk(type: Copy) {
from('build/outputs/apk/')
into('../release/')
include('app-debug.apk')
rename('app-debug.apk', POM_ARTIFACT_ID + '_' + VERSION_NAME + '.apk')
makeApk.dependsOn(clearApk, build)
代码分为3个部分,分别是删除,拷贝,以及将其连接起来的一个设置。
先说说这个 Case 的目的,其目的是拷贝 build/outputs/apk下面的debug apk文件到项目根目录的 release 文件夹下,并且更名。
但是细心的朋友应该会看见其中有两个参数:POM_ARTIFACT_ID VERSION_NAME 这两个从哪里来?
前面最开始讲过:gradle.properties 文件,这两个就是写在项目根部的 gradle.properties 文件中:
写好了,怎么运行呢?两种方式,第一种,代码 task 上右击,run():
第二张,命令行方式:
输入后回车,等待执行完成,成功后会出现:
现在看看项目中:
的确是成功了!
这只是一个很基本的用法,限于篇幅就差不多这么多吧,如果大家有疑问,可以评论回复,我如果积累了一定量,我好针对问题写新的一些用法,不然我也很没有头绪的。库: /AltBeacon/android-beacon-library.git
主工程: /AltBeacon/android-beacon-library-reference.git
File-&Import Project:先导入android-beacon-library-reference工程
File-&Import Module:导入android-beacon-library作为module,module名为:android-beacon-library
这个时候gradle文件sync是不成功的。因为默认会在主工程目录下寻找android-beacon-library目录,找不到。所以要在setting.gradle里加上
project(':android-beacon-library').projectDir = new File('../android-beacon-library')
setting.gradle里包含新的库
include ':app', ':android-beacon-library'
android-beacon-library-reference的app模块下的build.gradle把引用aar改为引用工程
dependencies {
compile project(':android-beacon-library')
//compile 'org.altbeacon:android-beacon-library:2+@aar'
本文目前还没有评论……Android项目中如何用好构建神器Gradle?
发表于 10:36|
作者贾吉鑫
摘要:本文作者贾吉鑫为大众点评Android工程师,在进行团队并行开发时,分库遇到的问题很多都要通过Gradle脚本解决。Gradle虽为构建神器,但学习曲线比较陡峭,要想在Android项目中用好Gradle必须要做到三点。
Android Gradle实战
下面讲讲在Android Gradle实战中遇到的一些问题和经验,感觉还是蛮多干货的。
productFlavors
这个东西基本上已经烂大街了,gradle的项目一般都会使用Product Flavor,看完美团的文章,你应该就懂了。
buildTypes
很多App有内测版和正式版,怎么让他们同时安装在一个手机上?同时安装在一个手机上,要求packageName不同的,用productFlavors可以解决,但可能不够优雅,alpha版本还要来个debug和release版本岂不是很蛋疼?可以用buildTypes来解决,淘宝资深架构师朱鸿的有比较详细的讲解,但有些内容可能有些过时了,需要更改脚本。
项目依赖的远程包如果有更新,会有提醒或者自动更新吗? 不会的,需要你手动设置changing标记为true,这样gradle会每24小时检查更新,通过更改resolutionStrategy可以修改检查周期。
configurations.all {
// check for updates every build
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
dependencies {
compile group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
之前上传aar同一版本到maven仓库,但依赖却没有更新,该怎么办呢?可以直接删除本地缓存,缓存在~/.gradle/caches目录下,删除缓存后,下次运行就会自动重新下载远程依赖了。
上传aar到Maven仓库
在工程的build.gradle中添加如下脚本:
apply plugin: 'maven'
uploadArchives {
repositories {
mavenDeployer {
pom.groupId = GROUP_ID
pom.artifactId = ARTIFACT_ID
pom.version = VERSION
repository(url: RELEASE_REPOSITORY_URL) {
authentication(userName: USERNAME, password: PASSWORD)
在build.gradle同目录下添加gradle.properties文件,配置如下:
GROUP_ID=dianping.android.nova.thirdparty
ARTIFACT_ID=zxing
VERSION=1.0
RELEASE_REPOSITORY_URL=/nova
USERNAME=hello
PASSWORD=hello
gradle.properties的属性会被build.gradle读取用来上传aar,最后执行./gradlew :Zxing:uploadArchives即可。
更多配置,可参考。
项目构建过程中那么多任务,有些test相关的任务可能根本不需要,可以直接关掉,在build.gradle中加入如下脚本:
tasks.whenTaskAdded { task -&
if (task.name.contains('AndroidTest')) {
task.enabled = false
tasks会获取当前project中所有的task,enabled属性控制任务开关,whenTaskAdded后面的闭包会在gradle配置阶段完成。
任务可以取消了,但还不尽兴啊,想加入任务怎么搞?前面讲了dependsOn的方法,那就拿过来用啊,但是原有任务的依赖关系你又不是很清楚,甚至任务名称都不知道,怎么搞?
比如我想在执行dex打包之前,加入一个hello任务,可以这么写:
afterEvaluate {
android.applicationVariants.each { variant -&
def dx = tasks.findByName("dex${variant.name.capitalize()}")
def hello = "hello${variant.name.capitalize()}"
task(hello) && {
println "hello"
tasks.findByName(hello).dependsOn dx.taskDependencies.getDependencies(dx)
dx.dependsOn tasks.findByName(hello)
afterEvaluate是什么鸟?你可以理解为在配置阶段要结束,项目评估完会走到这一步。
variant呢?variant = productFlavors+ buildTypes,所以dex打包的任务可能就是dexCommonDebug。
你怎么知道dex任务的具体名称?Android Studio中的Gradle Console在执行gradle任务的时候会有输出,可以仔细观察一下。
hello任务定义的这么复杂干啥?我直接就叫hello不行吗?不行,each就是遍历variants,如果每个都叫hello,多个variant都一样,岂不是傻傻分不清楚,加上variant的name做后缀,才有任务的区分。
关键来了,dx.taskDependencies.getDependencies(dx)会获取dx任务的所有依赖,让hello任务依赖dx任务的所有依赖,再让dx任务依赖hello任务,这样就可以加入某个任务到构建流程了,是不是感觉非常灵活。
我突然想到,用doFirst的方式加入一个action到dx任务中,应该也可以达到上面效果。
gradle加速
gradle加速可以看看这位朋友写的,我就不多嘴了。并行编译,常驻内存,还有离线模式这些思路对gradle的加速感觉还是比较有限。
想要更快,可以尝试下Facebook出品的,可以看一下Vine团队适配Buck的,我们的架构师也有适配Buck,加速效果在10倍左右,但有两个缺点,不支持Windows系统,不支持远程依赖。
你想知道每个执行任务的运行时间吗?你想知道每个执行任务都是干嘛的吗?把下面这段脚本加入build.gradle中即可:
class TimingsListener implements TaskExecutionListener, BuildListener {
private Clock clock
private timings = []
void beforeExecute(Task task) {
clock = new org.gradle.util.Clock()
void afterExecute(Task task, TaskState taskState) {
def ms = clock.timeInMs
timings.add([ms, task.path])
task.project.logger.warn "${task.path} took ${ms}ms"
void buildFinished(BuildResult result) {
println "Task timings:"
for (timing in timings) {
if (timing[0] &= 50) {
printf "%7sms
%s\n", timing
void buildStarted(Gradle gradle) {}
void projectsEvaluated(Gradle gradle) {}
void projectsLoaded(Gradle gradle) {}
void settingsEvaluated(Settings settings) {}
gradle.addListener new TimingsListener()
上面是对每个任务计时的一个例子,想要了解每个任务的作用,你可以修改上面的脚本,打印出每个任务的inputs和outputs。比如assembleDebug那么多依赖任务,每个都是干什么的,一会compile,一会generate,有什么区别?看到每个task的输入输出,就可以大体看出它的作用。如果对assemble的每个任务监听,你会发现改一行代码build的时间主要花费在了dex上,buck牛逼的地方就是对这个地方进行了优化,大大减少了增量编译运行的时间。
buildscript方法
Android项目中,根工程默认的build.gradle应该是这样的:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
allprojects {
repositories {
一会一个jcenter()这是在干什么?buildscript方法的作用是配置脚本的依赖,而我们平常用的compile是配置project的依赖。repositories的意思就是需要包的时候到哥这里来找,然后你以为com.android.tools.build:gradle:1.2.3会从jcenter那里下载了是吧,图样图森破,不信加入下面这段脚本看看输出:
buildscript {
repositories {
repositories.each {
println it.getUrl()
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
结果是这样的:file:/Applications/Android%20Studio.app/Contents/gradle/m2repository/ /
我靠,仓库竟然直接在Android Studio应用内部,所以说你去掉buildscript的jcenter()完全没有关系啊,下面还有更爽的,我们知道有依赖传递,上面classpath
中的gradle依赖gradle-core,gradle-core依赖lint,lint依赖lint-checks,lint-checks最后依赖到了asm,并且这个根目录中的依赖配置会传到所有工程的配置文件,所以如果你要引用asm相关的类,不用设置classpath,直接import就可以了。你怎么知道前面的依赖关系的?看上面m2repository目录中对应的pom文件就可以了。
为什么讲到ASM呢?又是个比较刁的东西,可以直接用来操纵Java字节码,达到动态更改class文件的效果。可以用ASM,达到解耦效果。中提到的class依赖分析和R常量替换的脚本都可以用ASM来搞。
脚本写多了,都挤在一个build.gradle里也不好,人长大了总要自己出去住,那可以把部分脚本抽出去吗?当然可以,新建一个other.gradle把脚本抽离,然后在build.gradle中添加apply from 'other.gradle'即可,抽出去以后你会发现本来可以直接import的asm包找不到了,怎么回事?根工程中配置的buildscript会传递到所有工程,但只会传到build.gradle脚本中,其他脚本可不管,所以你要在other.gradle中重新配置buildscript,并且other.gradle中的repositories不再包含m2repository目录,自己配置jcenter()又会导致依赖重新下载到~/.gradle/caches目录。如果不想额外下载,也可以在other.gradle中这么搞:
buildscript {
repositories {
url rootProject.buildscript.repositories[0].getUrl()
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
获取AndroidManifest文件
提到,gradle中的applicationid用来区分应用,manifest中packageName用来指定R文件包名,并且各个productFlavor
的manifest中的packageName应该一致。applicationid只是gradle脚本中的定义,其实最后生成的apk中的manifest文件的packageName还是会被applicationid替换掉。
那获取R文件的包名怎么搞?要获取AndroidManifest中package属性,并且这个manifest要是起始的文件,因为最终文件中的package属性会被applicationid冲掉,由于各个manifest中的package属性一样,并且非主manifest可以没有package属性,所以只有获取主manifest的package属性才是最准确的。
def manifestFile = android.sourceSets.main.manifest.srcFile
def packageName = new XmlParser().parse(manifestFile).attribute('package')
无用的资源就不要打包进APK了。
之前在创业公司,用
做持续继承,遇到一个让我很纠结的问题。在Travis上执行构建脚本如下:
./gradlew clean
./gradlew assembleXR
最后生成的APK在运行的时候报错,提示找不到某个.so文件,解压发现APK中果然缺少某个库工程的.so文件,但在本地运行的时候却是没有问题,纠结了好久,后来研究发现Android
Studio中执行Clean Project的时候,会执行generateSources的任务,把它加入构建脚本后才打包正确。最近发现,这原来是个,并且已经在android gradle1.3被修复了。
匆匆忙忙间,写了很多东西。读完此文,希望你能感受到构建神器的魅力,感受到它的灵活强大,当然也希望能让你使用Gradle更加得心应手。作者简介:贾吉鑫(),大众点评Android工程师,开发经验丰富,乌云白帽子,关注网络安全,个人博客:。
将于10月15-16日在北京新云南皇冠假日酒店召开。大会特设五大技术专场:平台与技术iOS、平台与技术Android、产品与设计、游戏开发、企业移动化。此外,大会更是首次举办国内极具权威影响力的IoT技术峰会,特设硬件开发技术与虚拟现实两大专场。大会将聚集国内最具实力的产品技术团队,与开发者一道进行最前沿的探讨与交流。
第一时间掌握最新移动开发相关信息和技术,请关注mobilehub公众微信号(ID: mobilehub)。&
推荐阅读相关主题:
CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
相关热门文章开场白:其实这篇文章有点白费心机。
详细说明是:http://blog.csdn.net/qiujuer/article/details/?utm_source=tuicool
1.(*.aar)几乎是Android Studio的东西,所以你要用eclipse来使用 基于&IntelliJ&IDEA&的Android Studio,必须要了解这个玩意里面是什么!
2.说退一万步,既然Android Studio使用的(*.aar),你就好好的去学使用Android Studio,为何要使用eclipse 来弄这(*.aar)呢?
3.什么?因为github的开源项目用 &Gradle&& 构建项目 来 依赖 这些 包&(*.aar)。&
4.而Android Studio本来就用Gradle ,所以直接github的URL一导入,花上一两分钟就能跑起项目了。
哎,没有办法了。看来eclipse以后都不知道怎么怎么办。(如果新开的Android项目的话,要大力建议使用Android Studio,毕竟别人github上的大牛都用Gradle 了,更别说Android Studio)
看完上面的吐槽,还想自找麻烦使用Eclipse 使用 (*.aar)包的话,就继续看下面吧。
前提:我假设&(*.aar)的包是从&%ANDROID_HOME%\extras\android\m2repository&&中的 v4 或者 v7中获取到的。
什么? 你的SDK没有 更新到& m2repository &文件夹 或者 &被大天朝拦住网络无法更新&。
好吧!你赢了,你去看&/shortboy/archive//2738294.html这篇吧。
更新完你的SDK再回来看吧。
(其实我还没有用Android Studio时,在eclipse开发时,都是没有更新到&m2repository&&文件夹)
更新完后如图:
言归正传:
1.我们以appcompat-v7来举例吧,又什么你不知道appcompat-v7有什么?
请看这篇吧:http://blog.csdn.net/xyz_lmn/article/details/
2.我们看到下面的图片的文件,就看到客官们的的(*.arr)文件了
3.我们直接双击看里面是什么?
如图,里面有一个jar,和其他类似在Eclipse的工作目录,例如res,assets,AndroidManifest.xml这些文件
4.如果这样的话,我们是否可以考虑当这个(*.arr) 里面的res,assets,AndroidManifest.xml是一个在eclipse中的Android 的 libs项目的文件,复制过去后再把这个项目声明为libs
5.然后在你想要使用的项目中导入你的class.jar(当然,你需要改变成相应的名字,如果你不改我也耐不了你如何)
6.现在你再引入刚才的libs项目,再启动一下你的项目。(如果你没有引入刚才的libs项目,估计只加入jar的话,肯定会报找不到某资源的异常)。
经过这六步,你还感觉用eclipse来导(*.arr)使用不麻烦的话。我只能说。你赢了。拜拜
阅读(...) 评论()

我要回帖

更多关于 android studio 打aar 的文章

 

随机推荐