注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之二十九AndroidStudio打包并调用aar库及其中一些细节  

2015-07-12 21:07:22|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之二十九AndroidStudio打包并调用aar库及其中一些细节

 

在上一篇博客里谈到了调用第三方的aar的库的方法,方法很好,但是随之就引出一个问题,如何自己生成一个aar库并调用其中的UI资源,比如Activity

现以一个普通的工程为例,这个工程是一个普通的Android程序(APK类型可执行的),修改方法如下:

(说明:下面的工程是从Eclipse的工程转过来的,所以少第一步)

1、把Module.iml文件的内容拷贝到Project.iml文件中并删除默认的Module

2、在模块的build.gradle中,将(输出APK

apply plugin: 'android'

替换成(输出AAR

apply plugin: 'com.android.library'

 

这一步还是比较简单的,麻烦就在于流程不理解,所以走了一些弯路,包括网上说输出AAR使用android-library,这种方法不知道是不是老版本的用法。

打包成功后,直接把aar包按上篇博客的方法,加入到一个测试工程中,编译,报如下错误:

Error:(14, 9) Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:14:9

Error:(14, 9) Execution failed for task ':app:processDebugManifest'.

> Manifest merger failed : Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:14:9

is also present at MyApplication:library:unspecified:18:9 value=(@drawable/icon)

Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:12:5 to override

从网上找了些资料,其实也就是按照其提示的方法修改:

1. manifest节点加上:xmlns:tools="http://schemas.android.com/tools"

2. application 节点加上:tools:replace="android:icon, android:theme"

记着千万别加错了地方,否则又会走一大段弯路。才搞一个东西,细心还是很重要的,不然白白浪费N多的时间。

然后重点就出来,这个工程可以编译过去,但是在运行时直接报错:

:app:dexDebug

AGPBI: {"kind":"SIMPLE","text":"UNEXPECTED TOP-LEVEL EXCEPTION:","position":{},"original":"UNEXPECTED TOP-LEVEL EXCEPTION:"}

AGPBI: {"kind":"SIMPLE","text":"com.android.dex.DexException: Multiple dex files define

Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs;","position":{},"original":"com.android.dex.DexException: Multiple dex files define

Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompatIcs;"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)","position":{},"original":"\tat

com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)","position":{},"original":"\tat

com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)","position":{},"original":"\tat

com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)","position":{},"original":"\tat com.android.dx.merge.DexMerger.mergeDexes

(DexMerger.java:171)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.merge.DexMerger.merge(DexMerger.java:189)","position":{},"original":"\tat com.android.dx.merge.DexMerger.merge

(DexMerger.java:189)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)","position":{},"original":"\tat

com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.runMonoDex(Main.java:303)","position":{},"original":"\tat com.android.dx.command.dexer.Main.runMonoDex

(Main.java:303)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.run(Main.java:246)","position":{},"original":"\tat com.android.dx.command.dexer.Main.run

(Main.java:246)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.dexer.Main.main(Main.java:215)","position":{},"original":"\tat com.android.dx.command.dexer.Main.main

(Main.java:215)"}

AGPBI: {"kind":"SIMPLE","text":"\tat com.android.dx.command.Main.main(Main.java:106)","position":{},"original":"\tat com.android.dx.command.Main.main(Main.java:106)"}

 

 

 FAILED

 

FAILURE: Build failed with an exception.

 

* What went wrong:

Execution failed for task ':app:dexDebug'.

> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\JDK8\bin\java.exe'' finished with non-zero exit value 2

 

* Try:

Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

重点在红色的部分,就是说支持v4包,有重复,解决这个问题,可真是费了九牛二虎之力,过程如下:

1、按照网上说的把build.gradle中的依赖项中的compile改成provider,不行。

2、在发现重复编译的选项中增加:

    compile ('com.facebook.android:facebook-android-sdk:3.23.0'){

        exclude module: 'support-v4'

    }

//    compile (project(':FacebookSDK')){

//        exclude module: 'bolts-android'

//        exclude module: 'support-v4'

//    },这种方法也不行。

3android {

   defaultConfig {

      ...

      multiDexEnabled = true

      ...

   }

}

也不行。

 

4、显示的指定引入的包:

compile 'com.android.support:appcompat-v4:22.2.0'

因为网上说,高版本的AndroidStudio程序V7会自动下载一个V4,会与原来的版本有冲突。所以可以显示指定,但是遗憾是的还不行。

不过,这却大大的提示了解决问题的思路。于是打开编译成功的aar库,找到V4删除,再清理,编译,还是不行。

5、网上有提示说是不是版本的问题,以前确实也出现过这种问题,于是把当前的程序降到Tools19,结果编译错误,没办法,只好把库升到21,编译通过。结果还是不行。

回头又重新清理库工程,再重新编译,结果报错,无语。只好又退回到Tools19。问题又回到原点。

这说起来又费了好长功夫,突然想到,把aar工程中的相关的V4的文件删除会不会好呢?说干就干,在库工程里搜索,然后找到V4相关的JAR包,全部删除。重新编译成功,拷贝过来,然后再运行,OK。真是无语啊。

总结一下,网上的解决思路基本都是正确的,也正是这个原因,最终解决了这个问题,但上面的思路,大多是同时调用多个库jar包里有多个相同的V4也就是网上说得V4问题),这种大多可以用方法2来解决。但这上是在aar包中有相同的V4,所以只有把库中的直接删除才好。

以为到此,就齐活了,没想到啊,引用工程时,直接崩溃。查了下日志,无语,第一回的错误是事件的方法设置不对,导致找不到方法。第二种是ActivityAndroidMnifest.xml没有声明,然后开始声明,结果引用的库的名字总显示不对。这可又折腾半天。

网上提示,直接把app\build\intermediates\exploded-aar\PreviewUI-debug\jars目录下的classes.jar增加到库引用,即选择工程--F4-dependces ,添加上面的路径即可。

还是找不到。

后来试着直接把库中的AndroidMnifest.xmlActivity原路径拷贝到新的引用工程中,发现,原来是名字又错了。都彻底无语了。

再测试,启动,OK。界面也出来了。工程基本也就走了一趟。

纸上学来终觉浅,绝知此事要躬行。

雨里深山雪上烟,看来容易做时难。

  评论这张
 
阅读(489)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017