संक्षेप में आप दोनों एप्लिकेशन की मेनिफेस्ट और परीक्षण परियोजना के प्रदर्शन में के लिए एक ही 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 पर मिल सकती है।
स्रोत
2013-01-07 13:00:07
बिल्कुल सही और व्यापक जवाब! अब यह अन्यथा "बहिष्कृत" साझा उपयोगकर्ता आईडी के लिए एक बहुत अच्छा उपयोग केस है। मैं आपके द्वारा उल्लिखित दोषों के साथ रह सकता हूं, यहां सबसे महत्वपूर्ण बात वास्तव में उत्पादन अनुमतियों से परीक्षण अलग करना है और यह पूरा हो गया है। एक बार फिर धन्यवाद! –
अच्छा कामकाज, लेकिन मुझे अभी भी नहीं मिला, जब test.apk की सभी अनुमति आवश्यक है तो फिर भी यह त्रुटि क्यों फेंक रही थी? –
हाय! अच्छा कामकाज, धन्यवाद! हालांकि, ऐसा लगता है कि एंड्रॉइड 6 (एपीआई लेवल 23) के साथ शुरू होने से शायद नई अनुमति प्रणाली के कारण, अनुमतियां अब विलय नहीं हुई हैं। मुझे व्यक्तिगत रूप से यह कोई दस्तावेज नहीं मिला, इसलिए मेरी धारणा सही नहीं हो सकती है। क्या कोई मेरे अलावा इस मुद्दे का सामना कर रहा है? –