একাধিক ব্যবহারকারী পরীক্ষা করুন

এই পৃষ্ঠায় অ্যান্ড্রয়েড প্ল্যাটফর্মে একাধিক ব্যবহারকারীকে পরীক্ষা করার গুরুত্বপূর্ণ দিকগুলো বর্ণনা করা হয়েছে। একাধিক ব্যবহারকারী সমর্থন বাস্তবায়ন সম্পর্কে তথ্যের জন্য, ‘একাধিক ব্যবহারকারীকে সমর্থন করুন’ দেখুন।

ডিভাইস পাথ

নিম্নলিখিত সারণীতে কয়েকটি ডিভাইস পাথ এবং সেগুলি কীভাবে সমাধান করা হয় তা তালিকাভুক্ত করা হয়েছে। 'Path ' কলামের সমস্ত মান হলো ব্যবহারকারী-নির্দিষ্ট স্যান্ডবক্সড স্টোরেজ। সময়ের সাথে সাথে অ্যান্ড্রয়েডের স্টোরেজ ব্যবস্থায় পরিবর্তন এসেছে; আরও তথ্যের জন্য স্টোরেজ ডকুমেন্টেশন পড়ুন।

পথ সিস্টেম পাথ (ঐচ্ছিক) উদ্দেশ্য
/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 কমান্ড কাজে আসে। এই কমান্ডগুলোর মধ্যে কয়েকটি শুধুমাত্র অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলোতে সমর্থিত:

  • 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> ব্যবহার করা। অ্যান্ড্রয়েড ৯-এর আগে পর্যন্ত সব কমান্ডের জন্য সুস্পষ্ট ইউজার ফ্ল্যাগ সমর্থিত ছিল না।

  • অ্যান্ড্রয়েড ৯ থেকে সেকেন্ডারি ব্যবহারকারীদের /sdcard পাথে অ্যাক্সেস নিষিদ্ধ করা হয়েছে। টেস্টিং চলাকালীন কীভাবে ফাইল পুনরুদ্ধার করতে হয়, সে সম্পর্কে বিস্তারিত জানতে মাল্টি-ইউজার ডেটার জন্য কন্টেন্ট প্রোভাইডার দেখুন।

একাধিক ব্যবহারকারীর ডেটার জন্য কন্টেন্ট প্রদানকারী

যেহেতু অ্যান্ড্রয়েড ৯ এবং তার পরবর্তী সংস্করণগুলিতে adb সিস্টেম ব্যবহারকারী হিসাবে চলে এবং ডেটা স্যান্ডবক্স করা থাকে, তাই কোনো নন-সিস্টেম ব্যবহারকারী থেকে যেকোনো পরীক্ষার ডেটা পুশ বা পুল করার জন্য আপনাকে অবশ্যই কন্টেন্ট প্রোভাইডার ব্যবহার করতে হবে। নিম্নলিখিত ক্ষেত্রে এটি প্রয়োজনীয় নয় :

  • adbd রুট হিসেবে চলছে ( adb root এর মাধ্যমে), যা শুধুমাত্র userdebug বা usereng বিল্ড ব্যবহার করেই সম্ভব।

  • আপনি ফাইল পুশ বা পুল করার জন্য ট্রেড ফেডারেশনের (ট্রেডফেড-এর) ITestDevice ব্যবহার করছেন, সেক্ষেত্রে আপনার টেস্ট কনফিগে /sdcard/ পাথ ব্যবহার করুন (উদাহরণস্বরূপ, NativeDevice.java এর pushFile এর সোর্স কোড দেখুন)।

যখন কোনো কন্টেন্ট প্রোভাইডার সেকেন্ডারি ইউজারে চালু থাকে, তখন আপনি উপযুক্ত user , uri এবং অন্যান্য প্যারামিটার উল্লেখ করে adb shell content কমান্ড ব্যবহার করে এটি অ্যাক্সেস করতে পারেন।

অ্যাপ ডেভেলপারদের জন্য বিকল্প সমাধান

push বা pull কমান্ডের পরিবর্তে adb content এবং ContentProvider এর একটি ইনস্ট্যান্স ব্যবহার করে টেস্ট ফাইলগুলোর সাথে ইন্টারঅ্যাক্ট করুন।

  1. অ্যাপ দ্বারা হোস্ট করা ContentProvider এর একটি ইনস্ট্যান্স তৈরি করুন যা প্রয়োজন অনুযায়ী ফাইল পরিবেশন ও সংরক্ষণ করতে পারে। অ্যাপের অভ্যন্তরীণ স্টোরেজ ব্যবহার করুন।
  2. ফাইলগুলো পুশ বা পুল করতে 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
```

ট্রেড ফেডারেশন বহু-ব্যবহারকারী সমর্থন

ট্রেডফেড হলো অফিসিয়াল অ্যান্ড্রয়েড টেস্ট হারনেস। এই অংশে একাধিক ব্যবহারকারীর টেস্ট সিনারিওর জন্য ট্রেডফেডের কিছু অন্তর্নির্মিত সমর্থনের সারসংক্ষেপ তুলে ধরা হয়েছে।

স্ট্যাটাস চেকার

সিস্টেম স্ট্যাটাস চেকার (এসএসসি) টার্গেট প্রিপেয়ারারের আগে চালানো হয়, এবং সেগুলোর ক্লিনআপ ঐ প্রিপেয়ারারগুলোর পরে চালানো হয়।

একাধিক ব্যবহারকারীকে পরীক্ষা করার সময় ডেভেলপারদের সাহায্য করার জন্য UserChecker বিশেষভাবে সংজ্ঞায়িত করা হয়েছে। এটি ট্র্যাক করে যে কোনো পরীক্ষা ডিভাইসে থাকা ব্যবহারকারীদের অবস্থার পরিবর্তন করেছে কিনা (উদাহরণস্বরূপ, টিয়ারডাউনে অপসারণ না করেই নতুন ব্যবহারকারী তৈরি করা)। এছাড়াও, যদি user-cleanup সেট করা থাকে, তবে এটি পরীক্ষার পরে স্বয়ংক্রিয়ভাবে পরিষ্কার করার চেষ্টা করে এবং একই সাথে সহায়ক ত্রুটি বার্তা প্রদান করে, যাতে পরীক্ষাটি সংশোধন করা যায়।

<system_checker class="com.android.tradefed.suite.checker.UserChecker" >
    <option name="user-cleanup" value="true" />
</system_checker>

লক্ষ্য প্রস্তুতকারী

টার্গেট প্রিপেয়ারার সাধারণত একটি নির্দিষ্ট কনফিগারেশন দিয়ে কোনো ডিভাইস সেট আপ করতে ব্যবহৃত হয়। মাল্টি-ইউজার টেস্টিংয়ের ক্ষেত্রে, প্রিপেয়ারার ব্যবহার করে একটি নির্দিষ্ট ধরনের ইউজার তৈরি করার পাশাপাশি অন্য ইউজারদের কাছে সুইচও করা যায়।

যেসব ডিভাইস টাইপে সেকেন্ডারি ইউজার নেই, সেগুলোর ক্ষেত্রে আপনি AndroidTest.xmlCreateUserPreparer ব্যবহার করে একটি সেকেন্ডারি ইউজার তৈরি করতে এবং তাতে সুইচ করতে পারেন। টেস্টের শেষে, প্রিপারারটি আবার আগের অবস্থায় ফিরে যায় এবং সেকেন্ডারি ইউজারকে ডিলিট করে দেয়।

<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>

হোস্ট-চালিত পরীক্ষা

কিছু ক্ষেত্রে, একটি টেস্টের মধ্যেই ইউজার পরিবর্তন করার প্রয়োজন হতে পারে। UI Automator- এর মতো কোনো ডিভাইস-সাইড টেস্ট ফ্রেমওয়ার্কের ভেতর থেকে এই পরিবর্তনটি করবেন না, কারণ টেস্ট প্রসেসটি যেকোনো সময় বন্ধ হয়ে যেতে পারে। এর পরিবর্তে, Tradefed-এর Host-driven test framework-এর মতো একটি হোস্ট-সাইড টেস্ট ফ্রেমওয়ার্ক ব্যবহার করুন, যা ITestDevice এ অ্যাক্সেস দেয় এবং প্রয়োজনীয় যেকোনো ইউজার ম্যানিপুলেশনের সুযোগ করে দেয়।

যেসব হোস্ট-ড্রাইভেন টেস্ট ব্যবহারকারীর অবস্থা পরিবর্তন করে, সেগুলোর জন্য UserChecker (যা Status checkers- এ বর্ণিত আছে) ব্যবহার করুন, কারণ এটি নিশ্চিত করে যে টেস্টটি কাজ শেষে সঠিকভাবে নিজেকে পরিষ্কার করে নেয়।