2016-05-23 27 views
10

Tôi có một dự án Android với một số phụ thuộc. Hai trong số chúng (hãy gọi chúng là phụ thuộc A và B) có các thư viện gốc (các tệp .so).Android apk - Cách loại trừ tệp .so khỏi phụ thuộc của bên thứ ba bằng cách sử dụng gradle

Phụ thuộc A có các kiến ​​trúc sau: arm64-v8a, armeabi, armeabi-v7a, x86 và x86_64. Phụ thuộc B có các kiến ​​trúc sau: armeabi, x86

Vì vậy, khi ứng dụng của tôi chạy trên thiết bị armeabi-v7a (ví dụ) và phụ thuộc B gọi phương thức gốc, không thể tìm thấy thư viện có liên quan. vì nó không có trong thư mục armeabi-v7a và không tự động quay trở lại armeabi khi thư viện ở đâu).

Có cách nào để giải quyết vấn đề này không? Ví dụ: Tôi có thể thêm một số cấu hình vào tệp build.gradle của mình để thư mục arm64-v8a, armeabi-v7a và x86_64 không được tích hợp vào apk cuối cùng của tôi không?

Tôi đã thử đóng góiOptions/exclude, nhưng không có kết quả: các thư mục trong câu hỏi vẫn còn đó.

Trả lời

18

Hãy thử xây dựng sạch sẽ, tôi đã không và nó vẫn chọn lên các tập tin từ xây dựng trước đó. Tôi đã kết thúc việc xóa ứng dụng/build/folder của mình chỉ để chắc chắn.

android { 
    packagingOptions { 
     exclude 'lib/armeabi-v7a/libSomeLibYouDontWant.so' 
    } 
} 

Đã làm việc cho tôi trên ứng dụng đã bị lỗi trước đó.

Một thay thế sẽ được sử dụng

android{ 
    defaultConfig{ 
     ndk{ 
      abiFilters "armeabi", "x86" 
     } 
    } 
} 

Có một số câu hỏi tương tự mà có thể có ích

Gradle exclude arm64 libs

How to use 32-bit native libraries on 64-bit Android device

+1

Ngoài ra, bạn có thể sử dụng cú pháp sau đây để ** bỏ qua toàn bộ thư mục ABI **, ví dụ: đối với thư mục 'armeabi-v7a':' exclude "lib/armeabi-v7a/**" '(Xem [PackagingOptions] (https: // google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.PackagingOptions.html)) – Eido95

Các vấn đề liên quan