2013-01-03 11 views
25

मैं शुद्ध परीक्षण उद्देश्यों के लिए InstrumentationTestCase2 व्युत्पन्न परीक्षण केस में बाहरी एसडी कार्ड में फ़ाइलों को लिखने का प्रयास करता हूं। यह सब अच्छी तरह से काम करता है जब android.permission.WRITE_EXTERNAL_STORAGE परीक्षण के अंतर्गत आवेदन की AndroidManifest.xml फ़ाइल में कॉन्फ़िगर किया गया है, लेकिन अगर इस सेटिंग परीक्षण परियोजना की AndroidManifest.xml फ़ाइल में ही मौजूद है काम नहीं करता।मैं केवल अपनी यूआई परीक्षण परियोजना के लिए अतिरिक्त एंड्रॉइड अनुमतियां कैसे जोड़ सकता हूं?

स्वाभाविक रूप से, मैं मुख्य प्रकट करने के लिए इस अनुमति को जोड़ने के लिए, के बाद से मैं सिर्फ अपने कार्यात्मक परीक्षण के दौरान इस क्षमता की जरूरत नहीं करना चाहती। मैं उसे कैसे प्राप्त कर सकता हूं?

उत्तर

33

संक्षेप में आप दोनों एप्लिकेशन की मेनिफेस्ट और परीक्षण परियोजना के प्रदर्शन में के लिए एक ही android:sharedUserId जोड़ सकते हैं और परीक्षण परियोजना के लिए आवश्यक अनुमति की घोषणा करनी चाहिए।

यह कामकाज इस तथ्य से आता है कि एंड्रॉइड वास्तव में लिनक्स उपयोगकर्ता खातों (यूआईडीएस) को अनुमति देता है लेकिन स्वयं को आवेदन नहीं करता है (डिफ़ॉल्ट रूप से प्रत्येक एप्लिकेशन को अपना यूआईडी मिल जाता है, ऐसा लगता है कि अनुमति प्रति एप्लिकेशन पर सेट की जाती है)।

applictions है कि एक ही प्रमाण पत्र के साथ प्रवेश किया हुआ है लेकिन एक ही uid साझा कर सकते हैं। नतीजतन उनके पास अनुमतियों का एक आम सेट है। उदाहरण के लिए, मेरे पास एप्लिकेशन ए हो सकता है जो WRITE_EXTERNAL_STORAGE अनुमति और एप्लिकेशन बी का अनुरोध करता है जो इंटरनेट अनुमति का अनुरोध करता है। ए और बी दोनों को एक ही प्रमाणपत्र द्वारा हस्ताक्षरित किया जाता है (मान लीजिए कि एक डीबग करें)। ए और बी android:sharedUserId="test.shared.id" के लिए AndroidManifest.xml फ़ाइलों में <manifest> टैग में घोषित किया गया है। फिर ए और बी दोनों नेटवर्क तक पहुंच सकते हैं और एसडीकार्ड को लिख सकते हैं भले ही वे आवश्यक अनुमतियों का केवल एक हिस्सा घोषित करते हैं क्योंकि अनुमति प्रति यूआईडी असाइन की जाती है। बेशक, यह केवल तभी काम करता है जब ए और बी दोनों वास्तव में स्थापित हों।

यहाँ कैसे परीक्षण परियोजना के मामले में स्थापित करने के लिए का एक उदाहरण है। आवेदन के लिए AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.testproject" 
    android:versionCode="1" 
    android:versionName="1.0" 
    android:sharedUserId="com.example.testproject.uid"> 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="16" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name"> 
     <activity 
      android:name="com.example.testproject.MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" />  
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

और AndroidManifest.xml एक परीक्षण परियोजना

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.testproject.test" 
    android:sharedUserId="com.example.testproject.uid" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 

    <instrumentation 
     android:name="android.test.InstrumentationTestRunner" 
     android:targetPackage="com.example.testproject" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <uses-library android:name="android.test.runner" /> 
    </application> 

</manifest> 

इस समाधान का दोष यह है के लिए है कि आवेदन बाह्य भंडारण के लिए भी लिखने में सक्षम है है जब परीक्षण पैकेज स्थापित है। यदि यह गलती से भंडारण में कुछ लिखता है तो यह रिलीज होने तक अनजान रह सकता है जब पैकेज को एक अलग कुंजी के साथ हस्ताक्षरित किया जाएगा।

साझा यूआईडी के बारे में कुछ अतिरिक्त जानकारी http://developer.android.com/guide/topics/security/permissions.html#userid पर मिल सकती है।

+0

बिल्कुल सही और व्यापक जवाब! अब यह अन्यथा "बहिष्कृत" साझा उपयोगकर्ता आईडी के लिए एक बहुत अच्छा उपयोग केस है। मैं आपके द्वारा उल्लिखित दोषों के साथ रह सकता हूं, यहां सबसे महत्वपूर्ण बात वास्तव में उत्पादन अनुमतियों से परीक्षण अलग करना है और यह पूरा हो गया है। एक बार फिर धन्यवाद! –

+0

अच्छा कामकाज, लेकिन मुझे अभी भी नहीं मिला, जब test.apk की सभी अनुमति आवश्यक है तो फिर भी यह त्रुटि क्यों फेंक रही थी? –

+4

हाय! अच्छा कामकाज, धन्यवाद! हालांकि, ऐसा लगता है कि एंड्रॉइड 6 (एपीआई लेवल 23) के साथ शुरू होने से शायद नई अनुमति प्रणाली के कारण, अनुमतियां अब विलय नहीं हुई हैं। मुझे व्यक्तिगत रूप से यह कोई दस्तावेज नहीं मिला, इसलिए मेरी धारणा सही नहीं हो सकती है। क्या कोई मेरे अलावा इस मुद्दे का सामना कर रहा है? –

-4

यह programmitcally करो के रूप में उत्पन्न डीबग वर्ग के डीबग मोड उन परिस्थितियों में डिबग हो जायेंगे।

6

एक और आसान जवाब है।

सेट अनुमति src/डिबग/AndroidManifest.xml (यदि मौजूद नहीं है, इसे बनाने)

डिफ़ॉल्ट AndroidTest तक BuildType रूप debug उपयोग करता है। कि आप इन अनुमतियों को debug buildType के तहत क्यों परिभाषित करते हैं। धन्यवाद विलय प्रक्रिया जो आपके यूआई परीक्षण निर्माण में इन अनुमतियों को जोड़ देगा।(ध्यान दें कि मैं पैकेज विशेषता शामिल नहीं किया था, क्योंकि यह कम प्राथमिकता स्तर प्रकट से विरासत में मिला दिया जाएगा) यहाँ नई अनुमतियों के साथ प्रकट है

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
</manifest> 

अब आप debug

से विशिष्ट buildType को इन अनुमतियों को लागू करना चाहते हैं

सिर्फ इस का उपयोग करें:

android { 
    ... 
    testBuildType 'release' // or other buildType you might have like 'testUI' 
} 
+0

यह मेरे लिए अच्छा है। उत्तर साझा करने के लिए धन्यवाद –

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

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