我有一个由2个模块组成的Android库:
Project Root
+-- moduleA
| +-- src
| \-- build.gradle
|
+-- moduleB
| +-- src
| \-- build.gradle
|
+-- build.gradle
+-- settings.gradle
Run Code Online (Sandbox Code Playgroud)
settings.gradle
include ':moduleB', 'moduleA'
Run Code Online (Sandbox Code Playgroud)
moduleA /的build.gradle
apply plugin: 'com.android.library'
...
dependencies {
compile project(':moduleB')
}
Run Code Online (Sandbox Code Playgroud)
moduleB /的build.gradle
apply plugin: 'com.android.library'
...
Run Code Online (Sandbox Code Playgroud)
当我尝试使用gradle生成的AAR时,不包括moduleB的资源.我试图将两个AAR推送到maven本地,但结果相同.
如果我将moduleA的类型更改为application而不是library,则生成的APK包含正确的资源.
我应该怎么做才能获得包含两个模块资源的AAR?
我使用的是Android Studio 1.2
我创建了一个私有库,我想在另一个应用程序中使用它.
要使用它我创建一个AAR文件,但这个AAR不起作用.我的库中有一个对AAR文件的依赖.
AAR文件不依赖?
如果我使用jar,我包括创建所有依赖项,项目工作正常.
注意 :
我知道如何导入AAR文件.问题是在AAR中使用AAR ..
谢谢.
我正在开发一个内部库(我们称之为"banana_lib"),它将包含在Android应用程序项目中.我想以.aar文件的形式向客户端提供此库.
我的图书馆依赖于另一个图书馆(让我们说Gson).如果我能帮助它,我想避免将这种依赖的类捆绑到我的库中("胖罐","超级罐"方法).
我知道我可以要求我的库的用户将依赖项包含在应用程序的build.gradle文件中:
dependencies {
compile 'com.google.code.gson:gson:2.2.4'
compile files('libs/banana_lib.aar')
Run Code Online (Sandbox Code Playgroud)
}
但我不想让我的库的用户在应用程序的build.gradle文件中包含我的库的依赖项给图书馆用户带来负担.
问题: 有没有办法让gradle自动解析/包含.aar文件的依赖项?有什么办法可以让.aar库的用户尽量减少工作量?我需要提供一对.aar和.pom文件吗?我的主要目标是减少这个库的用户必须做的事情.我觉得图书馆应该理想地定义它的所有依赖项,gradle应该只在后台解决它们.
换一种略有不同的方式:有没有办法允许客户端/用户通过以下方式包含(内部!)库(具有外部依赖性):1.)将.aar文件添加到构建中.2.)将它包含在build.gradle中.
如果有其他解决方案可以将库的用户/包含者必须做的工作量保持在最低限度,那么这也很有趣:)
非常感谢!
我正在为我的项目添加一个库.它打包成一个AAR.但它有一个BroadcastReceiver听取BOOT_COMPLETED启动服务.我不想在我的应用程序中出现此行为.我希望它能在应用程序启动时启动.(这部分已经完成AAR,我假设用户强制停止了应用程序).
有没有办法修改他们的清单; 或者指定Gradle不合并他们的清单(我认为我必须在我自己的清单中宣布他们的活动); 或者覆盖他们的清单,并android:enabled="false为BroadcastReceiver"?
我也希望在清单中执行此操作,或者Gradle因为如果我以编程方式执行此操作,并且如果他们安装应用程序但从未打开它,那么下次用户重新启动手机时,库服务将自动启动.
在我的Android Studio Gradle项目中,我使用了几个库,而一个库应该使用本地AAR文件作为依赖项.我使用流行的解决方案将AAR文件作为依赖项包含在我的库项目中:
flatDir {
dirs 'libs'
}
compile(name: 'aar-library', ext: 'aar')
Run Code Online (Sandbox Code Playgroud)
当我现在尝试同步时,我收到错误消息
无法解决:依赖'aar-library'
在我的主项目中,即使我没有在那里使用/引用AAR文件.如果我只是将AAR文件复制到我的主项目的libs文件夹中也可以.任何的想法?
我写了一些库,它有一部分UI.此外,该库使用其他库.我想提供发布.aar以在任何应用程序中使用此部分UI.
我的图书馆有下一个家属:
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile ('com.android.support:recyclerview-v7:22.2.1'){
exclude group: 'com.android.support', module: 'support-v4'
}
compile 'com.inthecheesefactory.thecheeselibrary:stated-fragment-support-v4:0.10.0'
//Http communication, websockets, etc.
compile 'com.squareup.okhttp:okhttp:2.4.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
//Fonts
compile 'uk.co.chrisjenx:calligraphy:2.1.0'
//Unit tests
testCompile 'junit:junit:4.12'
testCompile 'org.mockito:mockito-core:1.9.5'
//Other
compile ('org.apache.commons:commons-lang3:3.4'){
exclude group: 'org.apache.httpcomponents'
}
//Reactive programmnig
compile 'io.reactivex:rxjava:1.0.13'
compile 'io.reactivex:rxandroid:0.25.0'
compile 'com.github.bumptech.glide:glide:3.6.1'
Run Code Online (Sandbox Code Playgroud)
当我构建.aar一切都很好,但当我将其包含.aar在另一个应用程序中时,我有下一个问题:
1). ./gradlew clean build
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
/home/user/projects/MainApp/app/build/intermediates/exploded-aar/com.my.sdk/SDK/0.0.1/res/values/values.xml:78:21-29:找不到匹配的资源给定的名称:attr'fontPath'.
:app:processDebugResources FAILED
解决方案非常简单 - 添加到MainApp/app/build.gradle下一行: …
android android-library android-gradle-plugin aar maven-publish
回到历史
我有这个aar开发人员可以正常使用的android库
compile 'com.companyname.sdk:android-sdk:2.x'
Run Code Online (Sandbox Code Playgroud)
现在我们正在从头开始重新编写库来创建V3.
在这次重新组织中,我们设法将lib分解为模块.所以可以说在V3上我们会有以下工件
compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....
Run Code Online (Sandbox Code Playgroud)
这将在gradle结构上给出以下模块:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- sdk (aka: core)
|- extra_1
|- extra_2
|- extra_ ... etc
Run Code Online (Sandbox Code Playgroud)
每个extra在他们的模块build.gradle有一个provided (':sdk'),这样可以使用一切从sdk模块,但不实际编译它自己内部.
但我还想为现有的主机应用程序提供一个简单的迁移路径.意思是,我想在V3上也有以下的神器组合core和extra_1(它基本上是V2上的当前内容).
compile 'com.companyname.sdk:android-sdk:3.0.0'
Run Code Online (Sandbox Code Playgroud)
这一切听起来都很理论,但是我很难把它想象成一个gradle结构,让我轻松导出所有这些.
我想要实现的目标
所以我希望能够在构建期间生成以下工件:
android-sdk包括core和extra_1coreextra_1我试过了什么
添加一个名为的额外模块legacy,com.android.library无需任何代码即可应用,并compile project为其他模块添加.它会生成一个空的aar
使用两个模块中的sourceSets添加核心/旧版buildTypes.从未生成2aar …
我正在开发一个.AAR安卓库,我想用自己的密钥签署已发布的工件,以便我可以确定是否已经发布了具有相同名称和功能的假aar.
通知1:
我希望能够以编程方式检查我的库的真实性,即使是伪造的库,也只是伪造我的aar文件的一部分功能.
通知2:
我不打算将这个aar发布到maven,sonatype或任何其他公共存储库中.因此,我将签署一个典型的发布流程,如签署apk文件.
我希望在库(AAR)中使用Firebase Analytics.使用Android Gradle Plugin 3.0.1和Gradle 4.1.我已经包含了firebase依赖项api,但是,当打包到AAR中时,缺少依赖项,并且它在运行时在使用应用程序中崩溃(它不是该应用程序中的"模块").这次崩溃是由于一个java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.analytics.FirebaseAnalytics"例外.
图书馆模块: build.gradle
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation "com.android.support:support-annotations:$supportLibraryVersion"
implementation "com.android.support:appcompat-v7:$supportLibraryVersion"
api 'com.google.firebase:firebase-core:11.6.0'
}
Run Code Online (Sandbox Code Playgroud)
我可以通过implementation "<firebase>"在消费应用程序中包含该行来解决这个问题,但是,我理解这api将作为对消费者的传递依赖性公开.
我不想强制消费者应用程序实现Firebase,并且在没有设置google-play-services.json文件,插件和app/build.gradle更改时它是有用的(假设我有消费者的实现行).
使用库模块中的任何一个implementation <firebase>或api <firebase>在同一个项目中,应用程序包括它:implementation project(':mylib')它运行正常,只有在使用AAR时才会出现问题.
另外请注意,创建AAR的模块包含本机代码.
运行Unity应用程序时,我遇到了类错误。我有一个本机代码库,我将其编写为aar。我刚刚更新了一些代码来支持Android 8上的本地通知,并且使用了Android X“ Worker”类。我的aar编译正常,但我想我缺少要包含在Unity项目中的库。我应该添加哪个库?
错误是
06-05 10:57:52.970: E/AndroidRuntime(21759): FATAL EXCEPTION: IntentService[com.help.stressfree.localnotifications.NotificationService]
06-05 10:57:52.970: E/AndroidRuntime(21759): Process: com.help.stressfree, PID: 21759
06-05 10:57:52.970: E/AndroidRuntime(21759): java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/Data$Builder;
06-05 10:57:52.970: E/AndroidRuntime(21759): at com.help.stressfree.localnotifications.NotificationService.ScheduleNotification(NotificationService.java:99)
06-05 10:57:52.970: E/AndroidRuntime(21759): at com.help.stressfree.localnotifications.NotificationService.onHandleIntent(NotificationService.java:82)
06-05 10:57:52.970: E/AndroidRuntime(21759): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68)
06-05 10:57:52.970: E/AndroidRuntime(21759): at android.os.Handler.dispatchMessage(Handler.java:105)
06-05 10:57:52.970: E/AndroidRuntime(21759): at android.os.Looper.loop(Looper.java:164)
06-05 10:57:52.970: E/AndroidRuntime(21759): at android.os.HandlerThread.run(HandlerThread.java:65)
06-05 10:57:52.970: E/AndroidRuntime(21759): Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.work.Data$Builder" on path: DexPathList[[zip file "/data/app/com.help.stressfree-FN_ED1fyI9LY4tcsB1RWqQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.help.stressfree-FN_ED1fyI9LY4tcsB1RWqQ==/lib/arm, /data/app/com.help.stressfree-FN_ED1fyI9LY4tcsB1RWqQ==/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib]]
06-05 10:57:52.970: E/AndroidRuntime(21759): at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
06-05 …Run Code Online (Sandbox Code Playgroud)