Việc thêm các tệp .aar cục bộ vào bản dựng Gradle bằng cách sử dụng phẳng FlatDirs không hoạt động


159

Tôi biết câu hỏi này: Thêm tệp .aar cục bộ vào bản dựng lớp của tôi nhưng giải pháp không hiệu quả với tôi.

Tôi đã thử thêm tuyên bố này vào cấp cao nhất của build.gradletệp của mình :

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

Tôi cũng đã đặt slidingmenu.aartệp vào /libsvà tham chiếu nó trong dependenciesphần: compile 'com.slidingmenu.lib:slidingmenu:1.0.0@aar'nhưng nó hoàn toàn không hoạt động.

Tôi đã cố gắng compile files('libs/slidingmenu.aar')như vậy nhưng không có may mắn.

Tôi đang thiếu gì? Có ý kiến ​​gì không?

Studio Android PS 0.8.2


1
FlatDirs + compile (tên: 'libname', ext: 'aar') hoạt động với tôi trên Android Studio 8.2.0, + gradle 1.12. Vì vậy, nó phải là một cái gì đó sai với tập tin xây dựng của bạn. Kiểm tra thêm một lần nữa hoặc đăng thêm mã
Hơn

Câu trả lời:


293

Dựa trên câu trả lời của Josiah, đây là cách tôi làm cho nó hoạt động.

Làm theo hướng dẫn của anh ấy (đang chỉnh sửa) ( Tệp -> Mới-> Mô-đun mới -> Nhập .JAR / .AAR ) và nhập .AAR của bạn.

Sau đó, trong dự án build.gradle của bạn (không phải cấp cao nhất, phần dưới 'ứng dụng') thêm phần sau (trong phần phụ thuộc):

dependencies {
    compile project(':Name-Of-Your-Project')
}

Lưu ý Name-Of-Your-Project phải khớp với tên của thư mục đã được thêm sau khi bạn nhập tệp AAR (ở cùng cấp độ với app/.ideathư mục cấp cao nhất). Hay nói cách khác ...

Ứng dụng của tôi
  .ý tưởng
  ứng dụng
  build.gradle (đây là nơi để thêm dự án biên dịch (': ProjectName') vào phần phụ thuộc)
  ProjectName (được thêm tự động sau khi nhập, khớp với tên tệp aar của bạn)
  xây dựng
  lớp
  Vân vân

Điều này làm việc cho tôi chạy Android Studio 0.8.0. Đừng quên đồng bộ hóa lớp (sử dụng nút thanh công cụ hoặc trong Tệp-> Đồng bộ hóa ) sau khi bạn thực hiện việc này.

(Cám ơn Josiah vì đã giúp tôi đi đúng hướng)

(Lưu ý: trước đó, tôi đã thử thêm nó vào thư mục libs, cố gắng thao tác ở cấp cao nhất build.gradlevà cấp ứng dụng build.gradle, nhưng không có cái nào hoạt động cho các tệp aars của tôi - jar sẽ hoạt động tốt, nhưng không phải là tệp aar)


1
Rất tiếc! Điều này đã lừa, cảm ơn bạn đã giải thích chi tiết. Bên dưới trình duyệt nhập chính, thực hiện tương tự như được mô tả trên trang web Công cụ: "Một tùy chọn khác là tạo một dự án con Gradle mới và để tạo ra tác phẩm được xuất bản của dự án này là tệp jar hoặc aar mà bạn muốn sử dụng lại. có thể chỉ cần có các dự án con Gradle khác phụ thuộc vào dự án con mới này. Trong dự án con mới này, chỉ cần tạo một build.gradle với các mục sau: configureations.create ("default") artifacts.add ("default", file ('somelib.aar')) "
Alexey Dmitriev

Tôi đang gặp lỗi: Error:(25, 0) Required keys [path] are missing from map {name=mylibrary-debug}.nếu tôi sử dụng compile project(name:'mylibrary-debug').. Tôi bị thiếu gì?
MysticMagicϡ

2
Các plugin gradle gần đây đã phá vỡ điều này. Giải pháp tại đây: stackoverflow.com/a/28816265/560600
Sky Kelsey

1
Hãy cũng làm sạch Build sau tất cả các bước trên.
Quảng cáo

1
Trong dòng compile project(':Name-Of-Your-Project'), tôi đã thay thế Name-Of-Your-Projectbằng tên của tệp .aar của tôi (không có .aarphần mở rộng). Va no đa hoạt động.
Sufian

190

Cập nhật : Như @ amram99 đã đề cập, vấn đề đã được khắc phục trong những phiên bản của Android Studio v1.3.

Đã kiểm tra và xác minh với thông số kỹ thuật dưới đây

  • Studio Android v1.3
  • plugin gradle v1.2.3
  • Lớp v2.4

Những gì làm việc bây giờ

  • Bây giờ bạn có thể nhập tệp aar cục bộ thông qua tùy chọn Tệp> Mới> Mô-đun mới> Nhập .JAR / .AAR Gói trong Android Studio v1.3

  • Tuy nhiên, câu trả lời dưới đây vẫn đúng và hiệu quả bất kể những thay đổi của Android Studio vì điều này dựa trên kịch bản phân loại.


Câu trả lời cũ: Trong một bản cập nhật gần đây, mọi người trong Android đã phá vỡ việc bao gồm các tệp aar cục bộ thông qua tùy chọn trình đơn mô-đun mới của Android Studio. Kiểm tra các vấn đề được liệt kê ở đây. Bất kể mọi thứ đi vào và ra khỏi danh sách tính năng của IDE, phương thức dưới đây hoạt động khi làm việc với các tệp aar cục bộ. (Đã thử nghiệm ngày hôm nay):

Đặt tệp aar vào thư mục libs (tạo tệp nếu cần), sau đó, thêm đoạn mã sau vào build.gradle của bạn:

dependencies {
   compile(name:'nameOfYourAARFileWithoutExtension', ext:'aar')
 }
repositories{
      flatDir{
              dirs 'libs'
       }
 }

1
Đây là câu trả lời đúng và cách làm mới nhất. Vui lòng upvote câu trả lời này;)
lmo

Tôi đã sao chép mã của bạn, nhưng bạn có biết tại sao tôi có thể gặp lỗi này không? "Lỗi: Đã xảy ra sự cố khi định cấu hình dự án ': app'.> Artifact 'signalr-client-sdk-android-release.aar (: signalr-client-sdk-android-release :)' không tìm thấy. Tìm kiếm ở các vị trí sau: jitpack.io//signalr-client-sdk-android-release// khăn "
chập chững

10
Phần này repositoriesđi theo một cách khác build.gradle để làm việc - phần toàn cầu. Phần dependenciesđi trong mô-đun build.gradle. Đó là lý do tại sao tôi gặp lỗi.
chập chững

@toddmo Vì vậy, câu trả lời của tôi thực sự áp dụng cho các tệp AAR cục bộ. tức là một tập tin .aar nằm trong thư mục libs của bạn.
Nishant.

1
Cảm ơn. Phiên bản cũ không hoạt động với tôi, cách nhập mới đã hoạt động rất tốt! Lớp 3.5, Groovy 2.4.10
Arnold Schrijver

26

Chỉnh sửa: Cách chính xác (hiện tại) để sử dụng tệp AAR cục bộ làm phụ thuộc bản dựng là sử dụng trình hướng dẫn nhập mô-đun (Tệp | Mô-đun mới | Nhập .JAR hoặc gói .AAR) sẽ tự động thêm .aar làm mô-đun thư viện trong dự án của bạn.

Câu trả lời cũ

Thử cái này:

allprojects {
  repositories {
    jcenter()
    flatDir {
      dirs 'libs'
    }
  }
}

...

compile(name:'slidingmenu', ext:'aar')

1
Cũng không hoạt động ... Có vẻ như đó là một lỗi đã biết chưa được sửa: code.google.com/p/android/issues/detail?id=55863
Alexey Dmitriev

Tôi đã làm như bạn nói trong chỉnh sửa nhưng cuối cùng không có gì được thêm vào. Trong trình hướng dẫn tôi đã chọn đường dẫn đến tệp AAR, tên mô-đun được chỉ định. Sau khi nhấp vào Kết thúc, đó là đồng bộ hóa các tệp Gradle nhưng không có tệp mới hoặc bất kỳ dòng nào trong build.gradle xuất hiện (không có thay đổi nào trong bản sao làm việc Git của tôi). Tôi đã thử với cả tệp AAR và JAR với cùng kết quả. (Tôi đang sử dụng Android Studio 0.8.1)
Alexey Dmitriev

3
Câu trả lời cũ này thực sự có tác dụng với tôi miễn là tôi bao gồm flatDir { dirs 'libs' }khối như được đề cập trong OP sử dụng AS 8.13 /
Lớp

4
Tôi đã nhập tệp .aar bằng phương thức nhập mới. Nhưng tôi không thể thấy tên lớp của thư viện khi tôi nhập một nửa tên và nhấn ctrl + dấu cách. Vì vậy, nó vẫn không xem xét thư viện. Bất kỳ ý tưởng?
MysticMagicϡ

1
Phiên bản chỉnh sửa hoạt động tốt cho Android Studio 1.2.1.1. Không có kịch bản gradel khác phải được thực hiện. Bạn có thể tạo một mô-đun mới như đã giải thích ở trên. Trong hộp thoại 'Tạo mô hình mới', chọn đường dẫn đến tệp aar thư viện của bạn, ví dụ MyLib \ myl Library \ build \ output \ aar. AS sẽ sao chép tập tin vào một thư mục cục bộ mới. Xây dựng lại dự án ứng dụng của bạn và mô-đun thư viện mới sẽ được hiển thị trong chế độ xem dự án. Bây giờ bạn có thể thêm mô-đun thư viện làm phụ thuộc cho mô-đun ứng dụng của mình (ví dụ: 'ứng dụng') trong cấu trúc dự án: Cấu trúc dự án | mô-đun | ứng dụng | phụ thuộc | Thêm | Mô đun phụ thuộc.
Christian Schulzendorff

15

Tôi đã làm việc này trên Android Studio 2.1. Tôi có một mô-đun gọi là "Native_Ads" được chia sẻ trên nhiều dự án.

Đầu tiên, tôi đã tạo một thư mục trong mô-đun Native_ads của mình với tên 'aars' và sau đó đặt tệp aar vào đó.

Cấu trúc thư mục:

libs/
aars/    <-- newly created
src/
build.gradle
etc

Sau đó, những thay đổi khác:

Tập tin cấp độ cao nhất:

allprojects {
    repositories {
        jcenter()
        // For module with aar file in it
        flatDir {
            dirs project(':Native_Ads').file('aars')
        }
    }
}

Tệp build.gradle của mô-đun ứng dụng: - không thay đổi

Tệp cài đặt.gradle (để bao gồm mô-đun):

include ':app'
include 'Native_Ads'
project(':Native_Ads').projectDir = new File(rootProject.projectDir, '../path/to/Native_Ads')

Tập tin lớp cho mô-đun Native_Ads:

repositories {
    jcenter()
    flatDir {
        dirs 'aars'
    }
}
dependencies {
    compile(name:'aar_file_name_without_aar_extension', ext:'aar')
}

Đó là nó. Làm sạch và xây dựng.


Cũng hoạt động cho nhiều tệp aar trong 'Native_Ads'. Giải pháp rất tốt!
Christian Schulzendorff

8

Cách dễ nhất bây giờ là thêm nó dưới dạng một mô-đun

nhập mô tả hình ảnh ở đây

Điều này sẽ tạo ra một mô-đun mới chứa tệp aar, vì vậy bạn chỉ cần đưa mô-đun đó làm phụ thuộc sau đó


Bạn có thể có một ý tưởng về lý do tại sao nextnút của tôi chuyển sang màu xám trên Create New Modulehộp thoại sau khi chọn Nhập JAR/AAR Packagekhông?
Kevin Crain

1
Lưu ý rằng tôi đã chọn tệp .aar và đặt tên cho nó
Kevin Crain

Tôi đã tìm ra lý do, IDE đang kiểm tra đường dẫn để xác định xem .aartập tin có nằm trong thư mục dự án hay không, tôi chỉ cần đặt .aarmáy tính để bàn của mình và thử lại và nó hoạt động, cảm ơn vì giải pháp của bạn!
Kevin Crain

Có thể một câu hỏi ngớ ngẩn, nhưng liên quan đến so you just need to include that module as a dependency afterwards- làm thế nào để bạn làm điều đó?
boltup_im_coding

1
@Marian Klühspies Tôi thấy bây giờ, tôi không chắc chắn nếu có includetrong đó settings.gradleđược cho là đủ. Tôi đã làm cho nó hoạt động. Cảm ơn!
boltup_im_coding

7

Đây là cấu trúc của tôi và cách tôi giải quyết điều này:

Dự án / ứng dụng / libs / mylib-1.0.0.aar

MyProject / app / myModulesFolder / myLibXYZ

Trên build.gradle

từ Dự án / ứng dụng / myModulesFolder / myLibXYZ

Tôi đã đặt cái này:

repositories {
   flatDir {
    dirs 'libs', '../../libs'
  }
}
compile (name: 'mylib-1.0.0', ext: 'aar')

Hoàn thành và hoạt động tốt, XYZ mô hình con của tôi phụ thuộc vào thư viện somel từ mô-đun chính.


5

Bạn có thể làm theo cách này. Nó cần phải đi trong định dạng maven:

repositories {
  maven { url uri('folderName')}
}

Và sau đó AAR của bạn cần đi theo cấu trúc thư mục cho id nhóm "com.example":

folderName/
  com/
    example/
       verion/
          myaar-version.aar

Sau đó tham chiếu như một phụ thuộc:

compile 'com.example:myaar:version@aar'

Trong trường hợp versionlà phiên bản của tập tin aar của bạn (ví dụ, 3.0, vv)


3

Đối với bất kỳ ai gặp vấn đề này kể từ Android Studio 1.4, tôi đã giải quyết nó bằng cách tạo một mô-đun trong dự án có chứa 2 thứ.

  1. build.gradle với các nội dung sau:

    configurations.create("default")

    artifacts.add("default", file('facebook-android-sdk-4.7.0.aar'))

  2. tệp aar (trong ví dụ này 'facebook-android-sdk-4.7.0.aar')

Sau đó bao gồm thư viện mới như là một phụ thuộc mô-đun. Bây giờ bạn có thể sử dụng một aar được xây dựng mà không bao gồm các nguồn trong dự án.

Tín dụng cho Facebook cho vụ hack này. Tôi đã tìm thấy giải pháp trong khi tích hợp SDK Android vào một dự án.


Bạn đã tạo ra loại mô-đun nào? Tệp> Mới> Mô-đun mới>?
Al Lelopath

Trong trường hợp này, loại mô-đun là "Thư viện Android" nếu bạn đang sử dụng GUI để tạo mô-đun. Bạn có thể tạo một mô-đun hiện có vào thư viện Android bằng cách sửa đổi build.gradle của mô-đun. đổi apply plugin: 'com.android.application'thànhapply plugin: 'com.android.library'
Victor Ude

Có thể thêm nhiều aars vào một mô-đun không? Nếu không, tôi sẽ cần phải tạo hơn 10 mô-đun lớp chỉ để bao gồm các tệp aar của mình
Marian Klühspies

@ MarianKlühspies rất nhiều đã thay đổi kể từ khi tôi viết câu trả lời này. Tôi khuyên bạn nên thử tài liệu chính thức để bao gồm một aar trong dự án của bạn: developer.android.com/studio/projects/
Victor Ude

3

Trong trường hợp của tôi, không có câu trả lời nào ở trên có hiệu quả! kể từ khi tôi có các sản phẩm khác nhau, chỉ cần thêmrepositories{ flatDir{ dirs 'libs' } }

đã không làm việc! Tôi đã kết thúc với việc chỉ định vị trí chính xác của thư mục libs :

repositories{
flatDir{
    dirs 'src/main/libs'
}

}

Đoán người ta nên giới thiệu FlatDirs như thế này khi có các sản phẩm khác nhau trong build.gradle


2

Trong trường hợp của tôi, tôi chỉ cần đặt tệp aar vào libs và thêm

dependencies { ... api fileTree(dir: 'libs', include: ['*.aar']) ... }

trong build.gradle và nó hoạt động. Tôi nghĩ nó tương tự với sự phụ thuộc được tạo mặc định:

implementation fileTree(dir: 'libs', include: ['*.jar'])


"Api fileTree (dir: 'libs', bao gồm: ['* .aar])" hoạt động rất tốt. Nó không hoạt động nếu tôi sử dụng "thực hiện" thay vì "api". Tôi không bao giờ có thể khiến giải pháp của Victor Ude hoạt động với nhiều aar. Một cái nhìn sâu sắc bổ sung: nếu bạn đang sử dụng tài nguyên (chẳng hạn như bố cục), hãy đảm bảo rằng các aar mà bạn liên kết không chứa tài nguyên có cùng tên như trong apk của bạn. Nó có thể cung cấp cho bạn một lỗi mà nó không thể tìm thấy một trong các id trong bố cục. Vấn đề là nó sử dụng không gian tên sai cho id trong bố cục aar.
Tom Rutchik

1

Dòng này bao gồm tất cả aarjarcác tệp từ libsthư mục:

implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs/')

0

Thêm bên dưới trong dự án triển khai tệp lớp ứng dụng (đường dẫn: ': tên dự án')


0

Nếu bạn đã sử dụng DSL của Kotlin Gradle, phương án thay thế cho việc sử dụng nó theo cách này:

Đây là cấu trúc dự án của tôi

|-root
|----- app
|--------- libs // I choose to store the aar here
|-------------- my-libs-01.aar
|-------------- my-libs-02.jar
|--------- build.gradle.kts // app module gradle
|----- common-libs // another aar folder/directory
|----------------- common-libs-01.aar
|----------------- common-libs-02.jar
|----- build.gradle.kts // root gradle

Của tôi app/build.gradle.kts

  1. Sử dụng phương pháp đơn giản với fileTree
// android related config above omitted...

dependencies {
    // you can do this to include everything in the both directory
    // Inside ./root/common-libs & ./root/app/libs
    implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar", "*.aar"))))
    implementation(fileTree(mapOf("dir" to "../common-libs", "include" to listOf("*.jar", "*.aar"))))
}
  1. Sử dụng phương pháp tương tự như tìm nạp từ kho lưu trữ cục bộ / từ xa với flatDirs
// android related config above omitted...

repositories {
    flatDir {
        dirs = mutableSetOf(File("libs"), File("../common-libs") 
    }
}

dependencies {
   implementation(group = "", name = "my-libs-01", ext = "aar")
   implementation(group = "", name = "my-libs-02", ext = "jar")

   implementation(group = "", name = "common-libs-01", ext = "aar")
   implementation(group = "", name = "common-libs-02", ext = "jar")
}

Điều groupcần thiết, do bắt buộc (không phải tùy chọn / có giá trị mặc định) trong kotlin implementation, xem bên dưới:

// Filename: ReleaseImplementationConfigurationAccessors.kt
package org.gradle.kotlin.dsl

fun DependencyHandler.`releaseImplementation`(
    group: String,
    name: String,
    version: String? = null,
    configuration: String? = null,
    classifier: String? = null,
    ext: String? = null,
    dependencyConfiguration: Action<ExternalModuleDependency>? = null
)

Tuyên bố miễn trừ trách nhiệm: Sự khác biệt khi sử dụng flatDirsphương pháp số 1 ​​& số 2, tôi vẫn không biết nhiều, bạn có thể muốn chỉnh sửa / nhận xét cho câu trả lời này.

Người giới thiệu:

  1. https://stackoverflow.com/a/56828958/3763032
  2. https://github.com/gradle/gradle/issues/9272
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.