মোবাইল ডেভেলপমেন্টে পারফরম্যান্স: এটি কী, কী মেট্রিক্স এবং কীভাবে উন্নত করবেন

লেখক: IT Sectr প্রকাশিত: 2026-03-25 পড়ার সময়: 12 মিনিট

ধীরগতির অ্যাপ হল প্রধান কারণ যার জন্য ব্যবহারকারীরা প্রোগ্রাম ডিলিট করে। স্টার্টআপে বা স্ক্রল করার সময় মিলিসেকেন্ডের বিলম্ব retention দশক শতাংশ কমিয়ে দেয়। পারফরম্যান্স (performance) — শুধু গতি নয়, বরং স্থিতিশীলতাও: ANR, ক্র্যাশ এবং মেমরি লিকের অনুপস্থিতি। এই নিবন্ধে আমরা পারফরম্যান্সের সকল দিক কভার করব: মেমরি ম্যানেজমেন্ট (GC, ARC) থেকে টুলস দিয়ে প্রোফাইলিং পর্যন্ত। আরও জানতে — অফিসিয়াল Android Performance গাইড দেখুন।

মূল পয়েন্ট

  • ANR এবং ক্র্যাশ — ব্যবহারকারীর অভিজ্ঞতার প্রধান শত্রু; ব্যাকগ্রাউন্ড থ্রেড দিয়ে প্রতিরোধ করা হয়
  • মেমরি লিক এবং রিটেইন সাইকেল OOM ক্র্যাশের কারণ; উইক রেফারেন্স এবং ইউটিলিটি দিয়ে সমাধান করা হয়
  • GC (Android) এবং ARC (iOS) — মেমরি ম্যানেজমেন্ট মডেল; এগুলোর কাজ বোঝা জরুরি
  • প্রোফাইলিং (Instruments, Android Profiler, LeakCanary) — ডেভেলপমেন্টের বাধ্যতামূলক ধাপ
  • কোল্ড স্টার্ট — সবচেয়ে গুরুত্বপূর্ণ লঞ্চ মেট্রিক; Application.onCreate অপটিমাইজেশন এবং লেজি ইনিশিয়ালাইজেশন
  • অ্যাপ সাইজ — সাইজ কমানোর জন্য App Bundle, R8, VectorDrawable এবং WebP ব্যবহার করুন

কেন অ্যাপ ধীর?

অ্যাপের পারফরম্যান্স সরাসরি jank-এর সাথে সম্পর্কিত — ব্যবহারকারীর ক্রিয়া এবং UI প্রতিক্রিয়ার মধ্যে লক্ষণীয় বিলম্ব। প্রধান কারণ: মেইন থ্রেড ব্লকিং (UI থ্রেডে ভারী অপারেশন), ঘন ঘন লেআউট রিড্র (overdraw), মেমরি লিক (ঘন ঘন GC), অ-অপটিমাল অ্যালগরিদম (বড় ডেটায় O(n²))। ফ্রেম রেট (FPS) — প্রতি সেকেন্ডে ফ্রেমের সংখ্যা। আরামদায়ক অভিজ্ঞতার জন্য স্থিতিশীল 60 FPS (Android) বা 120 FPS (iPhone Pro, iPad Pro) প্রয়োজন। VSync — স্ক্রিন রিফ্রেশ রেটের সাথে রেন্ডারিং সিঙ্ক্রোনাইজ করে।

Jank ঘটে যখন একটি ফ্রেমের রেন্ডারিং 16.6 ms (60 FPS-এর জন্য) বা 8.3 ms (120 FPS-এর জন্য) অতিক্রম করে। GPU প্রোফাইলিং (Android-এ Profile GPU Rendering, iOS-এ Core Animation) দেখায় রেন্ডারিংয়ের কোন ধাপগুলো সবচেয়ে বেশি সময় নেয়। প্রধান ধাপ: Layout (এলিমেন্ট স্থাপন), Draw (অঙ্কন), Display (ফ্রেম বাফারে স্থানান্তর)। সবচেয়ে সাধারণ সমস্যা হল XML-এ লেআউট ইনফ্লেশন, বিশেষ করে জটিল নেস্টেড ConstraintLayout ব্যবহার করার সময়।

Time-to-Interactive (TTI) — অ্যাপটি ইন্টারঅ্যাকশনের জন্য সম্পূর্ণ প্রস্তুত হতে যে সময় নেয়। TTI-এর মধ্যে কোল্ড স্টার্ট, ডেটা লোডিং এবং লাইব্রেরি ইনিশিয়ালাইজেশন অন্তর্ভুক্ত। Google TTI 5 সেকেন্ডের কম, Apple — মূল স্ক্রিনের জন্য 2 সেকেন্ডের কম রাখার সুপারিশ করে। লেজি লোডিং — বিষয়বস্তু এবং লাইব্রেরি বিলম্বিত লোডিংয়ের কৌশল, TTI উন্নতির জন্য গুরুত্বপূর্ণ। IT Sectr-এ আমরা ডিফল্টরূপে সমস্ত প্রকল্পে লেজি ইনিশিয়ালাইজেশন ব্যবহার করি।

ANR এবং ক্র্যাশ

ANR এবং ক্র্যাশ — মোবাইল অ্যাপ পারফরম্যান্সের প্রধান শত্রু। ANR (Application Not Responding) — Android-এ প্রদর্শিত ডায়ালগ বক্স যা মেইন থ্রেড 5 সেকেন্ডের বেশি ব্লক থাকলে দেখা যায়। কারণ: UI থ্রেডে সিঙ্ক্রোনাস নেটওয়ার্ক অনুরোধ, করুটিন ছাড়া ডেটাবেস নিয়ে কাজ, ডাউনস্যাম্পলিং ছাড়া বড় বিটম্যাপ ডিকোড, মেইন থ্রেডে ডেডলক। ANR কল স্ট্যাক /data/anr/traces.txt-এ সংরক্ষিত হয় এবং সঠিক ব্লকিং অবস্থান নির্ধারণ করতে দেয়।

ক্র্যাশ — অ্যাপের অপ্রত্যাশিত সমাপ্তি। Android-এ — Exception (Java/Kotlin) বা Signal (নেটিভ কোড)। iOS-এ — NSException বা সিগন্যাল (EXC_BAD_ACCESS — মুক্ত মেমরিতে অ্যাক্সেস)। ক্র্যাশ রিপোর্টিং টুলস: Firebase Crashlytics, Sentry, BugSnag। এগুলো stacktrace, ডিভাইস ডেটা এবং পুনরুৎপাদন ধাপ সংগ্রহ করে। স্ট্যাক ওভারফ্লো — অসীম রিকার্শনের কারণে কল স্ট্যাক ওভারফ্লো। OutOfMemoryError — যখন হিপ পূর্ণ হয়ে যায়।

StrictMode — থ্রেড সুরক্ষা লঙ্ঘন সনাক্ত করার জন্য Android টুল। এটি নিয়ম সেট করার অনুমতি দেয়: ThreadPolicy (মেইন থ্রেডে ডিস্ক/নেটওয়ার্ক নিষিদ্ধ), VmPolicy (Activity, SQLite, CloseGuard লিক সনাক্ত)। StrictMode শুধুমাত্র ডিবাগ বিল্ডে সক্ষম করার সুপারিশ করা হয় — রিলিজে এটি কাজ করা উচিত নয়। iOS-এ সমতুল্য হল Main Thread Checker (Xcode), যা স্বয়ংক্রিয়ভাবে মেইন থ্রেডে নয় এমন UIKit কল সনাক্ত করে।

মেমরি ম্যানেজমেন্ট (GC, ARC, Retain Cycle)

মেমরি লিক

মেমরি লিক — এমন অবস্থা যেখানে একটি অবজেক্ট মেমরিতে থেকে যায় যদিও অ্যাপ এটি আর ব্যবহার করে না। এটি সরাসরি অ্যাপের পারফরম্যান্স কমায়। Android-এ, GC (Garbage Collection) কোনো অবজেক্ট সংগ্রহ করতে পারে না যদি তার উপর একটি শক্তিশালী রেফারেন্স (strong reference) থাকে। সাধারণ কারণ: Activity-তে স্ট্যাটিক রেফারেন্স, অপসারিত না হওয়া কলব্যাক/পর্যবেক্ষক, বাইরের ক্লাসের অন্তর্নিহিত রেফারেন্স সহ অভ্যন্তরীণ ক্লাস, অপসারিত না হওয়া বার্তা সহ Handler। LeakCanary — স্বয়ংক্রিয় লিক সনাক্তকরণের জন্য লাইব্রেরি।

রিটেইন সাইকেল

ARC (Automatic Reference Counting) — iOS-এ মেমরি ম্যানেজমেন্ট মডেল। প্রতিটি অবজেক্টের একটি রেফারেন্স কাউন্ট (retain count) থাকে। কাউন্ট শূন্য হলে মেমরি মুক্ত হয়। রিটেইন সাইকেল ঘটে যখন দুটি অবজেক্ট একে অপরের প্রতি শক্তিশালী রেফারেন্স রাখে (A → B এবং B → A)। ARC কখনো কাউন্ট শূন্য করবে না। সমাধান: দুর্বল (weak) বা উওনড (unowned) রেফারেন্স। Weak অবজেক্ট মুক্ত হলে স্বয়ংক্রিয়ভাবে nil হয়। Unowned nil হয় না তবে গ্যারান্টি দেয় অবজেক্টটি জীবিত।

GC বনাম ARC

GC (Garbage Collection) Android (Java/Kotlin) এ চলে। GC অপ্রাপ্য অবজেক্ট খুঁজে ও মুক্ত করার জন্য সময়ে সময়ে নির্বাহ বন্ধ করে (Stop-the-World pause)। GC ট্রিগার: যখন হিপ একটি নির্দিষ্ট শতাংশে পূর্ণ হয়। ARC iOS (Swift/Objective-C) এ চলে এবং এর কোনো বিরতি নেই — প্রতিটি অ্যাসাইনমেন্টে কাউন্টার পরমাণুভাবে আপডেট হয়। ARC বেশি পূর্বানুমানযোগ্য তবে উচ্চ অ্যাসাইনমেন্ট ফ্রিকোয়েন্সিতে অতিরিক্ত retain/receive অপারেশন জমা করতে পারে।

দুর্বল রেফারেন্স (Weak Reference) এবং শক্তিশালী রেফারেন্স (Strong Reference) — রেফারেন্সের প্রকার নির্ধারণ করে যে GC/ARC অবজেক্টটি মুক্ত করতে পারে কিনা। Strong Reference — যতক্ষণ এই রেফারেন্স বিদ্যমান, অবজেক্ট সংগ্রহ করা হবে না। Weak Reference — GC/ARC অবজেক্ট সংগ্রহ করতে পারে; দুর্বল রেফারেন্স nil হয় (Swift/Java WeakReference-এ)। Unowned Reference (Swift) — মুক্ত হলে nil হয় না; অবজেক্ট মরে যাওয়ার পর এটিতে অ্যাক্সেস করলে ক্র্যাশ হয়। Android-এ দুর্বল রেফারেন্সের জন্য java.lang.ref.WeakReference ব্যবহার করা হয়।

LeakCanary ব্যবহার করে Android-এ লিক সনাক্তকরণের উদাহরণ:

kotlin
// Утечка: анонимный класс держит ссылку на Activity
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        val handler = object : Handler(Looper.getMainLooper()) {
            override fun handleMessage(msg: Message) {
                // Используем `this@MainActivity`, сохраняя ссылку на Activity
                Log.d("TAG", "Handler received message")
            }
        }
        handler.sendEmptyMessageDelayed(0, 60000)
    }
}

// Исправление: статический Handler + WeakReference
class SafeHandler(activity: MainActivity) : Handler() {
    private val weakActivity =
        WeakReference(activity)

    override fun handleMessage(msg: Message) {
        weakActivity.get() ?: return
        Log.d("TAG", "Handler received message")
    }
}

প্রোফাইলিং (Instruments, Android Profiler)

প্রোফাইলিং — অ্যাপের পারফরম্যান্স মাপার প্রক্রিয়া: CPU, মেমরি, নেটওয়ার্ক, শক্তি খরচ। প্রোফাইলিং ছাড়া, অন্ধ অপটিমাইজেশন অকেজো — আপনি জানবেন না কোডের কোন অংশ আসলে ধীর।

টুল প্ল্যাটফর্ম মাপে কখন ব্যবহার করবেন
Instruments (Time Profiler)iOSCPU, ফাংশন কল, নির্বাহ সময়অ্যালগরিদম অপটিমাইজেশন, বাধা খোঁজা
Instruments (Allocations)iOSমেমরি, অবজেক্ট সংখ্যা, retain countsলিক এবং অতিরিক্ত মেমরি খরচ খোঁজা
Instruments (Leaks)iOSরিটেইন সাইকেল, মেমরি লিকরিলিজের আগে নিয়মিত পরীক্ষা
Android Profiler (CPU)AndroidCPU ব্যবহার, থ্রেড কার্যকলাপ, tracesমেইন থ্রেড ব্লকিং খোঁজা
Android Profiler (Memory)Androidহিপ ডাম্প, বরাদ্দ ট্র্যাকিংলিক খোঁজা, অবজেক্ট বিশ্লেষণ
Android Profiler (Network)Androidট্রাফিক, গতি, অনুরোধ সময়নেটওয়ার্ক কল অপটিমাইজেশন
LeakCanaryAndroidস্বয়ংক্রিয় মেমরি লিক সনাক্তকরণসব ডেভেলপমেন্ট ধাপে
StrictModeAndroidমেইন থ্রেডে ডিস্ক/নেটওয়ার্ক, লিকডিবাগ বিল্ড
Traceview / SystraceAndroidমেথড ট্রেসিং, সিস্টেম ইভেন্টগভীর বিলম্ব বিশ্লেষণ

Instruments (Xcode) — iOS-এর জন্য সবচেয়ে শক্তিশালী টুল। Time Profiler দেখায় কোন ফাংশন সবচেয়ে বেশি CPU খরচ করে। Allocations অবজেক্ট তৈরি এবং মুক্তি ট্র্যাক করে। Leaks স্বয়ংক্রিয়ভাবে রিটেইন সাইকেল খুঁজে পায়। প্রোফাইলিং ধাপ: (1) Instruments চালু করুন; (2) টেমপ্লেট নির্বাচন করুন (CPU-র জন্য Time Profiler); (3) সমস্যাযুক্ত দৃশ্যপট চালান; (4) কল স্ট্যাক বিশ্লেষণ করুন — সবচেয়ে চওড়া কলাম সবচেয়ে "হট" ফাংশন।

Android Profiler Android Studio-তে তৈরি (View → Tool Windows → Profiler)। CPU Profiler প্রতিটি থ্রেডের লোড দেখায়। Memory Profiler — হিপ ডাম্প এবং বরাদ্দ ট্র্যাকিং। Network Profiler — সময়সহ সমস্ত HTTP অনুরোধ। Energy Profiler — শক্তি খরচ: WakeLock, Location, Network। বিস্তারিত ট্রেসিংয়ের জন্য Systrace (Android 10+) বা Perfetto ব্যবহার করা হয় — মাইক্রোসেকেন্ড নির্ভুলতায় সিস্টেম ট্রেসিং।

অ্যাপ স্টার্টআপ (কোল্ড/ওয়ার্ম/হট স্টার্ট)

অ্যাপ স্টার্টআপ — পারফরম্যান্সের মূল সূচকগুলির একটি। এটি তিন প্রকারে বিভক্ত: কোল্ড স্টার্ট — অ্যাপ শূন্য থেকে শুরু হয়: প্রক্রিয়া তৈরি হয়, Application.onCreate (Android) / AppDelegate.applicationDidFinishLaunching (iOS), ক্লাস লোডিং, লাইব্রেরি ইনিশিয়ালাইজেশন। ওয়ার্ম স্টার্ট — প্রক্রিয়া বিদ্যমান কিন্তু Activity/ViewController নষ্ট হয়ে গেছে (যেমন স্ক্রিন ঘোরানো বা মেমরি থেকে ফিরে আসা)। হট স্টার্ট — Activity/ViewController মেমরিতে আছে, অ্যাপ কেবল প্রদর্শিত হয় (অন্য অ্যাপ থেকে সুইচ করা)।

কোল্ড স্টার্ট সবচেয়ে গুরুত্বপূর্ণ মেট্রিক। Android-এ এর মধ্যে রয়েছে: (1) লঞ্চ Activity — XML লোডিং, View ইনিশিয়ালাইজেশন; (2) প্রথম ফ্রেম — প্রথম রেন্ডার পর্যন্ত সময়। Google সুপারিশ করে: লঞ্চ Activity < 200 ms, প্রথম ফ্রেম < 500 ms, TTI < 5 সেকেন্ড। কোল্ড স্টার্ট অপটিমাইজেশন: Application.onCreate কমান (লেজি ইনিশিয়ালাইজেশনের জন্য করুটিন), SplashScreen API (Android 12+) ব্যবহার করুন, লাইব্রেরি ইনিশিয়ালাইজেশন স্থগিত করুন (WorkManager, DI), অপ্রয়োজনীয় ContentProviders সরান।

iOS-এ, কোল্ড স্টার্টের মধ্যে রয়েছে: Mach-O বাইনারি লোডিং, dyld (ডায়নামিক লিংকার), Objective-C রানটাইম ইনিশিয়ালাইজেশন, অ্যাপ্লিকেশন ডেলিগেট, প্রথম কন্ট্রোলার। Chrome Custom Tabs (Android) এবং Universal Links (iOS) — সম্পূর্ণ কোল্ড স্টার্ট ছাড়াই অ্যাপে বাহ্যিক বিষয়বস্তু দ্রুত খোলার প্রযুক্তি। মিড-রেঞ্জ বাস্তব ডিভাইসে কোল্ড স্টার্ট পরীক্ষা করার সুপারিশ করা হয়।

সাইজ অপটিমাইজেশন

অ্যাপের সাইজ — ইনস্টলেশন এবং আপডেটের জন্য পারফরম্যান্স ফ্যাক্টর। এটি রূপান্তরকে প্রভাবিত করে: প্রতি 10 MB রূপান্তর 1% হ্রাস করে। Google Play সুপারিশ করে APK সাইজ 150 MB-এর কম; App Store — 200 MB-এর কম (সেলুলার নেটওয়ার্ক — 100 MB)। মূল অপটিমাইজেশন পদ্ধতি: ইমেজ কম্প্রেশন (PNG-এর পরিবর্তে WebP 25-35% বাঁচায়), ভেক্টরাইজেশন (Android-এ VectorDrawable, iOS-এ SF Symbols), অব্যবহৃত কোড অপসারণ (R8/ProGuard), অব্যবহৃত রিসোর্স অপসারণ (lint → unused resources)।

App Bundle (Android) — একটি প্রকাশনা ফর্ম্যাট যেখানে Google Play প্রতিটি ডিভাইসের জন্য অপটিমাইজড APK তৈরি করে। App Bundle ডাউনলোড সাইজ 20-40% হ্রাস করে। Dynamic Delivery — চাহিদা অনুযায়ী ডাউনলোড করা মডিউল (on-demand feature modules)। iOS-এ সমতুল্য হল On-Demand Resources (ODR): প্রথম লঞ্চের পরে ডাউনলোড করা রিসোর্স (গেম লেভেল, ভিডিও)।

লেজি লোডিং — একটি কৌশল যেখানে মডিউল এবং লাইব্রেরি স্টার্টআপে লোড হয় না বরং প্রয়োজন অনুযায়ী লোড হয়। Split APK (Android) এবং App Slicing (iOS) — অ্যাপকে আর্কিটেকচার স্লটে বিভক্ত করা: arm64-v8a, x86_64। অ্যাপ সাইজ অপটিমাইজেশন — একটি ধারাবাহিক প্রক্রিয়া: APK কম্পোজিশন বিশ্লেষণ করুন (Android Studio-তে Analyze APK), ডুপ্লিকেট আইকন সরান, একাধিক PNG ঘনত্বের পরিবর্তে SVG ব্যবহার করুন। IT Sectr-এ আমরা প্রতিটি MR-এর জন্য CI/CD-তে বিল্ড সাইজ পরীক্ষা অন্তর্ভুক্ত করি।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

ANR কী এবং কীভাবে এটি এড়াবেন?

ANR (Application Not Responding) — একটি ডায়ালগ যা Android-এ প্রদর্শিত হয় যখন মেইন থ্রেড 5 সেকেন্ডের বেশি ব্লক থাকে। ANR এড়াতে, সমস্ত ভারী অপারেশন (নেটওয়ার্ক, ডেটাবেস, ফাইল প্রক্রিয়াকরণ) ব্যাকগ্রাউন্ড থ্রেডে স্থানান্তর করুন। iOS-এ সমতুল্য — frozen UI, যখন অ্যাপ স্পর্শে সাড়া দেওয়া বন্ধ করে দেয়।

মেমরি লিক এবং রিটেইন সাইকেল কী?

মেমরি লিক — যখন একটি অবজেক্ট মুক্ত করা যায় না কারণ এর রেফারেন্স বিদ্যমান। রিটেইন সাইকেল — iOS/Objective-C-তে অবস্থা যেখানে দুটি অবজেক্ট একে অপরকে রেফারেন্স করে (A → B → A) এবং ARC কোনোটি মুক্ত করতে পারে না। সমাধান: weak/unowned রেফারেন্স এবং সময়মতো কলব্যাক পরিষ্কার।

প্রোফাইলিংয়ের জন্য কী কী টুল ব্যবহার করবেন?

iOS-এর জন্য: Instruments (Time Profiler, Allocations, Leaks)। Android-এর জন্য: Android Profiler (CPU, Memory, Network), LeakCanary (মেমরি লিক), StrictMode (থ্রেড লঙ্ঘন)। ডেভেলপমেন্ট এবং ইন্টিগ্রেশনের সময় প্রোফাইলিং একত্রিত করার সুপারিশ করা হয়।

কোল্ড স্টার্ট ওয়ার্ম স্টার্ট এবং হট স্টার্ট থেকে কীভাবে আলাদা?

কোল্ড স্টার্ট — অ্যাপ শূন্য থেকে শুরু হয়: প্রক্রিয়া তৈরি হয়, ক্লাস লোড হয়, Application.onCreate চলে। ওয়ার্ম স্টার্ট — প্রক্রিয়া বিদ্যমান কিন্তু Activity/ViewController পুনরায় তৈরি হয়। হট স্টার্ট — Activity/ViewController আগেই মেমরিতে আছে, কেবল প্রদর্শিত হয়। কোল্ড স্টার্ট সবচেয়ে ধীর (1-5 সেকেন্ড) এবং ব্যবহারকারীর অভিজ্ঞতার জন্য গুরুত্বপূর্ণ।

মোবাইল অ্যাপের সাইজ কীভাবে কমানো যায়?

মূল পদ্ধতি: অব্যবহৃত রিসোর্স এবং কোড সরান (R8/ProGuard ব্যবহার করুন), ইমেজ ভেক্টরাইজ করুন (VectorDrawable, SF Symbols), PNG/WebP কম্প্রেস করুন (Android), APK-এর পরিবর্তে App Bundle ব্যবহার করুন, অপ্রয়োজনীয় লাইব্রেরি সরান, মডিউলের জন্য লেজি লোডিং ব্যবহার করুন। সাইজ অপটিমাইজেশন APK 40-60% কমাতে পারে।

সারসংক্ষেপ

  • ANR এবং ক্র্যাশ — প্রধান স্থিতিশীলতা সমস্যা; ব্যাকগ্রাউন্ড থ্রেড এবং ক্র্যাশ রিপোর্টার দিয়ে সমাধান করা হয়
  • মেমরি লিক এবং রিটেইন সাইকেল — OOM-এর প্রধান কারণ; দুর্বল রেফারেন্স এবং LeakCanary দিয়ে সমাধান করা হয়
  • GC (Stop-the-World বিরতি) বনাম ARC (কোনো বিরতি নেই কিন্তু রিটেইন সাইকেল) — বিভিন্ন মেমরি মডেল
  • প্রোফাইলিং — বাধ্যতামূলক ধাপ: Instruments (iOS), Android Profiler, LeakCanary, StrictMode
  • কোল্ড স্টার্ট — মূল মেট্রিক; Application.onCreate অপটিমাইজেশন এবং লেজি ইনিশিয়ালাইজেশন
  • App Bundle এবং WebP/VectorDrawable — সাইজ 20-60% কমানোর মূল টুল
  • পারফরম্যান্স একটি ধারাবাহিক প্রক্রিয়া, এককালীন কার্যকলাপ নয়; CI/CD-তে মেট্রিক্স অন্তর্ভুক্ত করুন

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন