गतिविधि प्रबंधक: गतिविधियों को लॉन्च करते समय निकाला गया java.lang.IleglegalArgumentException: val.length> 91




android android-activity (4)

मुश्किल समस्या ... अगली बार छोटे पैकेज नाम :)

क्या आपने केवल गतिविधियों के पैकेज को बदलने की कोशिश की थी। मुख्य गतिविधि?

पसंद:

com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seas‌​onal_photo_comments.a.MA

यदि यह समस्या हल करता है तो आप प्रोजेक्ट बनाने से पहले संभवतः वर्णों की न्यूनतम संख्या का उपयोग करने के लिए बेस 64 का उपयोग करके अपने प्रोजेक्ट के सभी वर्गों / पैकेजों का नाम बदलने के लिए एक टूल (ग्रेडल, जावा, पायथन या व्हाटवर में) बना सकते हैं।

आवेदन की मुख्य गतिविधि शुरू करते समय, यह तुरंत क्रैश हो रहा है। जब मैंने एडीबी लॉग देखा, तो मैं केवल यह ढूंढ पाया,

Exception thrown when launching activities in ProcessRecord
  java.lang.IllegalArgumentException: val.length > 91
  at SystemProperties.set

जब मैंने एंड्रॉइड के सोर्स कोड को देखा, तो मैंने पाया कि यह एंड्रॉइड सोर्स कोड ऑफ सिस्टमप्रॉपर्टीज.जावा की समस्या की जड़ हो सकती है। इसमें 91 की अधिकतम मूल्य सीमा है।

    public static final int PROP_VALUE_MAX = 91; 
    public static String get(String key) { 
        if (key.length() > PROP_NAME_MAX) { 
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 
        } 
        return native_get(key); 
    } 

जब मैं इसे अनुमान लगाता हूं, तो मैंने पाया कि, मेरे एप्लिकेशन का पैकेज नाम 108 वर्ण लंबा है। और जब मैंने अपने ऐप का पैकेज नाम 60 वर्णों में बदल दिया, तो यह बिना किसी समस्या के काम करता था।

मामला क्या हो सकता है? यह केवल असस जेनफ़ोन 2 (लॉलीपॉप 5.0) मॉडल पर होता है।

किसी अन्य डिवाइस में कोई समस्या नहीं है। इस समस्या के कारण हमें बहुत नकारात्मक रेटिंग मिल रही है।

हमारे ऐप में प्ले स्टोर में 15K डाउनलोड पहले से हैं। तो ऐप के पैकेज नाम को बदलना मेरे लिए एक विकल्प नहीं है। कृपया सहायता कीजिए

अद्यतन करें

अधिक सटीक होने के लिए, वहाँ है

Asus Zenfone श्रृंखला के अलावा हमने परीक्षण किए गए सभी एंड्रॉइड फोन में कोई समस्या नहीं है

जैसा कि टिप्पणियों में @ विश्वनाथ लेक्षमानन ने उल्लेख किया है, मैंने मेनएसिटीविटी.जावा फ़ाइल का स्थान निचले पथ में बदल दिया है।

यानी, मूल पूर्ण पैकगेनाम था: - "com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity"

मैंने इसे बदल दिया: - "com.fourbigbrothers.mtm.activities.MainActivity"

अभी भी काम नहीं कर रहा है। मैंने मेनएक्टिविटी के क्रिएट पर कुछ लॉग डाल दिए हैं , लेकिन कोड निष्पादन बिल्कुल नहीं पहुंच रहा है। इसलिए मुझे नहीं पता कि कुछ उत्तरों में बताए गए प्रयास / पकड़ ब्लॉक को कहां रखा जाए।

एंड्रॉइड एनएनडीके का उपयोग कर कोई समाधान होगा? और खेद है कि यह एक बेवकूफ सवाल है, मैं पूरी तरह से खो गया हूँ।

यह मैनिफेस्ट का प्रासंगिक हिस्सा है

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments" >

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application
    android:name="com.fourbigbrothers.boilerplate.base.FbbApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.FbbApp" >
    <activity
        android:name="com.fourbigbrothers.malayalam_troll_greetings_maker_edit_movie_images_font_seasonal_photo_comments.activities.MainActivity"
        android:label="@string/launcherActivityName"
        android:screenOrientation="portrait"
        android:launchMode="singleTop"
        android:theme="@style/MainActivityTheme" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />

        </intent-filter>

        <intent-filter>
            <action android:name="android.intent.action.SEND" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="image/*" />
        </intent-filter>
    </activity>
</application>

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

उदाहरण के लिए, एडीबीडी प्रोसेस पूछताछ संपत्ति सेवा यह जांचने के लिए कि यह एमुलेटर में चल रहा है या नहीं। एक और उदाहरण java.io.File.pathSeparator संपत्ति सेवा में संग्रहीत मूल्य देता है। संपत्ति प्रणाली कैसे काम करती है संपत्ति प्रणाली का उच्च स्तरीय आर्किटेक्चर निम्नानुसार दिखाया गया है। आपकी समस्या के बारे में। मैं आपको प्रस्तावित उत्तर पर चलने की दृढ़ता से सलाह देता हूं। क्यों? Property_service.h देखें। यह एक वर्ग है जिसे पहिया कहा जाएगा जिसे आप मूल रूप से SystemProperties.set विधि निष्पादित करते हैं। यदि आप देशी_सेट (कुंजी, वैल) सेट करने का प्रयास कर रहे हैं तो आपको is_legal_property_name विधि के कारण सकारात्मक परिणाम नहीं मिलेगा, जो मूल स्तर पर संपत्ति नियमों की जांच करता है। जब मैं इसे अनुमान लगाता हूं, तो मैंने पाया कि, मेरे एप्लिकेशन का पैकेज नाम 108 वर्ण है लंबा। और जब मैंने अपने ऐप का पैकेज नाम 60 वर्णों में बदल दिया, तो उसने बिना किसी समस्या के काम किया। बस अनुमान लगाओ।

AndroidProperties को Android में SharedPreference के एनालॉग की तरह देखें। आपको कुंजी के रूप में अपनी गतिविधि के लिए एक पूर्ण पथ की आवश्यकता नहीं है। बस एक नाम डालें। या प्रीफेक्स या इस तरह कुछ के साथ। अद्यतन कई खोजों के बाद मुझे मूल सिस्टमप्रॉपर्टीज फ़ाइल का स्रोत मिला। वह 92 की अधिकतम लंबाई के रूप में परिभाषित करता है, और 32 की अधिकतम लंबाई के रूप में 32 को परिभाषित करता है। तो यह लिनक्स निम्न स्तर पर एक प्रतिबंध है। आप इसे केवल अपने मुख्य मूल्य को काटकर ठीक कर सकते हैं (।

आपके मामले में मुख्य गतिविधि) भविष्य की खोजों के लिए: http://rxwen.blogspot.com/2010/01/android-property-system.html


चूंकि आप पैकेज नाम को बदलना नहीं चाहते हैं जिसका लंबाई 108 वर्ण से अधिक 108 वर्ण है। इसलिए आपको अपवाद को बाईपास करना होगा। यदि यह त्रुटि होती है तो यह आपके कोडिंग अनुभाग के लिए बाईपास हो जाएगी।

मूल कारण विश्लेषण:

आपने उस अनुभाग को याद किया है जहां त्रुटि उत्पन्न होती है। जैसा कि यह वैल। लम्बाई> 91 कहा जाता है

java.lang.IllegalArgumentException: val.length > 91

तो, त्रुटि अवरुद्ध भाग से उत्पन्न हो रही है।

/**
 * Set the value for the given key. 
 * @throws IllegalArgumentException if the key exceeds 32 characters 
 * @throws IllegalArgumentException if the value exceeds 92 characters 
 */ 
public static void set(String key, String val) { 
    if (key.length() > PROP_NAME_MAX) { 
        throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); 
    } 
    if (val != null && val.length() > PROP_VALUE_MAX) { 
        throw new IllegalArgumentException("val.length > " + 
            PROP_VALUE_MAX); // Error is generating from here
    }
    native_set(key, val); 
} 

उपाय:

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

तो हमारे मामले के लिए, हमारा लक्ष्य कुंजी और मूल्य निर्धारित करना है। यदि मूल्य की लंबाई 91 वर्ण से अधिक है तो यह IllegalArgumentException देता है। इसलिए मुझे value कुंजी के अनुसार बाईपास करने की आवश्यकता नहीं है।

MainActivity , मैं पहली बार खोज करता हूं जो इस भाग को कॉल करता है और त्रुटि उत्पन्न करता है, तो हमें इसे बाईपास करना होगा। कोड बाईपासिंग नीचे दिया गया है। मैंने कोड का परीक्षण नहीं किया है लेकिन यह नीचे दिखेगा। यदि आप नमूना कोड नहीं दे रहे हैं, तो मैं बस तंत्र देता हूं। आशा है कि आप इसे अपने कोड से सामना करेंगे।

try {
....
// MainActivity.java's portion code which calls the method and causes the error
....
} catch (final Exception e) {
    e.printStackTrace();
    if (e instanceof IllegalArgumentException) { // bypass IllegalArgumentException
        .......
        if (key.length < 32) { // It checks that if the IllegalArgumentException is caused for key, then it throws error. It defines that it will be bypassed only for val.length()
            native_set(key, val); //native_set is called without checking length of value
        } else {
            throw e;
        }
    }
}

एनबी: यदि आप न्यूनतम नमूना कोड और पूर्ण स्टैकट्रैक लॉग प्रदान करते हैं तो उचित उत्तर देना बेहतर होगा।

अद्यतन करें:

एक और तरीका जिसे आप कार्यान्वित कर सकते हैं। आप MainActivity को SecondMainActivity में बदल सकते हैं। फिर आप कम से कम पैकेज नाम के साथ एक नई मुख्य गतिविधि (लॉन्चर गतिविधि) तैयार करेंगे। फिर यह नव निर्मित मुख्य क्रियाशीलता SecondMainActivity को कॉल करेगी।

कृपया कोशिश करें और मुझे अपडेट रखें।


किसी तृतीय-पक्ष एप्लिकेशन को सिस्टम प्रॉपर्टी सेट करने की अनुमति नहीं है। इसलिए, दुर्घटना का सबसे संभावित कारण यह है कि सिस्टम पैकेज प्रॉपर्टी को सिस्टम प्रॉपर्टी के लिए मान के रूप में सेट कर रहा है।

अन्य उत्तरों सही हैं कि सिस्टम प्रॉपर्टी का अधिकतम मान 92 वर्ण है और अधिकतम कुंजी 32 वर्ण है। हालांकि, आपका ऐप सिस्टम प्रॉपर्टी सेट नहीं कर रहा है।

इस मुद्दे को अपने अंत में हल करने के लिए आप इतना कुछ नहीं कर सकते हैं। मैं एसस के साथ एक मुद्दा खोलूंगा और अपने पैकेज-नाम को बदलने पर विचार करूंगा (शायद केवल एसस जेनफ़ोन 2 के लिए)। दुर्भाग्यवश, जैसा कि आप पहले ही जानते हैं, यदि आपने पैकेज-नाम बदल दिया है तो आपको एक नया ऐप प्रकाशित करना होगा। उम्मीद है कि Asus एक अद्यतन को धक्का देता है जो इस समस्या को हल करता है। इसके अलावा, उत्पादन को जारी करने से पहले पैकेज-नाम की लंबाई पर विचार करने का एक अच्छा कारण :)





android-activity