嗨我有一个Android库项目,它生成一个AAR.
一切都很好但是当我在另一个项目中使用AAR时,我收到此错误:
java.lang.NoClassDefFoundError: com.squareup.picasso.Picasso
Run Code Online (Sandbox Code Playgroud)
AAR使用毕加索,是否可以在生成AAR时导出AAR的依赖关系?
这似乎是一个基本问题,但我无法在任何地方找到这些信息.
我想构建一个暴露公共API的AAR但隐藏实现,以便不直接调用实现.
除了模糊我想要封装的包(隐藏)之外,我没有看到这样做的方法.
在我的Android Studio项目中,我有两个子项目/模块:Android应用程序(App1)和Android库项目(LibraryProject1).App1取决于LibraryProject1.到现在为止还挺好.
但是,LibraryProject1反过来,需要导入AAR库才能正常工作.
所以,我的配置如下:
App1包括LibraryProject1
LibraryProject1包括dependency.aar
现在,要包含dependecy.aar我使用此处详述的方法:
如何使用新的Gradle Android Build System手动包含外部aar包
所以基本上在我的build.gradle面前LibraryProject1我有:
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile (name:'dependency', ext:'aar') //my AAR dependency
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
}
Run Code Online (Sandbox Code Playgroud)
显然,我将dependency.aar文件放在LibraryProject1的libs目录中
但是,这不起作用.似乎添加的存储库LibraryProject1完全被忽略,并且本地"libs"文件夹不包含在存储库中,导致编译失败.
如果我从添加该存储库中App1的build.gradle它的工作原理,但我不想这样做,这是LibraryProject1需要的AAR文件,而不是App1.
我怎样才能做到这一点??
当我尝试在其他项目中使用导出的android库项目(aar格式)时.我收到以下错误.
> "Could not find class 'com.manish.core.helper.RegistrationHelper$1'"
> "Could not find class 'com.manish.core.helper.RegistrationHelper$2'"
> "Could not find class 'com.manish.core.helper.RegistrationHelper$3'"
> "Could not find class 'com.manish.core.helper.RegistrationHelper$4'"
Run Code Online (Sandbox Code Playgroud)
在aar文件中有一个文件"classes.jar",它包含所有类文件,但我不明白错误的原因.
我正在使用android studio在build目录中生成的aar文件.我也在apply plugin: 'com.android.library'gradle文件中添加了.
所有这些错误仅适用于匿名和静态类.
我的gradle文件:
apply plugin: 'com.manish.application'
android {
compileSdkVersion 22
buildToolsVersion "23.0.0"
defaultConfig {
applicationId "com.manish.test"
minSdkVersion 10
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
mavenCentral()
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用我的aar-library(一个maven项目,使用Jayway的android-maven-plugin构建)在gradle项目中但是,当我运行时gradle assembleDebug,我遇到以下异常:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/actions/ItemListIntents;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
如果我在项目中搜索该类,Android Studio会找到两个结果:
ListItemIntents (com.google.android.gms.action) play-services-base-7.0.0(classes.jar)ListItemIntents (com.google.android.gms.action) aar-library(classes.jar)运行检查
gradle dependencyInsight --dependency play-services-base --configuration compile我得到:
com.google.android.gms:play-services-base:7.0.0
+--- com.google.android.gms:play-services-gcm:7.0.0
| \--- aar-library:core:1.0.10-SNAPSHOT
| \--- compile
+--- com.google.android.gms:play-services-location:7.0.0
| \--- com.nexse.mobile.betting.core:core:1.0.10-SNAPSHOT (*)
\--- com.google.android.gms:play-services-maps:7.0.0
\--- com.google.android.gms:play-services-location:7.0.0 (*)
(*) - dependencies omitted (listed …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Android开源SDK包,以分发给一定数量的客户。
我知道,创建可分发的Android包以包括源代码,清单,布局XML和其他资源等的最佳方法是创建AAR文件,而我已经使用Android Studio做到了。
理想情况下,然后将通过Maven存储库分发AAR,以允许其他人使用源,以及分发pom.xml列出依赖项的文件。
但是,我不想被迫将AAR上传到公共(甚至是私有)存储库中-我只是想拥有一种通过电子邮件或可下载的ZIP文件简单分发AAR文件的方式。
问题是我的图书馆项目有很多依赖项(都来自Maven和本地项目),AAR本身似乎没有任何内在的支持来列出(甚至捆绑)它们的依赖项,这需要从外部进行处理(我认为?)。
这意味着,当将AAR包含在另一个应用程序中时,java.lang.NoClassDefFoundError无论何时尝试使用AAR的任何依赖项,我最终都会陷入困境。
我发现(不理想的)解决方法是将Maven依赖项复制到的宿主应用程序dependencies部分中build.gradle。这不是很好,因为这是客户集成SDK的额外步骤,并且在管理依赖项层次结构方面还不干净。
对于我具有的项目依赖项,此解决方法也不起作用,因为在构建时将其排除在外。我大概可以将这种依赖关系作为源提供,并要求我的客户将其添加到他们的项目中,我确定它可以正常工作,但这变得更加混乱。
因此,问题是:一个人如何创建一个易于分发的AAR文件,该文件可以在无需存储库的情况下以自动的依赖关系解析方式放入另一个应用程序中?
将Android SDK与gradle构建系统一起使用时,可以将android.aar文件作为子项目包含在内.在aar中,可以提供实现自定义lint检查的lint.jar(Source).
在gradlew build命令行上的项目根目录中执行时,我library.aar会爆炸,lint.jar内部用于lint检查.即使我更新了lint.jar内部library.aar,它也会在lint缓存中更新,并且lint.jar当我gradlew build再次调用时,new 用于检查.
如果我使用Android Studio 1.5中的相同gradle命令构建相同的项目,library.aar则仅在模块导入或IDE启动时展开一次.
lint.jar当我更新library.aar我的子项目并且lint.jarIDE启动中的旧版本仍在使用时,它永远不会更新.
这是一个错误还是我做错了什么?
目前我通过在命令行上执行gradle命令来解决这个问题,但如果Android Studio在这些情况下也可以工作,那将会很好.
我们正在创建一个带有内部接口类的Android库.我们面临的问题是发布版本aar文件中的接口类没有保留方法参数名称.尽管.aar文件工作正常,但在使用自动完成,实现方法等时,这会在编辑器中产生问题.请注意,proguard已禁用.
public class Test {
public interface TestInterface {
void testCallback(int ordernumber, int vendorid);
}
public boolean init(Context context);
}
Run Code Online (Sandbox Code Playgroud)
在调试版本中,类保持正常.但是,在发布版本中,不保留接口方法的参数名称.有趣的是,它保留了类方法的参数名称.我用反编译器验证了这一点.
public class Test {
public interface TestInterface {
void testCallback(int paramInt1, int paramInt2);
}
public boolean init(Context context);
}
Run Code Online (Sandbox Code Playgroud)
我也尝试在buildconfig中设置debuggable标志,没有任何帮助.
将不胜感激任何帮助.
我有一个库项目,它依赖于cordova.jar,它从项目libs目录加载.
我将这个库项目部署为maven nexus.
在应用程序项目中,我依赖于库项目aar(编译...).但是应用程序项目与cordova.jar具有相同的依赖性.
因此,在构建应用程序项目时,我收到此错误:
:transformClassesWithDexForDebug
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/apache/cordova/AuthenticationToken;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:504)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
at com.android.dx.command.dexer.Main.run(Main.java:277)
at com.android.dx.command.dexer.Main.main(Main.java:245)
at com.android.dx.command.Main.main(Main.java:106)
Run Code Online (Sandbox Code Playgroud)
为了解决这个问题,我试图在我的应用程序项目中加载库时排除cordova.jar:
dependencies {
compile ('com.my.library:hybridstory:1.0'){
exclude (group: 'org.apache.cordova')
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.难道我做错了什么?
我的第二个问题是:
将库项目作为aar上传时,是否可以排除/libs/cordova.jar,而不是在应用程序中加载库时排除cordova.jar?我怎么能用这个gradle实现这个目标:
apply plugin: 'com.android.library'
apply plugin: 'maven'
archivesBaseName = 'hybridstory'
group = 'com....'
version = '16.3.0-SNAPSHOT'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 16
targetSdkVersion 22
versionCode 1
versionName version
} …Run Code Online (Sandbox Code Playgroud) 我已成功通过以下方式从dex文件动态加载类
enter code here
File file = getDir("dex", 0);
DexClassLoader dexClassLoader = new DexClassLoader("/data/data/com.example.callerapp/files/test.dex", file.getAbsolutePath(), null, getClassLoader());
try {
Class<Object> _class = (Class<Object>)
dexClassLoader.loadClass("com.example.calledapp.test");
Object object = _class.newInstance();
Method method = _class.getMethod("function");
method.invoke(object);
} catch (Exception e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
但是我想做的是从aar文件动态加载类,如android dev页面所示(DexClassLoader:一个类加载器,它从包含classes.dex条目的.jar和.apk文件中加载类。可以使用执行未作为应用程序一部分安装的代码。)
我在Android Studio中创建了一个库模块(“ testlibrary”),在该库模块中创建了Test.java(我想在调用方应用中动态加载的内容),并通过Gradle Project-> Excute Gradle Task创建了一个aar文件
如何通过dexclassloader在以这种一般方式创建的aar文件中动态加载类?我已通过提供商将aar文件从CalledApp移到CallerApp
还是创建aar文件的过程错误?在运行期间,出现错误消息
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: java.lang.ClassNotFoundException: Didn't find class "com.example.calledlibrary.Test" on path: DexPathList[[zip file "/data/data/com.example.callerapp/files/testlibrary.aar"],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
02-10 09:43:48.744 16487-16487/com.example.callerapp W/System.err: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
02-10 09:43:48.744 …Run Code Online (Sandbox Code Playgroud)