getPackageResourcePath() ব্যবহার করে APK ফাইলের পূর্ণ পাথ বের করা
Android-এ ইনস্টল করা অ্যাপের APK ফাইল ডিভাইসের কোন লোকেশনে আছে তা জানার জন্য Context.getPackageResourcePath() বা PackageManager.getApplicationInfo() ব্যবহার করা হয়।
লেআউট (activity_main.xml)
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="16dp"
android:textAlignment="center" />
</LinearLayout>
MainActivity.java
package com.example.myapplication;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
String packageName = getPackageName();
// পদ্ধতি ১: Context থেকে সরাসরি (বেস APK পাথ)
String baseApkPath = getPackageResourcePath();
// পদ্ধতি ২: PackageManager থেকে বিস্তারিত ইনফো
String sourceDir = "";
String[] splitApks = null;
long installTime = 0;
long updateTime = 0;
try {
PackageManager pm = getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
sourceDir = appInfo.sourceDir; // বেস APK পাথ (same as getPackageResourcePath)
splitApks = appInfo.splitSourceDirs; // Split APKs (Dynamic Delivery)
installTime = appInfo.firstInstallTime;
updateTime = appInfo.lastUpdateTime;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
// টাইম ফরম্যাট
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss", java.util.Locale.getDefault());
String installed = sdf.format(new java.util.Date(installTime));
String updated = sdf.format(new java.util.Date(updateTime));
StringBuilder sb = new StringBuilder();
sb.append("Package: ").append(packageName).append("\n\n");
sb.append("Base APK Path (Method 1):\n").append(baseApkPath).append("\n\n");
sb.append("Base APK Path (Method 2):\n").append(sourceDir).append("\n\n");
if (splitApks != null && splitApks.length > 0) {
sb.append("Split APKs (").append(splitApks.length).append("):\n");
for (String split : splitApks) {
sb.append(" - ").append(split).append("\n");
}
sb.append("\n");
}
sb.append("First Install Time: ").append(installed).append("\n");
sb.append("Last Update Time: ").append(updated);
textView.setText(sb.toString());
}
}
APK পাথের প্রকারভেদ
| প্রকার | পাথ উদাহরণ | বিবরণ |
|---|---|---|
| Base APK | /data/app/~~xxx==/pkg-name==/base.apk | মূল অ্যাপ কোড, রিসোর্স, ম্যানিফেস্ট |
| Split APK (Config) | /data/app/~~xxx==/pkg-name==/split_config.arm64_v8a.apk | ABI, ভাষা, স্ক্রিন ডেনসিটি অনুযায়ী আলাদা |
| Split APK (Feature) | /data/app/~~xxx==/pkg-name==/split_feature_map.apk | Dynamic Feature Module (On-demand install) |
| Instant App | /data/app/~~xxx==/pkg-name==/instant.apk | Google Play Instant এক্সপেরিয়েন্স |
সতর্কতা ও সীমাবদ্ধতা
- Scoped Storage (Android 10+): সরাসরি ফাইল অ্যাক্সেস সীমিত,
Fileঅবজেক্ট থেকে পড়া যাবে না - App Bundle / Split APKs: আধুনিক অ্যাপগুলো একাধিক APK-এ ভাগ থাকে (base + splits)
- Security: APK পাথ এক্সপোজ করা সিকিউরিটি রিস্ক হতে পারে (রিভার্স ইঞ্জিনিয়ারিং)
- Read Permission: APK ফাইল পড়তে
READ_EXTERNAL_STORAGEলাগে না (প্রাইভেট ডিরেক্টরি)
ব্যবহার কেস
- অ্যাপ আপডেট চেক (versionCode مقایনা)
- APK সাইজ মনিটরিং
- Dynamic Feature Module ইনস্টল স্ট্যাটাস চেক
- ডিবাগিং এবং লগিং
