2014-06-19 6 views
5

मुझे दो लाइब्रेरी मॉड्यूल के साथ एक मूल प्रोजेक्ट बनाने के दौरान "डुप्लिकेट फ़ाइलें" संघर्ष मिलता है, जो उसी libc++_shared.so साझा लाइब्रेरी का उपयोग करता है।मल्टी-प्रोजेक्ट एंड्रॉइड बिल्ड में डुप्लिकेट सी साझा लाइब्रेरीज़ (.so) को कैसे निकालें?

(नोट:। कृपया यह एक "डुप्लिकेट सवाल" पर विचार नहीं करते मैं कई संबंधित पोस्ट है, जो मुझे मिल मदद की है पढ़ा है यह अब तक हालांकि, कोई पोस्ट एक जवाब है कि मेरे मामले को शामिल में काम करता है प्रदान की है। एनडीके कलाकृतियों।)

बिल्ड सही ढंग से काम कर रहा था जब मेरे पास केवल 1 ऐसा पुस्तकालय मॉड्यूल था। दूसरी लाइब्रेरी मॉड्यूल का जोड़ा अब संघर्ष बना रहा है।

निम्नलिखित परियोजना संरचना पर विचार करें: 1 माता पिता परियोजना, 2 "बच्चा" परियोजनाओं - लेकिन प्रत्येक परियोजना (यानी पदानुक्रम नेस्ट नहीं) एक ही निर्देशिका स्तर पर स्थित

ProjectA/ (Parent) 
    LibraryModuleA1/ 
     build/exploded-aar/com.package.name/ 
      LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so 
      LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so 
     build.gradle (bgA1) 
    Test_APK_Module A1T/ 
     build.gradle (bgA1T) 
    build.gradle (bgPA) 

ProjectB/ 
    LibraryModuleB1/ (Uses NDK) 
     build/lib/armeabi-v7a/libc++_shared.so 
     build.gradle (bgB1) 
    build.gradle (bgPB) 

ProjectC/ 
    LibraryModuleC1/ (Uses NDK) 
     build/lib/armeabi-v7a/libc++_shared.so 
     build.gradle (bgC1) 
    build.gradle (bgPC) 

लाइब्रेरी मॉड्यूल A1 दोनों लाइब्रेरी पर निर्भर करता है मॉड्यूल बी 1 & सी 1।
A1 -> बी 1
A1 -> सी 1

परियोजनाओं बी और सी दोनों NDK आधारित कोड है और/परीक्षण सही ढंग से निर्माण। दोनों libc++_shared.so साझा लाइब्रेरी पर निर्भर करते हैं।

हालांकि, जब परियोजना एक इमारत, मैं निम्न त्रुटि :LibraryModuleA1:packageDebugTest कार्य के दौरान हो:

Error: duplicate files during packaging of APK /ProjectA/LibraryModuleA1/build/apk/LibraryModuleA1-debug-test-unaligned.apk 
    Path in archive: lib/armeabi-v7a/libc++_shared.so 
    Origin 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleB1/<version>/jni/armeabi-v7a/libc++_shared.so 
    Origin 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so 
You can ignore those files in your build.gradle: 
    android { 
     packagingOptions { 
     exclude 'lib/armeabi-v7a/libc++_shared.so' 
     } 
    } 

* What went wrong: 
Execution failed for task ':LibraryModuleA1:packageDebugTest'. 
> Duplicate files copied in APK lib/armeabi-v7a/libc++_shared.so 
    File 1: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so 
    File 2: /ProjectA/LibraryModuleA1/build/exploded-aar/com.package.name/LibraryModuleC1/<version>/jni/armeabi-v7a/libc++_shared.so 

:LibraryModuleA1:packageDebugTest FAILED 

क्या मैं तो कोशिश की है सुदूर

  1. मैं जोड़ने के लिए सुझाव का प्रयास किया मेरे build.gradle फ़ाइल को बंद करें, लेकिन build.gradle फ़ाइल मैं इसे जोड़ता हूं? मैंने bgA1, bgB1, और bgC1 (एक समय में एक) को बंद करने के लिए कोई सफलता नहीं दी है।
  2. सुझाए गए बंदरगाह exclude 'lib/armeabi-v7a/libc++_shared.so' का उपयोग करने के लिए कहते हैं। प्रत्येक "बच्चा" लाइब्रेरी मॉड्यूल build/lib पथ के तहत libc++_shared.so फ़ाइल बनाता है। हालांकि, मैंने देखा कि पेरेंट लाइब्रेरी मॉड्यूल निर्देशिका संरचना के अंदर jni/armeabi-v7a/libc++_shared.so के तहत libc++_shared.so फ़ाइल की प्रतिलिपि बनाता है। (ऊपर देखें) बंद होने के बजाय exclude 'jni/armeabi-v7a/libc++_shared.so (यानी jni बनाम lib) बंद करना चाहिए?
  3. चूंकि मैं ग्रैडल प्लगइन 0.9.1 का उपयोग कर रहा हूं, इसलिए मैंने exclude के स्थान पर pickFirst का उपयोग करने का प्रयास किया, लेकिन यह भी सफल नहीं था।

क्या कोई यह निर्धारित करने में सहायता कर सकता है कि मुझे अपने दिए गए मामले के लिए 'पैकेजिंग विकल्प' बंद करने के तरीके को कैसे कॉन्फ़िगर करना चाहिए?

आपकी मदद के लिए धन्यवाद!

उत्तर

1

मैं एक ही समस्या में भाग गया और बाहर निकलने या लेने के लिए कोई भाग्य नहीं था। तो मैंने कुछ हद तक बदसूरत कामकाज का इस्तेमाल किया। विचार मुख्य प्रोजेक्ट की बिल्ड निर्देशिका में 'मूल-libs' फ़ोल्डर बनाना है, वहां सभी आवश्यक * .so फ़ाइलों को ndk लाइब्रेरी प्रोजेक्ट से कॉपी करें और फिर बिल्ड सिस्टम को एपीके में उन libs को पैकेज करने के लिए बताएं।

मेरी मुख्य परियोजना (एप्लिकेशन परियोजना), मैं स्पष्ट रूप मॉड्यूल NDK कोड है जिस पर मैं

// Ndk stuff. We have to explicitely manage our NDK dependencies 
ext.jniProjects = [project(':ndklib1'), project(':ndklib2'), project(':ndklib3')] 
apply from: '../depend_ndk.gradle' 

और फिर, 'depend_ndk.gradle' निर्भर होते हैं की सूची को परिभाषित में एक Gradle बाहरी स्क्रिप्ट है कि

// Build helper for projects that depends on a native library with a NDK part 
// Define the list of ndk library you depend on in project main file : 
// ext.jniProjects = [project(':ndklib1')] 
// apply from : 'depend_ndk.gradle' 
buildscript { 
    repositories { 
     jcenter() 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.12.+' 
    } 
} 
import com.android.build.gradle.tasks.PackageApplication 

// As a workaround, we create a new 'native-libs' folder in the current project and 
// copy all the .so we depend on into it 
def ndkLibsDir = new File(buildDir, 'native-libs') 
ndkLibsDir.mkdir() 

task copyDependingNativeLibs(type: Copy) { 
    // Doc for copy http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Copy.html 
    println 'jniProjects ' + jniProjects 
    jniProjects.each { 
     from(new File(it.buildDir, 'native-libs')) { 
      include '**/*.so' 
     } 
    } 
    into ndkLibsDir 
} 

tasks.withType(PackageApplication) { pkgTask -> 
    pkgTask.jniFolders = new HashSet<File>() 
    pkgTask.jniFolders.add(ndkLibsDir) 
    pkgTask.dependsOn copyDependingNativeLibs 
} 
+0

पैकेज एप्लिकेशन कैसे ट्रिगर होता है? ऐप में - मैं इसे डिबग बिल्ड पर नहीं देख रहा हूं ... इसलिए मेरी डीबग एपीके शामिल हैं ... धन्यवाद। –

+0

आप सही हैं, मुझे स्वचालित रूप से चलाने के लिए copyDependingNativeLibs प्राप्त करने में परेशानी हो रही है। मुझे लगता है कि इसे पीकेजी टास्क के लिए निर्भरता के रूप में जोड़ना सही काम नहीं है। मेरे पास वास्तव में समाधान खोजने का समय नहीं है, इसलिए अब जब मैं कुछ मूल भाग बदलता हूं तो मैं केवल './gradlew ऐप चलाता हूं: copyDependingNativeLibs'। – Julien

संबंधित मुद्दे