কম্পিউটার টিউটোরিয়াল

Android-এ অ্যাপ্লিকেশনের বেস APK পাথ (Base APK Path) প্রিন্ট করা

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.apkABI, ভাষা, স্ক্রিন ডেনসিটি অনুযায়ী আলাদা
Split APK (Feature)/data/app/~~xxx==/pkg-name==/split_feature_map.apkDynamic Feature Module (On-demand install)
Instant App/data/app/~~xxx==/pkg-name==/instant.apkGoogle 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 ইনস্টল স্ট্যাটাস চেক
  • ডিবাগিং এবং লগিং

Android-এ অ্যাপ্লিকেশনের বেস APK পাথ (Base APK Path) প্রিন্ট করা

  1. অ্যান্ড্রয়েড অ্যাপ্লিকেশনে ওয়েব স্ক্র্যাপিং করার পদ্ধতি

  2. অ্যান্ড্রয়েডে লাইন আঁকা (Canvas এবং Paint ব্যবহার করে)

  3. অ্যান্ড্রয়েডে ছবিকে Base64 স্ট্রিং-এ রূপান্তর করার পদ্ধতি

  4. Android-এ প্রোগ্রামেটিক্যালি অ্যাপ্লিকেশন বন্ধ করা