मोबाइल अनुप्रयोगों के लिए Jank — यह क्या है, कारण और समाधान

लेखक: IT Sectr प्रकाशित: 2026-04-01 पढ़ने का समय: 10 मिनट

Jank एक शब्द है जो इंटरफ़ेस एनिमेशन में अलग-अलग फ्रेम छूट जाने के कारण होने वाली ध्यान देने योग्य रुकावट या “हिचकी” को दर्शाता है। मोबाइल ऐप्स में, Jank तब होता है जब फ्रेम रेंडरिंग का समय डिस्प्ले रिफ्रेश रेट द्वारा आवंटित बजट से अधिक हो जाता है। Android Developers, 2025 के अनुसार, Jank “धीमेपन” की व्यक्तिपरक भावना का मुख्य कारण है — ऐप कार्यात्मक रूप से सही हो सकता है, लेकिन उपयोगकर्ता इसे अस्थिर FPS के कारण धीमा मानता है।

मुख्य बातें

  • Jank — छूटे हुए फ्रेम जो एनिमेशन रुकावट के रूप में दिखाई देते हैं।
  • मुख्य कारण प्रति फ्रेम समय बजट (60 FPS के लिए 16.6 ms) से अधिक होना है।
  • Jank भारी Layout, लंबे GC, मुख्य थ्रेड ब्लॉकिंग या overdraw के कारण होता है।
  • निदान के लिए FrameTimeline (Android) और Instruments (iOS) का उपयोग किया जाता है।
  • Jank को खत्म करने से NPS और उपयोगकर्ता प्रतिधारण 15–25% बढ़ जाता है।

Jank क्या है

Jank कंप्यूटर ग्राफिक्स का एक शब्द है जो एक दृश्य दोष को दर्शाता है जिसमें एनिमेशन चिकनी गति के बजाय झटके से चलता है। मोबाइल डेवलपमेंट में, Jank को प्रति इकाई समय में छूटे हुए फ्रेम (skipped frames) की संख्या के रूप में मापा जाता है। यदि सिस्टम VSync के समय तक फ्रेम तैयार नहीं कर पाता, तो डिस्प्ले पिछले फ्रेम को दोहराता है — 60 Hz पर 16.6 ms का ठहराव होता है। एक छूटा हुआ फ्रेम ध्यान देने योग्य नहीं हो सकता, लेकिन लगातार 3–5 छूटे हुए फ्रेम 50–80 ms की “रुकावट” की भावना पैदा करते हैं, जिसे उपयोगकर्ता स्पष्ट रूप से महसूस करता है।

Jank उन एनिमेशन के लिए विशेष रूप से महत्वपूर्ण है जिन्हें स्थिर गति से चलना चाहिए: फ़ीड स्क्रॉलिंग, मेनू खोलने का एनिमेशन, पैरालैक्स प्रभाव, स्क्रीन के बीच संक्रमण। Google UX अध्ययन (2024) के अनुसार, जिस ऐप में 3% से अधिक स्क्रॉल सत्रों में Jank दर है, उसे 0.5% से कम दर वाले ऐप की तुलना में 22% अधिक एक-सितारा समीक्षाएँ मिलती हैं। Android Vitals उपकरण स्वचालित रूप से Jank को ट्रैक करता है और इसे गंभीरता के अनुसार वर्गीकृत करता है: मध्यम, गंभीर और अत्यधिक।

Jank के मुख्य कारण

Jank के कारण कई श्रेणियों में विभाजित हैं। पहला — Layout Jank: View के आकार में बदलाव, LayoutTransition एनिमेशन या डायनामिक कंटेंट लोडिंग के कारण बार-बार requestLayout() कॉल से उत्पन्न होता है। प्रत्येक requestLayout कॉल पूरे View उप-वृक्ष के लिए Measure + Layout शुरू करता है, जिसमें 5–30 ms लग सकते हैं। दूसरा — Draw Jank: overdraw और भारी drawable के उपयोग से संबंधित। तीसरा — Thread Jank: सिंक्रोनस संचालन के कारण मुख्य थ्रेड ब्लॉकिंग — फ़ाइल लोडिंग, मुख्य थ्रेड पर डेटाबेस संचालन, Bitmap डिकोडिंग।

चौथी श्रेणी — GC Jank: ART/Dalvik या Swift ARC में कचरा संग्रह (Garbage Collection)। जब हीप में कई ऑब्जेक्ट जमा हो जाते हैं, तो GC 5–15 ms का Stop-The-World ठहराव शुरू करता है। Android पर, GC ठहराव अक्सर लूप में बार-बार आवंटन के दौरान होते हैं: onDraw() में ऑब्जेक्ट बनाना, एडेप्टर में आवंटन, अप्रयुक्त lambda अभिव्यक्तियाँ। पाँचवाँ — IPC Jank: मुख्य थ्रेड पर अंतर-प्रक्रिया संचार (ContentProvider, Binder)। छठा — Rendering Jank: अनुकूलित शेडर या बड़े आकार की बनावट के कारण धीमी GPU रेंडरिंग।

Jank प्रकारकारणसामान्य अवधिपता लगाने का उपकरण
LayoutrequestLayout, relayout5–30 msPerfetto, Systrace
DrawOverdraw, भारी drawable3–20 msGPU Profiling
Threadमुख्य थ्रेड ब्लॉकिंग10–200 msAndroid Studio Profiler
GCGarbage Collection5–15 msMemory Profiler
RenderingGPU लोड10–50 msGPU Tracer, Xcode GPU

Android में Jank का निदान

Android में, Jank का निदान Perfetto सिस्टम ट्रेस से शुरू होता है। Perfetto सभी थ्रेड, CPU, GPU और शेड्यूलर की गतिविधि रिकॉर्ड करता है। Jank का स्पष्ट संकेतक Choreographer.doFrame और Choreographer.doCallbacks पंक्तियाँ हैं: यदि दो क्रमिक doFrame कॉल के बीच का अंतराल 16.6 ms से अधिक है, तो फ्रेम छूट गया है। Perfetto सटीक कारण दिखाता है — कौन सा system call, lock या GC विलंब का कारण बना। Android Studio Profiler में, CPU Profiler के माध्यम से समान कार्यक्षमता उपलब्ध है।

प्रोडक्शन में स्वचालित Jank पहचान के लिए FrameMetricsAggregator का उपयोग किया जाता है — एक API जो प्रत्येक फ्रेम के लिए आँकड़े एकत्र करता है और उन्हें सत्र के अनुसार एकत्रित करता है। Android 12+ में PerformanceHintManager आया — सिस्टम को लक्ष्य फ्रेम दर के बारे में संकेत देने के लिए एक API। यदि ऐप इंगित करता है कि वह 120 FPS परिदृश्य में चल रहा है, तो सिस्टम Jank को रोकने के लिए CPU/GPU आवृत्ति बढ़ा सकता है। सभी छूटे हुए फ्रेम की सरल लॉगिंग के लिए, Choreographer.FrameCallback की सदस्यता लेना पर्याप्त है।

Choreographer के माध्यम से Jank लॉगिंग

Kotlin कोड Choreographer.FrameCallback की सदस्यता लेता है और विलंब अवधि के साथ प्रत्येक छूटे हुए फ्रेम को लॉग करता है। कॉलबैक प्रत्येक VSync पर लागू होता है।

kotlin
class JankDetector {

    private val frameBudget = 16_666_666L
    private var previousFrameTime = 0L

    private val callback =
        Choreographer.FrameCallback { currentTime ->
            if (previousFrameTime != 0L) {
                val frameDuration =
                    currentTime - previousFrameTime
                val skippedFrames =
                    (frameDuration / frameBudget) - 1
                if (skippedFrames > 0) {
                    Log.w("Jank",
                        "Skipped $skippedFrames frames")
                }
            }
            previousFrameTime = currentTime
            Choreographer.getInstance()
                .postFrameCallback(this)
        }

    fun start() {
        Choreographer.getInstance()
            .postFrameCallback(callback)
    }
}

iOS में Jank का निदान

iOS में, Jank का निदान Core Animation टेम्पलेट के साथ Instruments के माध्यम से किया जाता है। Instruments वास्तविक समय में FPS, ऑफस्क्रीन रेंडर की संख्या और हिट परीक्षण दिखाता है। iOS में Jank के मुख्य संकेतक: Core Animation टाइमलाइन पर लाल बार (फ्रेम बजट से अधिक), उच्च Renderer मान (ऑफस्क्रीन रेंडरिंग का संकेत) और कम FPS। प्रोडक्शन निगरानी के लिए, MetricKit MXAnimatoryMetric मीट्रिक के साथ रिपोर्ट एकत्र करता है, जिसमें औसत FPS, P50 और P95 फ्रेम समय शामिल है।

iOS में मूल Jank निदान में टाइमस्टैम्प और targetTimestamp जाँच के साथ CADisplayLink शामिल है। यदि वर्तमान टाइमस्टैम्प targetTimestamp से काफी पीछे है, तो एक या अधिक फ्रेम छूट गए हैं। Apple कस्टम प्रोफाइलिंग के लिए os_signpost का उपयोग करने की भी सिफारिश करता है: फ्रेम रेंडरिंग की शुरुआत और अंत में signpost-interval रखें और Instruments में देखें कि कौन से अंतराल 16.6 ms से अधिक हैं। SwiftUI में, Jank निदान के लिए UIView.invalidateIntrinsicContentSize का उपयोग किया जाता है — इस विधि का बार-बार कॉल अस्थिर Layout का संकेत देता है।

CADisplayLink Jank पहचान के लिए

Swift कोड CADisplayLink के माध्यम से छूटे हुए फ्रेम का पता लगाता है। यदि टाइमस्टैम्प और targetTimestamp के बीच का अंतर 16.6 ms से अधिक है, तो Jank दर्ज किया जाता है।

swift
class JankMonitor {

    private var displayLink: CADisplayLink?
    private var totalJank = 0

    func start() {
        displayLink = CADisplayLink(
            target: self,
            selector: #selector(detectJank)
        )
        displayLink?.add(to: .current,
            forMode: .common)
    }

    @objc
    private func detectJank() {
        guard let link = displayLink else { return }
        let delay = link.targetTimestamp
            - link.timestamp
        if delay > 0.0167 {
            totalJank += 1
        }
    }
}

Jank प्रोफाइलिंग उपकरण

Jank प्रोफाइलिंग के लिए, अंतर्निहित OS उपकरण और तृतीय-पक्ष SDK दोनों का उपयोग किया जाता है। Android पर, मुख्य उपकरण Perfetto है (जिसने Systrace को बदल दिया)। Perfetto 30 सेकंड तक के ट्रेस रिकॉर्ड कर सकता है और वेब इंटरफ़ेस ui.perfetto.dev के माध्यम से उनका विश्लेषण कर सकता है। यह Choreographer गतिविधि, रेंडरिंग थ्रेड (RenderThread) और GPU के साथ एक सटीक टाइमलाइन दिखाता है। GPU समस्याओं के विस्तृत विश्लेषण के लिए, AGI (Android GPU Inspector) का उपयोग किया जाता है, जो न केवल फ्रेम समय बल्कि विशिष्ट GPU ब्लॉक — शेडर, रैस्टराइज़र, टेक्सचर यूनिट — पर लोड भी दिखाता है।

iOS पर, समकक्ष Core Animation, Metal System Trace और GPU Driver टेम्पलेट के साथ Instruments है। Core Animation FPS और फ्रेम समय दिखाता है, Metal System Trace प्रत्येक draw call तक GPU कार्य दिखाता है। लोड के तहत वास्तविक उपकरणों पर प्रोफाइलिंग के लिए, Firebase Performance (Screen Rendering मीट्रिक एकत्र करता है) और Sentry (Jank पर stack trace कैप्चर करता है) का उपयोग किया जाता है। नया Android 15 Performance Hint API डेवलपर को सिस्टम को बताने की अनुमति देता है कि कौन से फ्रेम महत्वपूर्ण हैं और Jank निकट आने पर सिस्टम से चेतावनी प्राप्त करता है।

प्रोडक्शन में FrameMetricsAggregator

Kotlin कोड एक सत्र में फ्रेम आँकड़े एकत्र करने के लिए FrameMetricsAggregator का उपयोग करता है। एग्रीगेटर को रोकने के बाद, छूटे हुए फ्रेम की संख्या प्रदर्शित होती है।

kotlin
class JankAggregator(private val activity: Activity) {

    private val aggregator = FrameMetricsAggregator()

    fun startCollection() {
        aggregator.add(activity.window)
    }

    fun stopAndReport() {
        aggregator.remove()
        val result = aggregator.getMetrics()
        val totalFrames = result
            ?.get(FrameMetrics.TOTAL_DURATION)
            ?.size ?: 0
        val jankFrames = result
            ?.get(FrameMetrics.TOTAL_DURATION)
            ?.count { it > 16_666_666L} ?: 0
        Log.d("JankReport",
            "Jank ratio: \${jankFrames * 100 / totalFrames}%")
    }
}

फ्रेम रुकावट दूर करने के तरीके

Jank को खत्म करने के लिए इसके प्रकार के आधार पर तकनीकों के संयोजन की आवश्यकता होती है। Layout Jank के लिए: गहरी पदानुक्रम को ConstraintLayout/Compose/SwiftUI से बदलें, merge टैग का उपयोग करें, एनिमेशन में requestLayout से बचें। Draw Jank के लिए: 4x+ overdraw खोजने के लिए Debug GPU Overdraw का उपयोग करें, भारी drawable को वेक्टर ग्राफिक्स (VectorDrawable/PDF) से बदलें, hardware layers का सावधानी से उपयोग करें — वे रेंडरिंग को गति देते हैं लेकिन अधिक GPU मेमोरी खपत करते हैं। Thread Jank के लिए: सभी I/O संचालन, डेटाबेस कार्य और Bitmap डिकोडिंग को पृष्ठभूमि थ्रेड में ले जाएँ, सही Dispatcher के साथ Kotlin Coroutines या Schedulers.io() के साथ RxJava का उपयोग करें।

GC Jank के लिए: onDraw() और getView() में आवंटन कम करें, ऑब्जेक्ट पूल (ObjectPool) का उपयोग करें, for-each को इंडेक्स्ड for से बदलें, Kotlin में copy() के साथ immutable data class का सावधानी से उपयोग करें — copy एक नया ऑब्जेक्ट बनाता है। IPC Jank के लिए: App Startup के माध्यम से ContentProvider को आलसी तरीके से प्रारंभ करें, Binder कॉल को पृष्ठभूमि थ्रेड में ले जाएँ। Rendering Jank के लिए: बनावट का आकार अधिकतम स्क्रीन रिज़ॉल्यूशन तक कम करें, ASTC या ETC2 संपीड़न का उपयोग करें, अत्यधिक शेडर संकलन से बचें (शेडर पहले से संकलित करें)। एक व्यापक समाधान CI में नियमित Perfetto/Instruments प्रोफाइलिंग और Jank प्रतिगमन को ट्रैक करना है।

Anti-Jank पैटर्न: Async Layout

Kotlin कोड reportFullyDrawn के बाद स्क्रीन पर डेटा की अतुल्यकालिक लोडिंग प्रदर्शित करता है, ताकि भारी कार्य पहले फ्रेम को ब्लॉक न करे। कॉलबैक उपयोगकर्ता द्वारा इंटरफ़ेस देखने के बाद लागू होता है।

kotlin
class JankSafeLoader {

    suspend fun loadAfterFirstFrame(
        activity: Activity
    ) {
        // गारंटी है कि पहला फ्रेम पहले ही रेंडर हो चुका है
        if (Build.VERSION.SDK_INT >= 29) {
            activity.reportFullyDrawn()
        }

        // भारी लोडिंग — पहले फ्रेम के बाद
        withContext(Dispatchers.IO) {
            val data = fetchHeavyData()
            withContext(Dispatchers.Main) {
                updateUI(data)
            }
        }
    }
}

अक्सर पूछे जाने वाले प्रश्न

मोबाइल ऐप्स में Jank क्या है?

Jank छूटे हुए रेंडरिंग फ्रेम हैं जो एनिमेशन में ध्यान देने योग्य रुकावट या झटके के रूप में प्रकट होते हैं। यह तब होता है जब फ्रेम तैयार करने का समय समय बजट (60 FPS के लिए 16.6 ms) से अधिक हो जाता है।

Jank के मुख्य कारण क्या हैं?

Layout Jank (बार-बार requestLayout), Draw Jank (overdraw), Thread Jank (मुख्य थ्रेड ब्लॉकिंग), GC Jank (कचरा संग्रह), IPC Jank (Binder कॉल) और Rendering Jank (भारी शेडर) ।

Android में Jank का निदान कैसे करें?

सिस्टम ट्रेसिंग के लिए Perfetto, फ्रेम चरण विश्लेषण के लिए GPU Profiling और प्रोडक्शन निगरानी के लिए FrameMetricsAggregator का उपयोग करें। Android Studio में — Deep Java Trace के साथ CPU Profiler।

iOS में Jank कैसे मापें?

Instruments के माध्यम से Core Animation या Metal System Trace टेम्पलेट के साथ। प्रोडक्शन के लिए — MXAnimatoryMetric के साथ MetricKit । प्रोग्रामेटिक रूप से — टाइमस्टैम्प और targetTimestamp के बीच अंतर जाँचने वाला CADisplayLink।

Jank का कितना प्रतिशत गंभीर माना जाता है?

Google के अनुसार, 3% से अधिक स्क्रॉल सत्रों में Jank दर (प्रति 100 स्क्रॉल में 3 में रुकावट) नकारात्मक समीक्षाओं में 22% की वृद्धि का कारण बनती है। लक्ष्य दर 0.5% स्क्रॉल सत्रों से कम है।

सारांश

  • Jank — छूटे हुए फ्रेम जो मोबाइल ऐप एनिमेशन में दृश्य रुकावट पैदा करते हैं।
  • मुख्य कारण: Layout Jank, Draw Jank, Thread Jank, GC Jank, IPC Jank और Rendering Jank.
  • Android पर Jank निदान — Perfetto, GPU Profiling और FrameMetricsAggregator के माध्यम से।
  • iOS पर Jank निदान — Instruments, CADisplayLink और MetricKit के माध्यम से।
  • Jank को खत्म करने के लिए आवश्यक: सपाट पदानुक्रम, पृष्ठभूमि थ्रेड, न्यूनतम आवंटन, कैशिंग।
  • लक्ष्य Jank दर — 0.5% स्क्रॉल सत्रों से कम रुकावट के साथ।
  • नियमित CI प्रोफाइलिंग प्रोडक्शन में पहुँचने से पहले प्रदर्शन प्रतिगमन को रोकता है।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें