2016-01-15 15 views
6

Tôi đang cố gắng xây dựng phổ quát apk cho tất cả các kiến ​​trúc. Dưới đây là cấu trúc dự án của tôi:Android gradle, libs gốc cho các kiến ​​trúc khác nhau

-App 
    -appModule 
    -libraryModule 
     -libs 
      -armeabi 
       -lib.so 
     -src 
      -java 
      -jni 

Đây là tập tin gradle tôi cho libraryModule:

apply plugin: 'com.android.library' 

// http://stackoverflow.com/questions/28485309/how-to-build-single-apk-with-andoid-ndk-and-gradle 


android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.2" 

    defaultConfig { 
     ndk { 
      moduleName "ProxyResolver" // <-- This is the name of AndroidProxy native module 
      stl "gnustl_shared" 
      cFlags "-std=c++11" 
      abiFilters = ['armeabi'] 
      ldLibs (projectDir.absolutePath + "/libs/armeabi/libresolver.so") 
     } 
    } 

    sourceSets { 
     main { 
      jniLibs.srcDirs = ['libs'] 
     } 
    } 
} 

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

Như bạn có thể thấy đường dẫn cho thư viện được hardcoded. Và ngay bây giờ nó hoạt động trên bộ vi xử lý arm-v7. Nhưng tôi cần phải thêm hỗ trợ của x86 mà không cần thêm một hương vị

Trả lời

2

Tôi đoán:

ndk { 

    moduleName "resolver" 
    stl "gnustl_shared" 
    cFlags "-std=c++11" 
    abiFilters = ['armeabi','arm-v7'] 
} 

Và loại bỏ

sourceSets { 
    main { 
     jniLibs.srcDirs = ['libs'] 
    } 
} 
+0

Tôi đã thử biến thể yuor, nó không hoạt động đối với tôi. libresolver.so là một thư viện bên ngoài, vì vậy tôi không nghĩ rằng nó phải có cùng tên với mô-đun. Tôi có mô-đun - ProxyResolver yêu cầu thư viện libresolver.so – Vetalll

0

Thiết abiFilters trong defaultConfig của bạn chỉ hỗ trợ thêm thông tin vào khả năng của ứng dụng (chỉ hữu ích cho Trình cài đặt, tức là Trình cài đặt đưa ra lỗi khi thiết bị bạn cố gắng cài đặt không tương thích) và không thay đổi mã nhị phân nào được thêm vào sốcuối cùng, xem thêm https://stackoverflow.com/a/39445685/1827156.

Tôi đoán những gì bạn muốn hoàn thành là có apk khác nhau cho các kiến ​​trúc khác nhau. Đây là một usecase phổ biến, tức là để giảm kích thước xây dựng. Bạn có thể thực hiện việc này bằng cách sử dụng splits trong ứng dụng build.gradle của ứng dụng. Vui lòng tham khảo https://developer.android.com/studio/build/configure-apk-splits.html.

Tôi rất khuyên bạn nên https://www.neotechsoftware.com/blog/native-libraries-part-i-common-pitfalls (Tôi không phải là tác giả).

Lưu ý về làm việc với các thư viện/aar s: Tuy nhiên, có một cái bẫy lớn khi bạn làm việc với các thư viện (aar thay vì apk). Imho, bạn không thể (automagically) tạo ABI cụ thể khác nhau aar s. Thay vào đó, bạn tạo aar s chứa các tệp nhị phân cho tất cả ABI. Khi thêm aar vào một ứng dụng Android, bạn chỉ định splits trong các ứng dụng build.gradle như đã đề cập ở trên.

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