इस पेज पर, Android प्लैटफ़ॉर्म पर एक से ज़्यादा उपयोगकर्ताओं की जांच करने के अहम पहलुओं के बारे में बताया गया है. एक डिवाइस पर कई लोगों के काम करने की सुविधा लागू करने के बारे में जानने के लिए, एक डिवाइस पर कई लोगों के काम करने की सुविधा देखें.
डिवाइस पाथ
यहां दी गई टेबल में, डिवाइस के कई पाथ और उन्हें हल करने का तरीका बताया गया है. पाथ कॉलम में मौजूद सभी वैल्यू, उपयोगकर्ता के हिसाब से सैंडबॉक्स किया गया स्टोरेज होता है. Android के स्टोरेज की सुविधा में समय के साथ बदलाव हुए हैं. ज़्यादा जानकारी के लिए, स्टोरेज से जुड़ा दस्तावेज़ पढ़ें.
पाथ | सिस्टम पाथ (ज़रूरी नहीं) | मकसद |
---|---|---|
/data/user/{userId}/{app.path}
|
/data/data
|
ऐप्लिकेशन के लिए स्टोरेज |
/storage/emulated/{userId}
|
/sdcard
|
शेयर किया गया मोबाइल स्टोरेज |
/data/media/{userId}
|
कोई नहीं | उपयोगकर्ता का मीडिया डेटा (उदाहरण के लिए, संगीत, वीडियो) |
/data/system/users/{userId}
|
कोई नहीं | हर उपयोगकर्ता के हिसाब से सिस्टम कॉन्फ़िगरेशन/स्टेटस
सिर्फ़ सिस्टम ऐप्लिकेशन इसे ऐक्सेस कर सकते हैं |
उपयोगकर्ता के हिसाब से पाथ का इस्तेमाल करने का उदाहरण यहां दिया गया है:
# to access user 10's private application data for app com.bar.foo:
$ adb shell ls /data/user/10/com.bar.foo/
उपयोगकर्ताओं के बीच adb इंटरैक्शन
एक से ज़्यादा उपयोगकर्ताओं के साथ काम करते समय, adb
के कई निर्देश काम के होते हैं. इनमें से कुछ निर्देश, सिर्फ़ Android 9 और उसके बाद के वर्शन पर काम करते हैं:
adb shell am instrument --user <userId>
किसी खास उपयोगकर्ता के लिए, इंस्ट्रूमेंटेशन टेस्ट चलाता है. डिफ़ॉल्ट रूप से, यह मौजूदा उपयोगकर्ता का इस्तेमाल करता है.adb install --user <userId>
किसी खास उपयोगकर्ता के लिए पैकेज इंस्टॉल करता है. यह पक्का करने के लिए कि सभी उपयोगकर्ताओं के लिए कोई पैकेज इंस्टॉल हो, आपको हर उपयोगकर्ता के लिए इसे कॉल करना होगा.adb uninstall --user <userId>
किसी खास उपयोगकर्ता के लिए पैकेज अनइंस्टॉल करता है. सभी उपयोगकर्ताओं को अनइंस्टॉल करने के लिए,--user
फ़्लैग के बिना कॉल करें.adb shell am get-current-user
को मौजूदा (फ़ोरग्राउंड) उपयोगकर्ता आईडी मिलता है.adb shell pm list users
को सभी मौजूदा उपयोगकर्ताओं की सूची मिलती है.adb shell pm create-user
, एक नया उपयोगकर्ता बनाता है और आईडी दिखाता है.adb shell pm remove-user
, आईडी के हिसाब से किसी खास उपयोगकर्ता को हटाता है.adb shell pm disable --user <userId>
किसी खास उपयोगकर्ता के लिए पैकेज बंद कर देता है.adb shell pm enable --user <userId>
किसी खास उपयोगकर्ता के लिए पैकेज चालू करता है.adb shell pm list packages --user <userId>
किसी उपयोगकर्ता के लिए पैकेज की सूची दिखाता है. पैकेज चालू होने पर-e
और बंद होने पर-d
दिखता है. डिफ़ॉल्ट रूप से, यह हमेशा सिस्टम उपयोगकर्ता के लिए सूची बनाता है.
यहां दी गई जानकारी से यह समझने में मदद मिलती है कि adb
एक से ज़्यादा उपयोगकर्ताओं के साथ कैसे काम करता है:
adb
(या इससे ज़्यादा सटीक तरीके सेadbd
डीमन), हमेशा सिस्टम उपयोगकर्ता (यूज़र आईडी = 0) के तौर पर चलता है. चाहे कोई भी उपयोगकर्ता मौजूदा हो. इसलिए, उपयोगकर्ता पर निर्भर डिवाइस पाथ (जैसे कि/sdcard/
) हमेशा सिस्टम उपयोगकर्ता के तौर पर रिज़ॉल्व होते हैं. ज़्यादा जानकारी के लिए, डिवाइस के पाथ देखें.अगर कोई डिफ़ॉल्ट उपयोगकर्ता तय नहीं किया गया है, तो हर
adb
सब-कमांड का एक अलग उपयोगकर्ता होता है. सबसे सही तरीका यह है किam get-current-user
का इस्तेमाल करके उपयोगकर्ता आईडी पाएं. इसके बाद,--user <userId>
का इस्तेमाल उन सभी निर्देशों के लिए करें जिनमें यह काम करता है. Android 9 तक, साफ़ तौर पर बताए गए उपयोगकर्ता फ़्लैग, सभी निर्देशों के लिए काम नहीं करते थे.Android 9 से, दूसरे उपयोगकर्ताओं के
/sdcard
पाथ को ऐक्सेस करने की अनुमति नहीं है. जांच के दौरान फ़ाइलें वापस लाने के तरीके के बारे में जानने के लिए, कई उपयोगकर्ताओं के डेटा के लिए कॉन्टेंट उपलब्ध कराने वाला टूल देखें.
एक से ज़्यादा उपयोगकर्ताओं के डेटा के लिए कॉन्टेंट देने वाली कंपनी
adb
, सिस्टम यूज़र के तौर पर काम करता है और डेटा को Android 9 और इसके बाद वाले वर्शन में सैंडबॉक्स किया जाता है. इसलिए, आपको सिस्टम का इस्तेमाल न करने वाले किसी उपयोगकर्ता के टेस्ट डेटा को पुश करने या निकालने के लिए, कॉन्टेंट देने वालों का इस्तेमाल करना होगा. ऐसा करना ज़रूरी नहीं है, अगर:
adbd
,adb root
के ज़रिए रूट के तौर पर चल रहा है. ऐसा सिर्फ़userdebug
याusereng
बिल्ड का इस्तेमाल करके किया जा सकता है.फ़ाइलों को पुश या पुल करने के लिए, ट्रेड फ़ेडरेशन (ट्रेडिफ़ाइड) के
ITestDevice
का इस्तेमाल किया जा रहा है. इस स्थिति में, अपने टेस्ट कॉन्फ़िगरेशन में/sdcard/
पाथ का इस्तेमाल करें. उदाहरण के लिए,NativeDevice.java
मेंpushFile
का सोर्स कोड देखें.
जब कोई कॉन्टेंट प्रोवाइडर सेकंडरी उपयोगकर्ता के तौर पर काम कर रहा हो, तो उसे ऐक्सेस करने के लिए, adb shell content
कमांड के साथ सही user
, uri
, और अन्य पैरामीटर का इस्तेमाल करें.
ऐप्लिकेशन डेवलपर के लिए समस्या हल करने का तरीका
जांच करने के लिए, push
या pull
निर्देश के बजाय, adb content
और ContentProvider
के इंस्टेंस का इस्तेमाल करें.
- ऐप्लिकेशन से होस्ट किए गए
ContentProvider
का एक इंस्टेंस बनाएं, जो ज़रूरत के हिसाब से फ़ाइलें सेव और काम कर सके. ऐप्लिकेशन के इंटरनल स्टोरेज का इस्तेमाल करें. - फ़ाइलों को पुश करने या पुल करने के लिए,
adb shell content
read
याwrite
निर्देशों का इस्तेमाल करें.
मीडिया फ़ाइलों के लिए समस्या हल करने का तरीका
मीडिया फ़ाइलों को एसडी कार्ड के मीडिया सेक्शन में पुश करने के लिए, MediaStore
के सार्वजनिक एपीआई का इस्तेमाल करें. उदाहरण के लिए:
# push MVIMG_20190129_142956.jpg to /storage/emulated/10/Pictures
# step 1
$ adb shell content insert --user 10 --uri content://media/external/images/media/ --bind _display_name:s:foo.jpg
# step 2
$ adb shell content query --user 10 --projection _id --uri content://media/external/images/media/ --where "_display_name=\'foo.jpg\'"
# step 3
$ adb shell content write --user 10 --uri content://media/external/images/media/8022 < MVIMG_20190129_142956.jpg
कॉन्टेंट देने वाली सामान्य कंपनी को इंस्टॉल करना
कॉन्टेंट देने वाले ऐसे मौजूदा व्यक्ति को इंस्टॉल करें और इस्तेमाल करें जो उपयोगकर्ता के हिसाब से बने /sdcard
पाथ में फ़ाइलें पढ़ और लिखता हो.
make TradefedContentProvider
का इस्तेमाल करके, सोर्स से TradefedContentProvider.apk
बनाएं:
```
# install content provider apk
$ adb install --user 10 -g TradefedContentProvider.apk
# pull some_file.txt
$ adb shell content read --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt > local_file.txt
# push local_file.txt
$ adb shell content write --user 10 --uri content://android.tradefed.contentprovider/sdcard/some_file.txt < local_file.txt
```
Trade Federation की मल्टी-यूज़र सुविधा
Tradefed, Android का आधिकारिक टेस्ट हार्नेस है. इस सेक्शन में, एक से ज़्यादा उपयोगकर्ताओं के टेस्ट के लिए, Tradefed में पहले से मौजूद कुछ सहायता के बारे में बताया गया है.
स्टेटस की जांच करने वाले
टारगेट तैयार करने वाले टूल से पहले, सिस्टम स्टेटस की जांच करने वाले टूल (एसएससी) चलाए जाते हैं. साथ ही, इन टूल की क्लीनअप प्रोसेस, टारगेट तैयार करने वाले टूल के बाद शुरू की जाती है.
UserChecker
को खास तौर पर इसलिए तय किया गया है, ताकि डेवलपर एक से ज़्यादा उपयोगकर्ताओं की जांच कर सकें. यह ट्रैक करता है कि किसी टेस्ट से डिवाइस पर उपयोगकर्ताओं की स्थिति में बदलाव हुआ है या नहीं. उदाहरण के लिए, teardown में उपयोगकर्ताओं को हटाए बिना उन्हें बनाया गया. इसके अलावा, अगर user-cleanup
सेट है, तो जांच के बाद यह अपने-आप क्लीन अप करने की कोशिश करता है. साथ ही, जांच को ठीक करने के लिए, काम की गड़बड़ियां भी दिखाता है.
<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
<option name="user-cleanup" value="true" />
</system_checker>
टारगेट तैयार करने वाला व्यक्ति
आम तौर पर, टारगेट तैयार करने वाले टूल का इस्तेमाल किसी खास कॉन्फ़िगरेशन वाले डिवाइस को सेट अप करने के लिए किया जाता है. मल्टी-यूज़र टेस्टिंग के मामले में, इन तैयारर का इस्तेमाल किसी खास तरह के उपयोगकर्ता बनाने और दूसरे उपयोगकर्ताओं पर स्विच करने के लिए किया जा सकता है.
जिन डिवाइस टाइप में कोई सेकंडरी उपयोगकर्ता नहीं है उनके लिए, CreateUserPreparer
का इस्तेमाल करके AndroidTest.xml
में सेकंडरी उपयोगकर्ता बनाया जा सकता है और उस पर स्विच किया जा सकता है. टेस्ट खत्म होने के बाद, प्रिपरर वापस स्विच करता है और सेकंडरी उपयोगकर्ता को मिटा देता है.
<target_preparer
class="com.google.android.tradefed.targetprep.CreateUserPreparer" >
</target_preparer>
अगर डिवाइस पर आपका पसंदीदा उपयोगकर्ता टाइप पहले से मौजूद है, तो मौजूदा उपयोगकर्ता पर स्विच करने के लिए SwitchUserTargetPreparer
का इस्तेमाल करें. user-type
के लिए सामान्य वैल्यू में system
या secondary
शामिल हैं.
<target_preparer
class="com.android.tradefed.targetprep.SwitchUserTargetPreparer">
<option name="user-type" value="secondary" />
</target_preparer>
होस्ट से चलाए जाने वाले टेस्ट
कुछ मामलों में, टेस्ट को टेस्ट में उपयोगकर्ताओं को स्विच करना होगा. यूआई ऑटोमेट जैसे डिवाइस-साइड टेस्ट फ़्रेमवर्क से, स्विच न करें. ऐसा इसलिए, क्योंकि टेस्ट प्रोसेस कभी भी बंद की जा सकती है. इसके बजाय, होस्ट-साइड टेस्ट फ़्रेमवर्क का इस्तेमाल करें. जैसे, Tradefed का होस्ट-ड्रिवन टेस्ट फ़्रेमवर्क. इससे ITestDevice
को ऐक्सेस किया जा सकता है. साथ ही, ज़रूरत के हिसाब से उपयोगकर्ता को मैनिप्युलेट किया जा सकता है.
होस्ट-ड्रिवन टेस्ट के लिए UserChecker
(स्टेटस चेकर में बताया गया है) का इस्तेमाल करें. इससे उपयोगकर्ता की स्थिति बदल जाती है, क्योंकि इससे यह पक्का हो जाता है कि टेस्ट अपने-आप ठीक हो जाएगा.