zj344842379 2024-04-05 10:45 采纳率: 100%
浏览 56
已结题

Android引用第三方库时如何修改flatDir的代码?

问题的起因是我的Flutter软件引用了本地的库(OtherModule的aar文件)。
在Android目录下的构建是

RootDirectory/
├── CurrentProject/
│   ├── app/
│   │   └── build.gradle
│   └── settings.gradle
└── OtherModule/
    └── build.gradle
        └──android
            └──Libs
                └──OtherModule1.aar
                └──OtherModule2.aar

本来在老版本中OtherModule的build.gradle中

repositories {
  flatDir {
            dirs project(':OtherModule').file('libs')
          }
}
...
implementation(name: 'OtherModule1.aar', ext: 'aar')
implementation(name: 'OtherModule2.aar', ext: 'aar')

这样引用没有问题 但是随着版本更新报错

WARNING: Using flatDir should be avoided because it doesn't support any meta-data formats.

为了解决这个问题 我修改了OtherModule的build.gradle中的内容

sourceSets {
   main {
         jniLibs.srcDirs += project(':OtherModule').file('libs')
        }
}
...
implementation(files("libs/OtherModule1.aar"))
implementation(files("libs/OtherModule2.aar"))

引起了

Execution failed for task ':OtherModule:bundleDebugLocalLintAar'.
> Error while evaluating property 'hasLocalAarDeps' of task ':OtherModule:bundleDebugLocalLintAar'.
   > Direct local .aar file dependencies are not supported when building an AAR. The resulting AAR would be broken because the classes and Android resources from any local .aar file dependencies would not be packaged in the resulting AAR. Previous versions of the Android Gradle Plugin produce broken AARs in this case too (despite not throwing this error). The following direct local .aar file dependencies of the :OtherModule project caused this error ....

为了解决这个问题我又将引用的地方修改成了

compileOnly(files("libs/OtherModule1.aar"))
compileOnly(files("libs/OtherModule2.aar"))

虽然不报错了 但是编译之后OtherModule1.aar,OtherModule2.aar的引用并不能使用了。。
原因应该是 使用compileOnly的时候 没有参与编译到APK中。。所以编译成功的APK不能使用了。
我需要怎么解决这些问题?
如果可以尽量写详细一些。。我没修改过build.gradle相关的编译文件。。不太了解他们直接的构造关系。

  • 写回答

19条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-05 10:45
    关注

    引自免费微信小程序:皆我百晓生

    首先,您遇到的问题在于使用了flatDir作为依赖仓库,并尝试将其应用于AAR库的引用,但这种方式在新版本Gradle插件中已不再推荐,因为它不支持元数据格式。接下来,我将逐步指导您如何正确地引用本地AAR文件,并解决当前遇到的问题。

    步骤一:移除不必要的改动

    撤销对OtherModule/build.gradle中关于sourceSetsjniLibs.srcDirs的更改,恢复至初始状态,即保留原来的flatDir配置和implementation方式引用AAR文件:

    repositories {
      flatDir {
        dirs project(':OtherModule').file('libs')
      }
    }
    
    dependencies {
      implementation(name: 'OtherModule1.aar', ext: 'aar')
      implementation(name: 'OtherModule2.aar', ext: 'aar')
    }
    

    步骤二:创建新的module(或调整现有module)以封装AAR

    为了避免直接引用本地AAR导致的警告与潜在问题,建议创建一个新的Android Library module(例如命名为LocalAarWrapper),并在这个module中引入您的AAR文件。这样做的好处是可以遵循Gradle的最佳实践,同时确保AAR文件被正确打包进最终的APK。

    1. RootDirectory下创建一个新的module(如LocalAarWrapper):
    RootDirectory/
    ├── CurrentProject/
    │   ├── app/
    │   │   └── build.gradle
    │   └── settings.gradle
    ├── LocalAarWrapper/
    │   ├── build.gradle
    │   └── libs/
    │       ├── OtherModule1.aar
    │       └── OtherModule2.aar
    └── OtherModule/
        └── build.gradle
    
    1. CurrentProject/settings.gradle中包含新module:
    include ':app'
    include ':OtherModule'
    include ':LocalAarWrapper'
    
    // 如果需要,添加project路径映射(通常情况下不需要)
    // project(':LocalAarWrapper').projectDir = new File(rootProject.projectDir, '../LocalAarWrapper')
    
    1. 编辑LocalAarWrapper/build.gradle,添加以下内容:
    apply plugin: 'com.android.library'
    
    android {
        // 设置对应的minSdkVersion、targetSdkVersion等信息,与原AAR保持一致
        defaultConfig {
            minSdkVersion 21
            targetSdkVersion 30
            versionCode 1
            versionName "1.0"
        }
    
        // 将AAR文件添加为jar依赖
        dependencies {
            implementation files('libs/OtherModule1.aar')
            implementation files('libs/OtherModule2.aar')
        }
    }
    
    // 可选:如果AAR包含资源,需要额外处理
    // android.sourceSets.main.jniLibs.srcDirs 'libs'
    

    步骤三:在主项目中引用新module

    编辑CurrentProject/app/build.gradle,将对OtherModule的依赖替换为对新创建的LocalAarWrapper模块的依赖:

    dependencies {
        implementation project(':LocalAarWrapper')
        // 移除原有的对OtherModule的依赖
        // implementation project(':OtherModule')
    }
    

    通过以上步骤,您已经成功将本地AAR文件封装到一个独立的Android Library module中,避免了直接引用AAR带来的问题。现在,您可以清理并重新构建项目,确保所有依赖正常工作且无警告。如果您在执行过程中遇到任何问题,请随时向我反馈。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(18条)

报告相同问题?

问题事件

  • 系统已结题 4月16日
  • 已采纳回答 4月8日
  • 赞助了问题酬金15元 4月5日
  • 修改了问题 4月5日
  • 展开全部

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?