3

我整天都在用头撞墙,试图弄清楚这一点。我正在尝试创建一个 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 中包含本机工件?

希望我已经足够清楚了,我愿意就如何改进这个问题提出建议。谢谢!

4

0 回答 0