ProGuard হল একটি Java বাইটকোড সঙ্কোচন, অপ্টিমাইজেশন এবং অবফাসকেশন টুল, যা Android SDK-তে একীভূত এবং রিভার্স ইঞ্জিনিয়ারিং থেকে অ্যাপ্লিকেশন রক্ষা করে। Google I/O Security Session (2025) অনুযায়ী, সঠিক ProGuard কনফিগারেশন APK-র আকার 15-25% কমায় এবং কোড ফাঁসের ঝুঁকি 60% হ্রাস করে। টুলটি Android ডেভেলপমেন্টের জন্য মানদণ্ডে পরিণত হয়েছে এবং সারা বিশ্বে লক্ষ লক্ষ অ্যাপ্লিকেশনে ব্যবহৃত হয়।
মূল বিষয়
ProGuard হল একটি স্বাধীনভাবে বিতরণকৃত টুল যা Java বাইটকোড প্রক্রিয়াকরণ করে, যা Guardsquare দ্বারা উন্নত। এটি Android SDK-তে নির্মিত এবং তিনটি মূল কার্য সম্পাদন করে: সঙ্কোচন, অপ্টিমাইজেশন এবং কোড অবফাসকেশন। ProGuard অ্যাপ্লিকেশন এবং এর নির্ভরতার সমস্ত বাইটকোড বিশ্লেষণ করে, অব্যবহৃত ক্লাস এবং মেথড সনাক্ত করে, সেগুলি সরিয়ে দেয় এবং তারপর অবশিষ্ট কোড অবফাসকেট করে।
ProGuard 2000 সালে Eric Lafortune দ্বারা Java অ্যাপ্লিকেশন অপ্টিমাইজেশন টুল হিসাবে তৈরি করা হয়েছিল। 2008 সালে Android-এর আগমনের সাথে, ProGuard Android SDK-তে একীভূত হয় এবং অ্যাপ্লিকেশন সুরক্ষার জন্য মানক টুলে পরিণত হয়। Guardsquare পরিসংখ্যান (2024) অনুযায়ী, ProGuard Google Play-তে 80% এর বেশি অ্যাপ্লিকেশনে ব্যবহৃত হয়, যার মধ্যে প্রধান ব্যাংক এবং প্রযুক্তি কোম্পানিগুলির অ্যাপ অন্তর্ভুক্ত।
ProGuard চারটি ধাপে প্রক্রিয়াকরণ সম্পাদন করে। প্রথম ধাপে (সঙ্কোচন), টুল অ্যাপ্লিকেশনের এন্ট্রি পয়েন্ট বিশ্লেষণ করে এবং নির্ধারণ করে কোন ক্লাস, মেথড এবং ফিল্ড এক্সিকিউশনের সময় পৌঁছানো যায়। দ্বিতীয় ধাপে (অপ্টিমাইজেশন), ProGuard কর্মক্ষমতা উন্নত করতে বাইটকোড রূপান্তর করে। তৃতীয় ধাপ (অবফাসকেশন) আইডেন্টিফায়ার পুনঃনামকরণ করে। চূড়ান্ত ধাপে, preverify ভার্চুয়াল মেশিনে বাইটকোড যাচাইয়ের জন্য প্রয়োজনীয় মেটাডেটা যোগ করে।
আসুন ProGuard-এর তিনটি প্রধান কার্যের প্রতিটি বিস্তারিতভাবে পরীক্ষা করি: সঙ্কোচন, অপ্টিমাইজেশন এবং অবফাসকেশন। প্রতিটি প্রক্রিয়া বোঝা টুলটি সর্বোত্তমভাবে কনফিগার করতে সাহায্য করবে।
ProGuard এন্ট্রি পয়েন্ট (main মেথড, Activity, BroadcastReceiver) থেকে কল গ্রাফ বিশ্লেষণ করে এবং অব্যবহৃত কোড সরিয়ে দেয়। Retrofit, OkHttp এবং Gson-এর মতো লাইব্রেরি সহ একটি সাধারণ Android প্রজেক্টে, সঙ্কোচন 40% পর্যন্ত বাইটকোড সরাতে পারে, যার মধ্যে অব্যবহৃত লাইব্রেরি মেথড, ডিবাগ কোড এবং টেস্ট ক্লাস অন্তর্ভুক্ত। এটি সরাসরি APK আকার কমায় এবং অ্যাপ্লিকেশন লোড সময় সংক্ষিপ্ত করে।
অপ্টিমাইজেশন ধাপে, ProGuard বাইটকোডের 20 টিরও বেশি বিভিন্ন রূপান্তর সম্পাদন করে: ছোট মেথডের ইনলাইনিং, অব্যবহৃত প্যারামিটার সরানো, লজিক্যাল এক্সপ্রেশন সরলীকরণ, অভিন্ন কোড ব্লক একীভূতকরণ। উদাহরণস্বরূপ, ছোট গেটার এবং সেটার সরাসরি ফিল্ড অ্যাক্সেস দ্বারা প্রতিস্থাপিত হতে পারে। অপ্টিমাইজেশন অ্যাপ্লিকেশন কাঠামোর উপর নির্ভর করে কোড এক্সিকিউশন 5-15% দ্রুত করতে পারে।
অবফাসকেশন ProGuard-এ ক্লাস, মেথড এবং ফিল্ডকে ছোট অক্ষর ক্রমানুসারে পুনঃনামকরণ করে কাজ করে: a, b, c, a.a, a.b ইত্যাদি। পুনঃনামকৃত উপাদানের সমস্ত রেফারেন্স সমগ্র কোড জুড়ে স্বয়ংক্রিয়ভাবে আপডেট হয়। এটি লক্ষ করা গুরুত্বপূর্ণ যে অবফাসকেশন প্রোগ্রামের আচরণ পরিবর্তন করে না, এটি কেবল ডিকম্পাইলড কোড বোঝা কঠিন করে তোলে। লাইব্রেরি এবং পাবলিক API keep নিয়মের মাধ্যমে অবফাসকেশন থেকে বাদ দেওয়া উচিত।
// ProGuard অবফাসকেশনের আগে
public class LoginManager {
public User authenticateUser(String username, String password) {
// প্রমাণীকরণ লজিক
}
}
// ProGuard অবফাসকেশনের পরে
public class a {
public Object a(String b, String c) {
// পুনঃনামকৃত আইডেন্টিফায়ার সহ একই লজিক
}
}
ProGuard কনফিগারেশন Android অ্যাপ্লিকেশন বিল্ড সেটআপের একটি গুরুত্বপূর্ণ ধাপ। ভুল নিয়ম প্রয়োজনীয় ক্লাস অপসারণ এবং ফলস্বরূপ রিলিজ সংস্করণে ক্র্যাশ হতে পারে।
Android প্রজেক্টে ProGuard সক্রিয় করতে রিলিজ বিল্ড টাইপের জন্য minifyEnabled ফ্ল্যাগ true-তে সেট করা জড়িত। স্ট্যান্ডার্ড ProGuard নিয়ম proguard-android-optimize.txt ফাইলে Android SDK-এর সাথে সরবরাহ করা হয়। কাস্টম নিয়ম একটি পৃথক proguard-rules.pro ফাইলে যোগ করা হয়। বিল্ডের সময়, ProGuard প্রথমে স্ট্যান্ডার্ড নিয়ম প্রয়োগ করে, তারপর কাস্টম নিয়ম, যা বেস কনফিগারেশন ওভাররাইড করার অনুমতি দেয়।
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
কাস্টম নিয়ম ফাইলে নির্দিষ্ট প্রজেক্টের জন্য নির্দেশনা থাকে। সাধারণ নিয়মের মধ্যে রয়েছে রিফ্লেকশনের মাধ্যমে ব্যবহৃত ক্লাস, Gson/Moshi সিরিয়ালাইজেশনের জন্য ডেটা মডেল, লাইব্রেরি কলব্যাক ইন্টারফেস এবং নির্দিষ্ট অ্যানোটেশন দ্বারা অ্যানোটেটেড ক্লাস সংরক্ষণ করা। প্রতিটি নির্দেশ -keep, -dontwarn বা -keepclassmembers কীওয়ার্ড দিয়ে শুরু হয় এবং ক্লাসের একটি প্যাটার্ন সংজ্ঞায়িত করে যা ProGuard পরিবর্তন করবে না।
# Gson-এর জন্য ডেটা মডেল সংরক্ষণ করুন
-keep class com.example.data.model.** { *; }
# রিফ্লেকশনের মাধ্যমে ব্যবহৃত ক্লাস সংরক্ষণ করুন
-keep class * implements com.google.gson.TypeAdapterFactory
# লাইব্রেরি সতর্কতা উপেক্ষা করুন
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# এনাম সংরক্ষণ করুন (ProGuard বৈশিষ্ট্য)
-keep class * extends java.lang.Enum { *; }
ProGuard কনফিগারেশন ব্যাকরণে বিভিন্ন শ্রেণীর নির্দেশ অন্তর্ভুক্ত রয়েছে, প্রতিটি প্রক্রিয়াকরণের একটি নির্দিষ্ট দিক পরিচালনা করে। সঠিক কনফিগারেশনের জন্য প্রয়োজনীয় প্রধান নির্দেশগুলি দেখি।
| নির্দেশ | উদ্দেশ্য | উদাহরণ |
|---|---|---|
| -keep | ক্লাস এবং এর সদস্যদের সম্পূর্ণ সংরক্ষণ করুন | -keep class com.example.MyClass |
| -keepclassmembers | শুধুমাত্র ক্লাসের সদস্যদের সংরক্ষণ করুন | -keepclassmembers class * { @Inject *; } |
| -dontwarn | সতর্কতা উপেক্ষা করুন | -dontwarn okhttp3.internal.** |
| -keepparameternames | মেথড প্যারামিটারের নাম সংরক্ষণ করুন | -keepparameternames |
| -keepattributes | গুণাবলী সংরক্ষণ করুন (অ্যানোটেশন, EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | অপ্টিমাইজেশন নিষ্ক্রিয় করুন | -dontoptimize |
ProGuard রিফ্লেকশন (Class.forName()), ServiceLoader বা ডায়নামিক DEX ফাইল লোডিং এর মাধ্যমে লোড করা কোড স্থিরভাবে বিশ্লেষণ করতে পারে না। যদি একটি ক্লাস তার স্ট্রিং নাম দ্বারা তৈরি করা হয়, ProGuard তার অস্তিত্ব সম্পর্কে জানে না এবং এটিকে অব্যবহৃত হিসাবে সরিয়ে দিতে পারে। এই সমস্ত ক্লাস -keep এর মাধ্যমে স্পষ্টভাবে সংরক্ষণ করতে হবে। ProGuard সক্ষম করার পর রিলিজ বিল্ডে ক্র্যাশের এটি সবচেয়ে সাধারণ কারণ।
লাইব্রেরিগুলি প্রায়শই তাদের নিজস্ব ProGuard নিয়ম অন্তর্ভুক্ত করে, যা AAR ফাইলে এম্বেড করা consumer-rules.pro-এর মাধ্যমে স্বয়ংক্রিয়ভাবে বিল্ডে যোগ হয়। Android Gradle Plugin বিল্ডের সময় স্বয়ংক্রিয়ভাবে এই নিয়মগুলি প্রয়োগ করে। ডেভেলপারকে শুধু নিশ্চিত করতে হবে যে সমস্ত ব্যবহৃত লাইব্রেরি সঠিক নিয়ম প্রদান করে এবং প্রয়োজনে প্রজেক্টে সেগুলি পরিপূরক করে।
ProGuard সক্ষম করার পরে ত্রুটি ঘটলে, স্ট্যাক ট্রেস ডিঅবফাসকেট করতে mapping ফাইল ব্যবহার করুন। রোগনির্ণয়ের জন্য, -whyareyoukeeping কী ব্যবহার করুন, যা আউটপুট বিল্ডে একটি ক্লাস সংরক্ষণের কারণ দেখায়। সাময়িকভাবে -optimizationpasses এবং -obfuscation নিষ্ক্রিয় করা সমস্যাটি স্থানীয়করণের অনুমতি দেয়। Guardsquare অনুযায়ী, 80% ProGuard সমস্যা রিফ্লেকশন ক্লাসের জন্য -keep নিয়ম যোগ করে সমাধান হয়।
Android Gradle Plugin 3.4 (2019) রিলিজের সাথে, Google R8 চালু করেছে — ProGuard-এর উত্তরসূরি, যা সরাসরি D8/R8 কম্পাইলারে একীভূত। 2023 সালের মধ্যে, R8 AGP 8.0-তে ProGuard-কে সম্পূর্ণভাবে প্রতিস্থাপন করেছে, কিন্তু প্রজেক্ট মাইগ্রেশনের জন্য আর্কিটেকচারাল পার্থক্য বোঝা গুরুত্বপূর্ণ।
ProGuard DEX-এ রূপান্তরের আগে Java বাইটকোড (.class ফাইল) প্রক্রিয়াকরণকারী একটি পৃথক টুল হিসাবে কাজ করে। R8 DEX কম্পাইলারে একীভূত এবং নিম্ন স্তরে কোড প্রক্রিয়া করে, যা ProGuard-এ উপলব্ধ নয় এমন অপ্টিমাইজেশন অনুমতি দেয়। R8 ডিশুগারিংও সমর্থন করে — পুরোনো Android API স্তরের জন্য Java 8+ সিনট্যাকটিক সুগারকে পশ্চাৎ-সঙ্গত কোডে রূপান্তর।
Google Android Performance Team (2025) অনুযায়ী, R8 অভিন্ন নিয়মের সাথে ProGuard-এর তুলনায় 10-15% ভালো কোড সঙ্কোচন প্রদান করে। R8 দ্রুত — বিল্ড সময় 20-30% হ্রাস পায়। তাছাড়া, R8 ক্লাস-ফাইল স্তরের পরিবর্তে DEX স্তরে বিশ্লেষণের কারণে আরও মৃত কোড সরিয়ে দেয়। R8 ProGuard নিয়ম সিনট্যাক্সের সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ, যা ডেভেলপারের জন্য মাইগ্রেশন স্বচ্ছ করে তোলে।
ProGuard থেকে R8-তে স্যুইচ করা সহজ: AGP 8.0+-এ, R8 ডিফল্টরূপে ব্যবহৃত হয়। পুরোনো প্রজেক্টের জন্য, আপনাকে classpath থেকে ProGuard সরিয়ে gradle.properties আপডেট করতে হবে: android.enableR8=true। ProGuard নিয়ম বেশিরভাগ ক্ষেত্রে পরিবর্তন ছাড়াই R8-এর সাথে সামঞ্জস্যপূর্ণ। স্যুইচ করার পরে সমস্ত টার্গেট ডিভাইসে রিলিজ বিল্ড পরীক্ষা করার পরামর্শ দেওয়া হয়, কারণ R8 সেই কোড সরিয়ে ফেলতে পারে যা ProGuard রেখেছিল।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
সবচেয়ে সাধারণ কারণ হল রিফ্লেকশন, Gson/Moshi সিরিয়ালাইজেশন বা ডায়নামিক DEX ফাইল লোডিং সহ লাইব্রেরির মাধ্যমে ব্যবহৃত ক্লাস অপসারণ। সমাধান: Class.forName()-এর মাধ্যমে তৈরি, Parcelable প্রয়োগকারী, JSON-এর মাধ্যমে সিরিয়ালাইজড বা @Inject দিয়ে অ্যানোটেটেড সমস্ত ক্লাসের জন্য -keep নিয়ম যোগ করুন। স্ট্যাক ট্রেসের ডিঅবফাসকেশন এবং বিল্ড থেকে সরানো ক্লাস সনাক্ত করতে mapping ফাইল ব্যবহার করুন।
Mapping ফাইল বিল্ডের পরে build/outputs/mapping/release/mapping.txt-এ অবস্থিত। বিন্যাস: মূল_নাম -> অবফাসকেটেড_নাম -> প্রকার। Android Studio Build > Analyze APK-এর মাধ্যমে ডিঅবফাসকেশন সমর্থন করে: APK আপলোড করুন, স্ট্যাক ট্রেস পেস্ট করুন এবং পড়া যায় এমন ক্লাস নাম পান। CI/CD-র জন্য, প্রতিটি সংস্করণের mapping ফাইল পৃথক রিপোজিটরি বা ক্লাউড স্টোরেজে সংরক্ষণ করুন।
হ্যাঁ, ProGuard শুধুমাত্র রিলিজ বিল্ডের জন্য সক্ষম করা উচিত। ডিবাগ বিল্ড minifyEnabled false ব্যবহার করে, যা কম্পাইলেশন দ্রুত করে এবং ডিবাগারের জন্য পঠনযোগ্য ক্লাস নাম রাখে। ডিবাগ মোডে, অবফাসকেশন ডিবাগিং এবং ধাপে ধাপে এক্সিকিউশনে বাধা দেয়, যখন সঙ্কোচন পুনরাবৃত্তি ধীর করে। অবফাসকেশন সঠিকতা পরীক্ষার জন্য, ফিজিক্যাল ডিভাইসে রিলিজ বিল্ড ব্যবহার করুন।
ProGuard সতর্কতা (WARNING) এমন সমস্যা নির্দেশ করে যা বিল্ড বন্ধ করে না কিন্তু সম্ভাব্য রানটাইম ত্রুটির দিকে ইঙ্গিত করতে পারে। যদি একটি সতর্কতা ক্র্যাশের দিকে না নিয়ে যায়, সংশ্লিষ্ট লাইব্রেরির জন্য -dontwarn যোগ করুন। যদি একটি সতর্কতা অনুপস্থিত ক্লাসের সাথে সম্পর্কিত হয় যা অ্যাপ্লিকেশনে ব্যবহৃত হয় না, তাহলেও -dontwarn ব্যবহার করুন। একসাথে সমস্ত সতর্কতা বিবেচনা ছাড়া উপেক্ষা করা সুপারিশ করা হয় না।
ProGuard একটি বিনামূল্যের টুল যার মৌলিক বৈশিষ্ট্য: সঙ্কোচন, অপ্টিমাইজেশন, ক্লাস এবং মেথড পুনঃনামকরণ। DexGuard একই Guardsquare-এর একটি বাণিজ্যিক পণ্য যা কন্ট্রোল ফ্লো অবফাসকেশন, স্ট্রিং এবং রিসোর্স এনক্রিপশন, অ্যান্টি-ডিবাগিং সুরক্ষা এবং রিসোর্স অবফাসকেশন যোগ করে। DexGuard উচ্চ সুরক্ষা প্রয়োজনীয়তা সহ ব্যাংকিং অ্যাপ্লিকেশন এবং গেমে ব্যবহৃত হয়।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন