我整天都在用头撞墙,试图弄清楚这一点。我正在尝试创建一个 android 库 X 作为 aar 和 apklib。这样做的原因是我们有一个使用 android maven 插件构建的 android 应用程序并且应该使用 apklib,但是其他人将在项目 Z 中使用该库,使用 gradle,因此需要 aar。
我正在尝试构建的库具有本机依赖项,我们在让该库为这两个项目工作时遇到了严重的问题。根据我们如何更改库 X 的 pom 文件,一个或另一个失败。
让我给出一些伪构建文件的更多上下文,不幸的是我不能分享原始文件。
库 X 的 pom.xml,使用 android maven 插件构建
<project ... >
...
<groupId>com.library</groupId>
<artifactId>myLibrary</artifactId>
<version>0.0.1</version>
<packaging>apklib</packaging>
...
<dependencies>
<dependency>
<groupId>com.native</groupId>
<artifactId>myNativeDependency</artifactId>
<version>2.0.0</version>
<classifier>armeabi-v7a</classifier>
<scope>runtime</scope>
<type>so</type>
</dependency>
...
</dependencies>
<build>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>4.0.0-rc.2</version>
<configuration>
<androidManifestFile>${project.basedir}/AndroidManifest.xml</androidManifestFile>
<resourceDirectory>${project.basedir}/res</resourceDirectory>
<mergeManifests>true</mergeManifests>
<sdk>
<path>${env.ANDROID_SDK_HOME}</path>
<platform>${android.platform.version}</platform>
</sdk>
</configuration>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
打包为 apklib 的库 X 将作为依赖项添加到 maven 项目中,如下所示:
Maven 项目 Y,pom.xml:
...
<dependencies>
...
<dependency>
<groupId>com.library</groupId>
<artifactId>myLibrary</artifactId>
<version>0.0.1</version>
<type>apklib</type>
</dependency>
</dependencies>
...
Gradle项目Z,引用库X打包为aar,build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'maven'
android {
compileSdkVersion 20
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "com.company"
minSdkVersion 15
targetSdkVersion 20
versionCode 1
versionName "1.0"
}
buildTypes {
release {
runProguard false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile "com.library:myLibrary:0.0.1"
}
鉴于此配置,我们获得的结果是一个正在运行的 maven 项目 Y,它似乎可以毫无问题地解决本机依赖关系,因为 .so 包含在生成的 apk 中。但是,gradle 项目 Z 构建良好,但无法在运行时找到 .so 依赖项。当我探索为库 X 生成的 apklib/aar 时,.so 库不存在。不知何故,maven 项目 Y 知道如何处理这种传递依赖,并且本机库将其转换为生成的 apk,但 gradle 项目无法这样做,并且共享库不会将其放入生成的 apk。
让具有本机依赖项的库在 gradle(作为 aar)和 maven(作为 apklib)项目上工作的正确方法是什么?有什么方法可以强制 maven 在生成的 apklib/aar 中包含本机工件?
希望我已经足够清楚了,我愿意就如何改进这个问题提出建议。谢谢!