2013-01-02 17 views
16

एंड्रॉइड ऐप के स्टार्टअप समय को मापने का सबसे सटीक तरीका क्या है?एंड्रॉइड ऐप स्टार्टअप समय मापें

स्टार्टअप समय तक मैं 2. और 3. के बीच का अंतर मतलब है:

  1. एप्लिकेशन प्रक्रिया लांचर
  2. मुख्य गतिविधि पूरी तरह से
  3. आरंभ नहीं हो जाता में
  4. एप्लिकेशन आइकन पर उपयोगकर्ता क्लिक करता है नहीं चल रहा है

इसलिए जेवीएम शुरू होने और लॉग इन करने के बाद मुझे मूल रूप से समय बीतने की आवश्यकता है।

+0

"स्टार्टअप समय से मेरा मतलब है 2. और 3. के बीच का अंतर।" वह 1 होगा या संभवतः -1। :-) अधिक गंभीरता से, क्या आप अपना खुद का फर्मवेयर बना रहे हैं, या आप इसे स्टॉक वातावरण से प्राप्त करने की कोशिश कर रहे हैं? साथ ही, क्या यह एक विकास-समय की बात है, या उत्पादन-रनटाइम पूछताछ है? – CommonsWare

+0

मैं इसे विकास के दौरान विभिन्न उपकरणों और एंड्रॉइड संस्करणों पर स्टार्टअप समय को ट्रैक करना चाहता हूं। एक और कारण यह है कि कुछ उपयोगकर्ता ने शिकायत की कि अंतिम अपडेट के बाद से ऐप स्टार्टअप धीमा हो गया है, इसलिए संख्याओं को देखना अच्छा लगेगा। निस्संदेह मैं केवल समय को माप सकता हूं क्योंकि क्रिएट() को बुलाया गया था ... लेकिन वास्तविक स्टार्टअप समय को जानना बेहतर लगता है :) यह मुझे यह भी कहने की अनुमति देता है कि "यह स्टार्टअप समय केवल 5% तक धीमा हो जाता है", इसलिए यह नहीं है बड़ी बात। – fhucho

उत्तर

1

मुझे समझ में आता है कि मुझे जवाब देने में बहुत देर हो चुकी है, फिर भी, यह सवाल का जवाब देता है।

यह जानकारी एपीआई संस्करण 1 9 या उच्चतम के लिए डिफ़ॉल्ट रूप से लॉगकैट पर लॉग हो जाती है।

एंड्रॉइड 4.4 (एपीआई लेवल 1 9) से, लॉगकैट में एक आउटपुट लाइन शामिल है जिसमें प्रदर्शित मूल्य कहा जाता है। यह मान प्रक्रिया को लॉन्च करने और स्क्रीन पर संबंधित गतिविधि को चित्रित करने के बीच समाप्त होने वाली अवधि का प्रतिनिधित्व करता है।

ActivityManager: प्रदर्शित com.android.myexample/.StartupTiming: + 3s534ms

कुंजी सही जगह में यह की तलाश में है -

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

निष्कर्ष documentation से हैं।

+0

धन्यवाद, सही उत्तर के रूप में चिह्नित। – fhucho

0

onCreate() विधि की शुरुआत में और onCreate() method के अंत में समय बचाने के लिए और फिर ऐप को प्रारंभ करने के लिए समय निकालने के लिए एक-दूसरे से घटाना एक संभावना होगी।

+0

दुर्भाग्यवश उपयोगकर्ता द्वारा ऐप लॉन्च किए जाने के पल और क्रेट() पर पल के बीच का समय माप नहीं आता है। – fhucho

4

TimingLogger में पूरे onCreate() विधि को लपेटें।

timings.dumpToLog(); 

आप कुछ मध्यवर्ती कदम पर बार छोड़ने के लिए चाहते हैं, आप ऐसा कर सकते हैं timings.addSplit("name"); समय इसे पाने के लिए ले लिया पाने के लिए: अंत में इस

TimingLogger timings = new TimingLogger(TAG, "methodA"); 

और: बस शुरुआत में इस डाल उस कदम के लिए।

+0

मुझे टिमिंग लॉगर के बारे में पता नहीं था, टिप के लिए धन्यवाद। हालांकि, यह उपयोगकर्ता द्वारा ऐप लॉन्च होने के पल और क्रेट() पर पल के बीच का समय मापता नहीं है। – fhucho

9

मैं आपके प्रश्न की व्याख्या करने जा रहा हूं 'क्या मेरा ऐप स्टार्टअप समय पर्याप्त तेज़ है। मैं कैसे जांच सकता हूं कि मैंने जो कुछ भी किया है, मैंने किया है?

स्टार्टअप समय काफी हद तक एक झूठी मीट्रिक है क्योंकि यह डिवाइस और रोम में भिन्न होगा। मुझे लगता है कि आपको सबसे ज्यादा रुचि रखने की संभावना है कि आपके कोड को निष्पादित करने में कितना समय लग रहा है और संभावित रूप से मुख्य धागे को अवरुद्ध कर रहा है।

मुझे यह करने का सबसे प्रभावी तरीका यह है कि ऐप शुरू होने पर Traceview का उपयोग करना है और फिर समीक्षा करना है कि इसे निष्पादित करने में विधि कितनी देर लगती है और यदि मुख्य धागे पर कोई अंतर होता है।

प्रारंभ अनुरेखण:

public class MyApplication extends Application { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Debug.startMethodTracing("startup"); 
    } 
} 

बंद करो ट्रेसिंग:

@Override 
public void onViewCreated(final View view, final Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
    Debug.stopMethodTracing(); 
} 

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

main thread blocked

यह मालूम है कि दोनों Crashlytics और Coremetrics randomUUID() जो तब धागे पर सिंक्रनाइज़ किया जा रहा था के लिए एक कॉल की आवश्यकता होती है और मुख्य थ्रेड को अवरुद्ध कर रहे थे। समाधान कोरमेट्रिक्स कोड को शुरू करने के लिए बस एक नया धागा स्पिन करने के लिए था।

यह ऐसा कुछ है जिसे मैंने स्टार्टअप समय को मापने के साथ अन्यथा नहीं उठाया होगा, लेकिन वास्तव में कुछ सौ मिलीसेकंड द्वारा ऐप 'स्टार्टअप टाइम' को बढ़ा दिया गया है।

यहाँ कोरमीट्रिक initialisation के लिए एक अलग थ्रेड का चक्कर के बाद एक और स्नैपशॉट है:

main thread not blocked

0

यह समय अगले कोड का उपयोग कर ट्रैक को लागू करने के लिए संभव है: ओवरराइड

अपने Application:

public class CustomApplication extends Application { 
    public final static long APP_START_TIME = System.currentTimeMillis(); 

    /** 
    * Do all other application stuff 
    */ 
} 

और अपने मुख्य Activity पर कुछ पंक्तियां जोड़ें:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final View contentView = findViewById(android.R.id.content); 
     contentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       if (Build.VERSION.SDK_INT >= 16) { 
        contentView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
       } else { 
        contentView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
       } 
       long launchTime = System.currentTimeMillis() - CustomApplication.APP_START_TIME; 
       Log.e("TEST", "App launch time = " + launchTime); 
      } 
     }); 
    } 
} 

और भूल नहीं है Manifest में अपने कस्टम आवेदन परिभाषित करने के लिए:

<application 
    android:label="@string/app_name" 
    android:name=".CustomApplication" > 

</application> 

महत्वपूर्ण: क्योंकि आवेदन भंडार स्थिर चर जो प्रारंभिक समय पटरियों आप लॉन्च से पहले अपने आवेदन को मारने के लिए की है।

5

नीचे दिए गए एडीबी खोल में जांचें।

adb shell 
adb logcat -b events | grep am_activity_launch_time 

[Output] 
01-01 12:32:53.469 1236 1262 I am_activity_launch_time: 
    [0,205360373,com.sec.android.app.clockpackage/.ClockPackage,378,**378**,0] 

Remarks: 
Launch time for Clock is 378ms. 
+2

नए उपकरणों पर ActivityManager इसे थोड़ा अलग करता है, इसलिए इसका उपयोग करें: "adb logcat -s ActivityManager: I | grep प्रदर्शित"। परिणाम "I/ActivityManager (288) जैसा होगा: प्रदर्शित com.foo.bar/.main.MainActivity: + 1s313ms"। –

0

उपयोग SysTrace

भी ट्रेस वर्ग

Trace.beginSection("name"); 
Trace.endSection(); 

का उपयोग कर इस YouTube video एक त्वरित प्राइमर के साथ-साथ है वर्गों को मापने के लिए इस्तेमाल किया जा सकता।

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