2012-06-01 20 views
9

Google Play एपस्टोर स्वचालित रूप से आपके एप्लिकेशन को संगत CPU आर्किटेक्चर वाले उपकरणों पर फ़िल्टर करता है। जैसे अगर आपके पास लाइब्रेरी है जो केवल एआरएमवी 5 के लिए संकलित है, तो आपका ऐप केवल एआरएमवी 5 या एआरएमवी 7 प्रोसेसर वाले उपकरणों के लिए दिखाई देगा।एंड्रॉइड एनडीके और Google Play फ़िल्टरिंग

यदि मेरे पास जावा विकल्प है, और मेरे ऐप को गैर-एआरएम उपकरणों द्वारा भी डाउनलोड करना चाहते हैं? ईजी। बाहरी लाइब्रेरी को लोड करने का प्रयास करते समय मुझे अपवाद मिलता है, और डेक्स बाइटकोड (जावा) में एक व्यावहारिक विकल्प लागू करता है।

जब मैं .apk अपलोड, Android डेवलपर कंसोल का कहना है: "। यह apk का अनुरोध करता है 1 स्थानीय प्लेटफ़ॉर्म गूगल के लिए उपयोग किया जाएगा Play फ़िल्टर armeabi"

मैं x86 के लिए डमी पुस्तकालयों संकलन करने की जरूरत है और एमआईपीएस? फिर मेरे जावा कोड में, प्रोसेसर आर्किटेक्चर को यह जानने के लिए जांचें कि क्या मैं वास्तव में लाइब्रेरी का उपयोग कर सकता हूं? एक बेहतर समाधान होना चाहिए।

जहां तक ​​मुझे पता है, मैनिफेस्ट में सीपीयू आर्किटेक्चर के बारे में कुछ भी नहीं है, और मुझे इस फ़िल्टर को बंद करने के लिए डेवलपर कंसोल में कोई रास्ता नहीं मिल रहा है।

उम्मीद है कि कोई भी जो Google Play फ़िल्टरिंग और एनडीके के बारे में मुझसे ज्यादा कुछ जानता है, वह जवाब जानता है।

+0

संभव विचार/मजाकिया विचार: http://stackoverflow.com/questions/15146174/android-library-so-with-x86-architecture-missing-vuforia – auselen

उत्तर

11

लोड लाइब्रेरी विफलताओं के लिए फँसाने के दौरान किसी भी डिवाइस पर काम करेगा (कम से कम मैंने जो भी जीटीवी समेत कोशिश की है), लेकिन Play Store डिवाइस पर नहीं दिखाएगा यदि उस प्लेटफ़ॉर्म के लिए एबीआई एपीके में मौजूद नहीं है।

दस्तावेज़ों से (http://developer.android.com/guide/appendix/market-filters.html): एक ऐसा एप्लिकेशन जिसमें मूल पुस्तकालय शामिल हैं जो एक विशिष्ट प्लेटफॉर्म (उदाहरण के लिए एआरएम ईएबीआई v7 या x86) को लक्षित करते हैं, केवल उस प्लेटफॉर्म का समर्थन करने वाले उपकरणों पर दिखाई दे रहे हैं।

सिद्धांत रूप में, सभी प्लेटफार्मों के लिए भवन सभी उपकरणों को लक्षित करने में सक्षम होगा, लेकिन व्यावहारिक रूप से Google टीवी जैसे कुछ डिवाइस हैं जो एबीआई की रिपोर्ट नहीं करते हैं, जिसका अर्थ है कि केवल एपीके जिनके पास मूल कोड नहीं है, प्ले में दिखाई देंगे उन उपकरणों पर स्टोर करें। आप एकाधिक एपीके का उपयोग कर सकते हैं, हालांकि, 1 देशी कोड के साथ 1 और आपके मूल कोड का समर्थन करने वाले सभी प्लेटफार्मों के साथ 1।

आप एक से अधिक apk समर्थन के बारे में यहाँ पढ़ सकते हैं: http://developer.android.com/guide/market/publishing/multiple-apks.html

+0

विपरीत के बारे में क्या है (जो मैं अभी करना चाहता हूं)? मेरे पास एक v7 एप्लिकेशन है जो v5 (या कुछ) पुस्तकालयों का उपयोग करता है। इसका मतलब यह है कि मेरे पास आर्किटेक्चर दोनों के लिए पुस्तकालय हैं, भले ही मुख्य एप्लिकेशन केवल v7 के लिए है। वर्तमान में हमने v7 फ़ोल्डर में गैर-v7 फ़ाइलों को स्थानांतरित कर दिया है, और ऐसा लगता है, लेकिन यह वास्तव में बदसूरत और गलत है। हम वास्तव में इसे कई apks तक विभाजित नहीं कर सकते हैं क्योंकि दोनों देशी पुस्तकालयों की आवश्यकता है। – alaeus

+0

@alaeus यह एक अलग सवाल होना चाहिए। यह भी ठीक है - एंड्रॉइड ने एबीआई को पीछे-संगत रखा है, इसलिए एआरएमवी 5 कोड एआरएमवी 6/7 उपकरणों पर ठीक होगा (विशेष रूप से, वे सभी "सॉफ्ट-फ्लोट" एबीआई का उपयोग करते हैं, जिसमें महत्वपूर्ण प्रदर्शन जुर्माना हो सकता है, लेकिन कुछ ऐसा है हमें साथ रहना होगा)। –

6

इस एक ही सवाल यहाँ करने के लिए एक बहुत ही पूरा जवाब है: http://grokbase.com/t/gg/android-ndk/125v31e6wy/play-store-market-filtering-of-ndk-libs

मुझे मेरे हाल समाधान पोस्ट करने दें, यह लगभग एक ही मैं यहाँ पोस्ट किया है है : Android library .so with x86 architecture missing? (Vuforia)

तो तुम एक नियमित रूप से Android.mk कि x86 आर्किटेक्चर पर संकलन नहीं कर सकते क्योंकि पुस्तकालय (libExternalLibrary.so) का उपयोग कर रहे केवल हाथ Archi के लिए प्रदान की जाती है की है। आप इस पुस्तकालय के आधार पर एक .so (libMyLibraryBasedOnExternalLibrary.so) बनाना चाहते हैं, और निश्चित रूप से यह लाइब्रेरी के बिना x86 पर संकलित नहीं होगा।

विचार सशर्त संकलन निर्देशों का उपयोग करते हुए सीधे Android.mk में x86 के लिए डमी लाइब्रेरी उत्पन्न करना है।

#include <jni.h> 
#include <android/log.h> 
#include <stdio.h> 
#include <string.h> 
#include <assert.h> 
#include <math.h> 
#include <string> 

#ifdef __cplusplus 
extern "C" 
{ 
#endif 

int dummy0      = 0; 

#ifdef __cplusplus 
} 
#endif 

फिर, Android संपादित:

1) बनाएं 2 डमी सीपीपी फ़ाइलों Dummy0.cpp और Dummy1.cpp उदाहरण Dummy0.cpp इस तरह दिखता है।mk कि अपने पुस्तकालय बनाता है और इस तरह इसे संशोधित:

LOCAL_PATH := $(call my-dir) 

ifeq ($(TARGET_ARCH_ABI), armeabi) 


# In this condtion block, we're compiling for arm architecture, and the libExternalLibrary.so is avaialble 
# Put every thing the original Android.mk was doing here, importing the prebuilt library, compiling the shared library, etc... 
# ... 
# ... 

else 

# In this condtion block, we're not compiling for arm architecture, and the libExternalLibrary.so is not availalble. 
# So we create a dummy library instead. 

include $(CLEAR_VARS) 
# when LOCAL_MODULE equals to ExternalLibrary, this will create a libExternalLibrary.so, which is exactly what we want to do. 
LOCAL_MODULE := ExternalLibrary 
LOCAL_SRC_FILES := Dummy0.cpp 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
# This will create a libMyLibraryBasedOnExternalLibrary.so 
LOCAL_MODULE := MyLibraryBasedOnExternalLibrary 
# Don't forget to tell this library is based on ExternalLibrary, otherwise libExternalLibrary.so will not be copied in the libs/x86 directory 
LOCAL_SHARED_LIBRARIES := ExternalLibrary 
LOCAL_SRC_FILES := Dummy1.cpp 
include $(BUILD_SHARED_LIBRARY) 

endif 
बेशक

, अपने कोड है कि आप पुस्तकालय अपने ऐप के एक 86 पर केवल डिवाइस चल रहा है फोन कभी नहीं में सुनिश्चित करें:

if ((android.os.Build.CPU_ABI.equalsIgnoreCase("armeabi")) || (android.os.Build.CPU_ABI2.equalsIgnoreCase("armeabi"))) { 
    // Good I can launch 
    // Note that CPU_ABI2 is api level 8 (v2.2) 
    // ... 
} 
+0

मुझे निम्न चरणों का सामना करने में त्रुटि मिल रही है: /android/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/../lib/gcc/arm-linux-androideabi/ 4.6.x-google /../../../../ arm-linux-androideabi/bin/ld: त्रुटि: नहीं मिल सकता -lExternalLibrary.so संग्रह 2: ld 1 निकास स्थिति लौटाई –

+0

यह एक संकलन त्रुटि है कौन सा वास्तुकला? क्या आप लॉग इन Dummy0.cpp के संकलन में देख सकते हैं? – jptsetung

+0

मैं आर्म आर्किटेक्चर के लिए निर्माण कर रहा हूं लेकिन पहले lib ExternalLibrary.so उत्पन्न हो जाता है। मुझे नहीं पता कि जब मैं हाथ-वास्तुकला पर निर्माण कर रहा हूं तो यह क्यों भाग रहा है। क्या मैं इसके बजाय एनडीके-दृष्टिकोण का उपयोग करूं? –