एंड-टू-एंड टीएफ परीक्षण उदाहरण

यह ट्यूटोरियल आपको "हैलो वर्ल्ड" ट्रेड फेडरेशन (ट्रेडफेड या टीएफ) परीक्षण कॉन्फ़िगरेशन बनाने में मार्गदर्शन करता है और आपको टीएफ ढांचे का व्यावहारिक परिचय देता है। विकास परिवेश से शुरू करके, आप एक सरल कॉन्फ़िगरेशन बनाएंगे और सुविधाएँ जोड़ेंगे।

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

  • डेवलपर के लिए डी
  • मैं इंटीग्रेटर के लिए
  • टेस्ट रनर के लिए आर

ट्यूटोरियल पूरा करने के बाद, आपके पास एक कार्यशील टीएफ कॉन्फ़िगरेशन होगा और आप टीएफ ढांचे में कई महत्वपूर्ण अवधारणाओं को समझेंगे।

व्यापार महासंघ की स्थापना करें

टीएफ विकास वातावरण स्थापित करने के विवरण के लिए, मशीन सेटअप देखें। इस ट्यूटोरियल का शेष भाग मानता है कि आपके पास एक शेल खुला है जिसे TF वातावरण में आरंभ किया गया है।

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

एक परीक्षण वर्ग बनाएं (डी)

आइए एक हैलो वर्ल्ड टेस्ट बनाएं जो स्टडआउट के लिए एक संदेश भेजता है। एक ट्रेडफेड परीक्षण आम तौर पर IRemoteTest इंटरफ़ेस लागू करता है। यहां HelloWorldTest का कार्यान्वयन दिया गया है:

package com.android.tradefed.example;

import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.invoker.TestInformation;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.testtype.IRemoteTest;

public class HelloWorldTest implements IRemoteTest {
    @Override
    public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
        CLog.i("Hello, TF World!");
    }
}

इस नमूना कोड को <tree>/tools/tradefederation/core/src/com/android/tradefed/example/HelloWorldTest.java पर सहेजें और अपने शेल से ट्रेडफेड का पुनर्निर्माण करें:

m -jN

ध्यान दें कि उपरोक्त उदाहरण में CLog.i उपयोग आउटपुट को कंसोल पर निर्देशित करने के लिए किया जाता है। ट्रेड फेडरेशन में लॉग इन करने के बारे में अधिक जानकारी लॉगिंग (डी, आई, आर) में वर्णित है।

यदि निर्माण सफल नहीं होता है, तो यह सुनिश्चित करने के लिए मशीन सेटअप से परामर्श लें कि आपने एक भी कदम नहीं छोड़ा है।

एक कॉन्फ़िगरेशन बनाएं (I)

ट्रेड फेडरेशन परीक्षणों को एक कॉन्फ़िगरेशन बनाकर निष्पादन योग्य बनाया जाता है, एक XML फ़ाइल जो ट्रेडफेड को निर्देश देती है कि कौन सा परीक्षण (या परीक्षण) चलाना है, साथ ही कौन से अन्य मॉड्यूल को निष्पादित करना है और किस क्रम में करना है।

आइए हमारे HelloWorldTest के लिए एक नया कॉन्फ़िगरेशन बनाएं (HelloWorldTest का पूरा वर्ग नाम नोट करें):

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
</configuration>

इस डेटा को अपने स्थानीय फ़ाइल सिस्टम (जैसे /tmp/helloworld.xml ) पर कहीं भी helloworld.xml फ़ाइल में सहेजें। TF कॉन्फ़िगरेशन XML फ़ाइल (उर्फ कॉन्फ़िगरेशन ) को पार्स करेगा, प्रतिबिंब का उपयोग करके निर्दिष्ट वर्ग को लोड करेगा, इसे इंस्टेंटियेट करेगा, इसे IRemoteTest पर डालेगा, और इसकी run विधि को कॉल करेगा।

कॉन्फ़िगरेशन चलाएँ (आर)

अपने शेल से, ट्रेडफेड कंसोल लॉन्च करें:

tradefed.sh

सुनिश्चित करें कि एक उपकरण होस्ट मशीन से जुड़ा है और ट्रेडफेड को दिखाई दे रहा है:

tf> list devices
Serial            State      Product   Variant   Build   Battery
004ad9880810a548  Available  mako      mako      JDQ39   100

कॉन्फ़िगरेशन को run <config> कंसोल कमांड का उपयोग करके निष्पादित किया जा सकता है। कोशिश करना:

tf> run /tmp/helloworld.xml
05-12 13:19:36 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World!

आपको "हैलो, टीएफ वर्ल्ड!" देखना चाहिए टर्मिनल पर आउटपुट.

आप कंसोल प्रॉम्प्ट में list invocations या li का उपयोग करके यह पुष्टि कर सकते हैं कि कमांड चल रहा है, और इसे कुछ भी प्रिंट नहीं करना चाहिए। यदि आदेश वर्तमान में चल रहे हैं, तो वे निम्नानुसार प्रदर्शित होते हैं:

tf >l i
Command Id  Exec Time  Device       State
10          0m:00      [876X00GNG]  running stub on build(s) 'BuildInfo{bid=0, target=stub, serial=876X00GNG}'

कॉन्फ़िगरेशन को क्लासपाथ में जोड़ें (डी, आई, आर)

तैनाती की सुविधा के लिए, आप कॉन्फ़िगरेशन को ट्रेडफेड JARs में भी बंडल कर सकते हैं। ट्रेडफेड स्वचालित रूप से क्लासपाथ पर कॉन्फिग फ़ोल्डर्स में रखे गए सभी कॉन्फ़िगरेशन को पहचानता है।

उदाहरण के लिए, helloworld.xml फ़ाइल को ट्रेडफेड कोर लाइब्रेरी ( <tree>/tools/tradefederation/core/res/config/example/helloworld.xml ) में ले जाएँ। ट्रेडफेड का पुनर्निर्माण करें, ट्रेडफेड कंसोल को पुनरारंभ करें, फिर ट्रेडफेड को क्लासपाथ से कॉन्फ़िगरेशन की सूची प्रदर्शित करने के लिए कहें:

tf> list configs
[…]
example/helloworld: Runs the hello world test

अब आप हेलोवर्ल्ड कॉन्फिगरेशन का उपयोग करके चला सकते हैं:

tf> run example/helloworld
05-12 13:21:21 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World!

किसी डिवाइस के साथ इंटरैक्ट करें (डी, आर)

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

IRemoteTest#run विधि को कॉल करने पर फ्रेमवर्क द्वारा प्रदान किए गए TestInformation का उपयोग करके परीक्षण एंड्रॉइड डिवाइस का संदर्भ प्राप्त कर सकते हैं।

आइए डिवाइस का सीरियल नंबर प्रदर्शित करने के लिए HelloWorldTest प्रिंट संदेश को संशोधित करें:

@Override
public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber());
}

अब ट्रेडफेड का पुनर्निर्माण करें और उपकरणों की सूची जांचें:

tradefed.sh
tf> list devices
Serial            State      Product   Variant   Build   Battery
004ad9880810a548  Available  mako      mako      JDQ39   100

उपलब्ध के रूप में सूचीबद्ध क्रमांक पर ध्यान दें; यह वह उपकरण है जिसे HelloWorld को आवंटित किया जाना चाहिए:

tf> run example/helloworld
05-12 13:26:18 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World! I have device 004ad9880810a548

आपको डिवाइस का सीरियल नंबर प्रदर्शित करने वाला नया प्रिंट संदेश देखना चाहिए।

परीक्षा परिणाम भेजें (डी)

IRemoteTest #run विधि को प्रदान किए गए ITestInvocationListener उदाहरण पर कॉल विधियों द्वारा परिणामों की रिपोर्ट करता है। टीएफ फ्रेमवर्क स्वयं प्रत्येक आमंत्रण की शुरुआत ( ITestInvocationListener#invocationStarted के माध्यम से) और अंत ( ITestInvocationListener#invocationEnded के माध्यम से) की रिपोर्ट करने के लिए जिम्मेदार है।

टेस्ट रन परीक्षणों का एक तार्किक संग्रह है। परीक्षण परिणामों की रिपोर्ट करने के लिए, IRemoteTest एक परीक्षण रन की शुरुआत, प्रत्येक परीक्षण की शुरुआत और अंत और परीक्षण रन के अंत की रिपोर्ट करने के लिए जिम्मेदार है।

यहां बताया गया है कि एकल असफल परीक्षा परिणाम के साथ HelloWorldTest कार्यान्वयन कैसा दिख सकता है।

@Override
public void run(TestInformation testInfo, ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device " + testInfo.getDevice().getSerialNumber());

    TestDescription testId = new TestDescription("com.example.TestClassName", "sampleTest");
    listener.testRunStarted("helloworldrun", 1);
    listener.testStarted(testId);
    listener.testFailed(testId, "oh noes, test failed");
    listener.testEnded(testId, Collections.emptyMap());
    listener.testRunEnded(0, Collections.emptyMap());
}

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

स्टोर परीक्षण परिणाम (I)

TF कॉन्फ़िगरेशन के लिए डिफ़ॉल्ट परीक्षण श्रोता कार्यान्वयन TextResultReporter है, जो एक आमंत्रण के परिणामों को stdout में डंप करता है। उदाहरण के लिए, पिछले अनुभाग से HelloWorldTest कॉन्फ़िगरेशन चलाएँ:

./tradefed.sh
tf> run example/helloworld
04-29 18:25:55 I/TestInvocation: Invocation was started with cmd: /tmp/helloworld.xml
04-29 18:25:55 I/TestInvocation: Starting invocation for 'stub' with '[ BuildInfo{bid=0, target=stub, serial=876X00GNG} on device '876X00GNG']
04-29 18:25:55 I/HelloWorldTest: Hello, TF World! I have device 876X00GNG
04-29 18:25:55 I/InvocationToJUnitResultForwarder: Running helloworldrun: 1 tests
04-29 18:25:55 W/InvocationToJUnitResultForwarder:
Test com.example.TestClassName#sampleTest failed with stack:
 oh noes, test failed
04-29 18:25:55 I/InvocationToJUnitResultForwarder: Run ended in 0 ms

किसी आमंत्रण के परिणामों को कहीं और संग्रहीत करने के लिए, जैसे फ़ाइल में, अपने कॉन्फ़िगरेशन में result_reporter टैग का उपयोग करके एक कस्टम ITestInvocationListener कार्यान्वयन निर्दिष्ट करें।

TF में XmlResultReporter श्रोता भी शामिल है, जो चींटी JUnit XML लेखक द्वारा उपयोग किए जाने वाले प्रारूप के समान XML फ़ाइल में परीक्षण परिणाम लिखता है। कॉन्फ़िगरेशन में परिणाम_रिपोर्टर निर्दिष्ट करने के लिए, …/res/config/example/helloworld.xml कॉन्फ़िगरेशन संपादित करें:

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
    <result_reporter class="com.android.tradefed.result.XmlResultReporter" />
</configuration>

अब ट्रेडफेड का पुनर्निर्माण करें और हैलो वर्ल्ड नमूना फिर से चलाएँ:

tf> run example/helloworld
05-16 21:07:07 I/TestInvocation: Starting invocation for target stub on build 0 on device 004ad9880810a548
Hello, TF World! I have device 004ad9880810a548
05-16 21:07:07 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_2991649128735283633/device_logcat_6999997036887173857.txt
05-16 21:07:07 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_2991649128735283633/host_log_6307746032218561704.txt
05-16 21:07:07 I/XmlResultReporter: XML test result file generated at /tmp/0/inv_2991649128735283633/test_result_536358148261684076.xml. Total tests 1, Failed 1, Error 0

लॉग संदेश पर ध्यान दें जिसमें कहा गया है कि एक XML फ़ाइल तैयार की गई है; जेनरेट की गई फ़ाइल इस तरह दिखनी चाहिए:

<?xml version='1.0' encoding='UTF-8' ?>
<testsuite name="stub" tests="1" failures="1" errors="0" time="9" timestamp="2011-05-17T04:07:07" hostname="localhost">
  <properties />
  <testcase name="sampleTest" classname="com.example.TestClassName" time="0">
    <failure>oh noes, test failed
    </failure>
  </testcase>
</testsuite>

आप अपने स्वयं के कस्टम इनवोकेशन श्रोता भी लिख सकते हैं - उन्हें बस ITestInvocationListener इंटरफ़ेस को लागू करने की आवश्यकता है।

ट्रेडफेड एकाधिक आमंत्रण श्रोताओं का समर्थन करता है, ताकि आप परीक्षण परिणाम कई स्वतंत्र गंतव्यों पर भेज सकें। ऐसा करने के लिए, बस अपनी कॉन्फ़िगरेशन में एकाधिक <result_reporter> टैग निर्दिष्ट करें।

लॉगिंग सुविधाएं (डी, आई, आर)

टीएफ की लॉगिंग सुविधाओं में निम्नलिखित की क्षमता शामिल है:

  1. डिवाइस से लॉग कैप्चर करें (उर्फ डिवाइस लॉगकैट)
  2. होस्ट मशीन पर चल रहे ट्रेड फेडरेशन फ्रेमवर्क से रिकॉर्ड लॉग (जिसे होस्ट लॉग भी कहा जाता है)

टीएफ फ्रेमवर्क स्वचालित रूप से आवंटित डिवाइस से लॉगकैट को कैप्चर करता है और इसे प्रोसेसिंग के लिए इनवोकेशन श्रोता को भेजता है। XmlResultReporter फिर कैप्चर किए गए डिवाइस लॉगकैट को एक फ़ाइल के रूप में सहेजता है।

TF होस्ट लॉग को ddmlib लॉग क्लास के लिए CLog रैपर का उपयोग करके रिपोर्ट किया जाता है। आइए HelloWorldTest में पिछले System.out.println कॉल को CLog कॉल में बदलें:

@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
    CLog.i("Hello, TF World! I have device %s", getDevice().getSerialNumber());

CLog String.format के समान सीधे स्ट्रिंग इंटरपोलेशन को संभालता है। जब आप टीएफ का पुनर्निर्माण और पुनः चलाते हैं, तो आपको stdout पर लॉग संदेश देखना चाहिए:

tf> run example/helloworld
…
05-16 21:30:46 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548
…

डिफ़ॉल्ट रूप से, ट्रेडफेड होस्ट लॉग संदेशों को stdout पर आउटपुट करता है । TF में एक लॉग कार्यान्वयन भी शामिल है जो फ़ाइल में संदेश लिखता है: FileLogger । फ़ाइल लॉगिंग जोड़ने के लिए, FileLogger का पूर्ण वर्ग नाम निर्दिष्ट करते हुए, कॉन्फ़िगरेशन में एक logger टैग जोड़ें:

<configuration description="Runs the hello world test">
    <test class="com.android.tradefed.example.HelloWorldTest" />
    <result_reporter class="com.android.tradefed.result.XmlResultReporter" />
    <logger class="com.android.tradefed.log.FileLogger" />
</configuration>

अब, हेलोवर्ल्ड उदाहरण को दोबारा बनाएं और चलाएं:

tf >run example/helloworld
…
05-16 21:38:21 I/XmlResultReporter: Saved device_logcat log to /tmp/0/inv_6390011618174565918/device_logcat_1302097394309452308.txt
05-16 21:38:21 I/XmlResultReporter: Saved host_log log to /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt
…

लॉग संदेश होस्ट लॉग के पथ को इंगित करता है, जिसे देखने पर, आपका HelloWorldTest लॉग संदेश शामिल होना चाहिए:

more /tmp/0/inv_6390011618174565918/host_log_4255420317120216614.txt

उदाहरण आउटपुट:

…
05-16 21:38:21 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548

हैंडलिंग विकल्प (डी, आई, आर)

टीएफ कॉन्फ़िगरेशन (उर्फ कॉन्फ़िगरेशन ऑब्जेक्ट्स ) से लोड की गई वस्तुएं @Option एनोटेशन के उपयोग के माध्यम से कमांड लाइन तर्कों से भी डेटा प्राप्त कर सकती हैं।

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

नोट: सभी फ़ील्ड प्रकार समर्थित नहीं हैं. समर्थित प्रकारों के विवरण के लिए, विकल्पसेटर देखें।

आइए HelloWorldTest में एक @Option जोड़ें:

@Option(name="my_option",
        shortName='m',
        description="this is the option's help text",
        // always display this option in the default help text
        importance=Importance.ALWAYS)
private String mMyOption = "thisisthedefault";

इसके बाद, आइए HelloWorldTest में विकल्प का मान प्रदर्शित करने के लिए एक लॉग संदेश जोड़ें ताकि हम यह प्रदर्शित कर सकें कि यह सही ढंग से प्राप्त हुआ था:

@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
    …
    CLog.logAndDisplay(LogLevel.INFO, "I received option '%s'", mMyOption);

अंत में, TF का पुनर्निर्माण करें और helloworld चलाएँ; आपको my_option डिफ़ॉल्ट मान वाला एक लॉग संदेश देखना चाहिए:

tf> run example/helloworld
…
05-24 18:30:05 I/HelloWorldTest: I received option 'thisisthedefault'

कमांड लाइन से मान पास करें

my_option के लिए एक मान डालें; आपको my_option उस मान से भरा हुआ देखना चाहिए:

tf> run example/helloworld --my_option foo
…
05-24 18:33:44 I/HelloWorldTest: I received option 'foo'

TF कॉन्फ़िगरेशन में एक सहायता प्रणाली भी शामिल है, जो स्वचालित रूप से @Option फ़ील्ड के लिए सहायता टेक्स्ट प्रदर्शित करती है। इसे अभी आज़माएं, और आपको my_option के लिए सहायता टेक्स्ट देखना चाहिए:

tf> run example/helloworld --help
Printing help for only the important options. To see help for all options, use the --help-all flag

  cmd_options options:
    --[no-]help          display the help text for the most important/critical options. Default: false.
    --[no-]help-all      display the full help text for all options. Default: false.
    --[no-]loop          keep running continuously. Default: false.

  test options:
    -m, --my_option      this is the option's help text Default: thisisthedefault.

  'file' logger options:
    --log-level-display  the minimum log level to display on stdout. Must be one of verbose, debug, info, warn, error, assert. Default: error.

"केवल महत्वपूर्ण विकल्पों को प्रिंट करना" के बारे में संदेश पर ध्यान दें। विकल्प सहायता अव्यवस्था को कम करने के लिए, TF यह निर्धारित करने के लिए Option#importance विशेषता का उपयोग करता है कि --help निर्दिष्ट होने पर एक विशेष @Option फ़ील्ड सहायता टेक्स्ट दिखाना है या नहीं। --help-all महत्व की परवाह किए बिना, सभी @Option फ़ील्ड के लिए हमेशा मदद दिखाता है। विवरण के लिए, विकल्प.महत्व देखें।

किसी कॉन्फ़िगरेशन से मान पास करें

आप <option name="" value=""> तत्व जोड़कर कॉन्फ़िगरेशन के भीतर एक विकल्प मान भी निर्दिष्ट कर सकते हैं। helloworld.xml उपयोग करके इसका परीक्षण करें:

<test class="com.android.tradefed.example.HelloWorldTest" >
    <option name="my_option" value="fromxml" />
</test>

हेलोवर्ल्ड को फिर से बनाने और चलाने से अब यह आउटपुट मिलना चाहिए:

05-24 20:38:25 I/HelloWorldTest: I received option 'fromxml'

my_option के डिफ़ॉल्ट मान को इंगित करने के लिए कॉन्फ़िगरेशन सहायता को भी अपडेट किया जाना चाहिए:

tf> run example/helloworld --help
  test options:
    -m, --my_option      this is the option's help text Default: fromxml.

हेलोवर्ल्ड कॉन्फिगरेशन में शामिल अन्य कॉन्फिगरेशन ऑब्जेक्ट, जैसे FileLogger भी विकल्प स्वीकार करते हैं। विकल्प --log-level-display दिलचस्प है क्योंकि यह stdout पर दिखाई देने वाले लॉग को फ़िल्टर करता है। इससे पहले ट्यूटोरियल में, आपने देखा होगा कि "हैलो, टीएफ वर्ल्ड! मेरे पास डिवाइस है...' जब हमने FileLogger उपयोग करना शुरू किया तो लॉग संदेश स्टडआउट पर प्रदर्शित होना बंद हो गया। आप इसमें पास करके स्टडआउट में लॉगिंग की वर्बोसिटी बढ़ा सकते हैं --log-level-display arg.

इसे अभी आज़माएं, और आपको फ़ाइल में लॉग इन होने के अलावा, 'मेरे पास डिवाइस है' लॉग संदेश stdout पर फिर से दिखाई देना चाहिए:

tf> run example/helloworld --log-level-display info
…
05-24 18:53:50 I/HelloWorldTest: Hello, TF World! I have device 004ad9880810a548

कि सभी लोग!

एक अनुस्मारक के रूप में, यदि आप किसी चीज़ पर अटके हुए हैं, तो ट्रेड फेडरेशन स्रोत कोड में बहुत सारी उपयोगी जानकारी है जो दस्तावेज़ में उजागर नहीं हुई है। यदि बाकी सब विफल हो जाता है, तो संदेश विषय में "ट्रेड फेडरेशन" के साथ एंड्रॉइड-प्लेटफ़ॉर्म Google समूह पर पूछने का प्रयास करें।