android - অ্যান্ড্রয়েড.APK ফাইল সংস্করণ নাম বা সংস্করণ কোড অ্যাডাপ্টার ইনস্টল করুন




android-manifest (6)

আপগ্রেড দৃশ্যকল্পের জন্য বিশেষভাবে একটি বিকল্প পদ্ধতিতে এমন একটি ওয়েব পরিষেবা থাকতে পারে যা বর্তমান সংস্করণ নম্বরটি সরবরাহ করে এবং এটি সম্পূর্ণ সংস্করণ ডাউনলোড করার পরিবর্তে এটির সংস্করণটি পরীক্ষা করে দেখতে পারে। এটি কিছু ব্যান্ডউইথকে সংরক্ষণ করবে, একটু বেশি পারফরম্যান্ট হবে (যদি এপিকে সর্বাধিক সময়ের প্রয়োজন হয় না তবে একটি APK এর থেকে ডাউনলোডের জন্য অনেক দ্রুত) এবং এটি প্রয়োগ করা আরও সহজ।

সবচেয়ে সহজ ফর্মটিতে আপনার সার্ভারে একটি সহজ পাঠ্য ফাইল থাকতে পারে ... http://some-place.com/current-app-version.txt

যে টেক্সট ফাইলের ভিতরে কিছু আছে

3.1.4

এবং তারপর সেই ফাইলটি ডাউনলোড করুন এবং ইনস্টল করা সংস্করণটির বিরুদ্ধে চেক করুন।

এটি আরও উন্নত সমাধান তৈরি করবে যা সঠিক ওয়েব পরিষেবাকে বাস্তবায়ন করবে এবং লঞ্চে একটি এপিআই কল করবে যা কিছু জসন ফেরত দিতে পারে, যেমন http://api.some-place.com/versionCheck :

{
    "current_version": "3.1.4"
}

AndroidManifest.xml ফাইলটি ডাউনলোড করার পরে এবং ইনস্টল না করে আমি কীভাবে প্রোগ্রাম্যাটিকভাবে আমার APK সংস্করণ কোড বা সংস্করণ নাম পেতে পারি।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xx.xxx"
    android:versionCode="1"
    android:versionName="1.1" >

উদাহরণস্বরূপ, আমি আমার আইআইএস পরিষেবাদিতে একটি নতুন সংস্করণ আপলোড করতে চাই কিনা তা পরীক্ষা করতে চাই, এটি ডিভাইসে ইনস্টল করার পরে, যদি এটি একটি নতুন সংস্করণ না হয় তবে আমি এটি ইনস্টল করতে চাই না।


আপনি যদি অ্যান্ড্রয়েড স্টুডিওর সংস্করণ 2.2 এবং তারপরে উপরের সংস্করণ ব্যবহার করেন তবে অ্যান্ড্রয়েড স্টুডিওতে BuildAPK বিশ্লেষণ করুন এবং তারপর AndroidManifest.xml ফাইল নির্বাচন করুন।


নিম্নলিখিত কমান্ড লাইন থেকে আমার জন্য কাজ:

aapt dump badging myapp.apk

দ্রষ্টব্য: aapt.exe SDK এর একটি build-tools সাব-ফোল্ডারে পাওয়া যায়। উদাহরণ স্বরূপ:

<sdk_path>/build-tools/23.0.2/aapt.exe

মুহূর্তে, এই অনুসরণ করা যাবে

$ANDROID_HOME/build-tools/28.0.3/aapt dump badging /<path to>/<app name>.apk

    EditText ET1 = (EditText) findViewById(R.id.editText1);

    PackageInfo pinfo;
    try {
        pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        String versionName = pinfo.versionName;
        ET1.setText(versionName);
        //ET2.setText(versionNumber);
    } catch (NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

aapt dump badging test.apk | grep "VersionName" | sed -e "s/.*versionName='//" -e "s/' .*//"

এটি একটি ফলাফল হিসাবে শুধুমাত্র সংস্করণ নম্বর ফিরে দ্বারা প্রশ্ন উত্তর। যাহোক......

আগের বিবৃত হিসাবে লক্ষ্যটি ডাউনলোড বা ইনস্টল করার চেষ্টা করার আগে সার্ভারে এপিকে ইনস্টল হওয়াটির চেয়ে নতুন কিনা তা খুঁজে বের করা উচিত। এটি করার সবচেয়ে সহজ উপায় হল সার্ভারে হোস্ট করা APK এর ফাইল myapp_1.01.apk সংস্করণ নম্বর অন্তর্ভুক্ত করুন যেমন myapp_1.01.apk

তুলনা করার জন্য আপনাকে ইতিমধ্যে ইনস্টল করা অ্যাপ্লিকেশনের নাম এবং সংস্করণ নম্বরটি ইনস্টল করতে হবে (যদি এটি ইনস্টল করা থাকে)। যদি আপনি ইতিমধ্যে রোমে অন্তর্ভুক্ত না হয়ে থাকেন তবে একটি rooted ডিভাইস বা অ্যাক্ট বাইনারি এবং ব্যস্তবক্স ইনস্টল করার একটি উপায় প্রয়োজন হবে।

এই স্ক্রিপ্টটি আপনার সার্ভারের অ্যাপ্লিকেশানগুলির তালিকা পাবে এবং যে কোনও ইনস্টল করা অ্যাপ্লিকেশনের সাথে তুলনা করবে। ফলাফল আপগ্রেড / ইনস্টলেশনের জন্য পতাকাঙ্কিত একটি তালিকা।

#/system/bin/sh
SERVER_LIST=$(wget -qO- "http://demo.server.com/apk/" | grep 'href' | grep '\.apk' | sed 's/.*href="//' | \
              sed 's/".*//' | grep -v '\/' | sed -E "s/%/\\\\x/g" | sed -e "s/x20/ /g" -e "s/\\\\//g")
LOCAL_LIST=$(for APP in $(pm list packages -f | sed -e 's/package://' -e 's/=.*//' | sort -u); do \
              INFO=$(echo -n $(aapt dump badging $APP | grep -e 'package: name=' -e 'application: label=')) 2>/dev/null; \
              PACKAGE=$(echo $INFO | sed "s/.*package: name='//" | sed "s/'.*$//"); \
              LABEL=$(echo $INFO | sed "s/.*application: label='//" | sed "s/'.*$//"); if [ -z "$LABEL" ]; then LABEL="$PACKAGE"; fi; \
              VERSION=$(echo $INFO | sed -e "s/.*versionName='//" -e "s/' .*//"); \
              NAME=$LABEL"_"$VERSION".apk"; echo "$NAME"; \
              done;)
OFS=$IFS; IFS=$'\t\n'
for REMOTE in $SERVER_LIST; do
    INSTALLED=0
    REMOTE_NAME=$(echo $REMOTE | sed 's/_.*//'); REMOTE_VER=$(echo $REMOTE | sed 's/^[^_]*_//g' | sed 's/[^0-9]*//g')
    for LOCAL in $LOCAL_LIST; do
        LOCAL_NAME=$(echo $LOCAL | sed 's/_.*//'); LOCAL_VER=$(echo $LOCAL | sed 's/^[^_]*_//g' | sed 's/[^0-9]*//g')
        if [ "$REMOTE_NAME" == "$LOCAL_NAME" ]; then INSTALLED=1; fi
        if [ "$REMOTE_NAME" == "$LOCAL_NAME" ] && [ ! "$REMOTE_VER" == "$LOCAL_VER" ]; then echo remote=$REMOTE ver=$REMOTE_VER local=$LOCAL ver=$LOCAL_VER; fi
    done
    if [ "$INSTALLED" == "0" ]; then echo "$REMOTE"; fi
done
IFS=$OFS

যেমন কেউ জিজ্ঞাসা করে কিভাবে এটি ব্যবহার না করে এটি করতে হবে। এটি apktool এবং স্ক্রিপ্টিং একটি বিট apk তথ্য নিষ্কাশন করা সম্ভব। এই পদ্ধতিটি ধীর এবং অ্যানড্রয়েডে সহজ নয় তবে যতক্ষণ আপনি apktool সেটআপ করছেন ততক্ষণ উইন্ডোজ / ম্যাক বা লিনাক্সে কাজ করবে।

#!/bin/sh
APK=/path/to/your.apk
TMPDIR=/tmp/apktool
rm -f -R $TMPDIR
apktool d -q -f -s --force-manifest -o $TMPDIR $APK
APK=$(basename $APK)
VERSION=$(cat $TMPDIR/apktool.yml | grep "versionName" | sed -e "s/versionName: //")
LABEL=$(cat $TMPDIR/res/values/strings.xml | grep 'string name="title"' | sed -e 's/.*">//' -e 's/<.*//')
rm -f -R $TMPDIR
echo ${LABEL}_$(echo $V).apk

এছাড়াও আপনার সার্ভারে একটি ড্রপ ফোল্ডার বিবেচনা। এটিতে APK আপলোড করুন এবং একটি ক্রন টাস্ক নামকরণ করে এবং আপনার আপডেট ফোল্ডারে এটি সরানো হয়।

#!/bin/sh
# Drop Folder script for renaming APKs
# Read apk file from SRC folder and move it to TGT folder while changing filename to APKLABEL_APKVERSION.apk
# If an existing version of the APK exists in the target folder then script will remove it
# Define METHOD as "aapt" or "apktool" depending upon what is available on server 

# Variables
METHOD="aapt"
SRC="/home/user/public_html/dropfolders/apk"
TGT="/home/user/public_html/apk"
if [ -d "$SRC" ];then mkdir -p $SRC
if [ -d "$TGT" ]then mkdir -p $TGT

# Functions
get_apk_filename () {
    if [ "$1" = "" ]; then return 1; fi
    local A="$1"
    case $METHOD in
        "apktool")
            local D=/tmp/apktool
            rm -f -R $D
            apktool d -q -f -s --force-manifest -o $D $A
            local A=$(basename $A)
            local V=$(cat $D/apktool.yml | grep "versionName" | sed -e "s/versionName: //")
            local T=$(cat $D/res/values/strings.xml | grep 'string name="title"' | sed -e 's/.*">//' -e 's/<.*//')
            rm -f -R $D<commands>
            ;;
        "aapt")
            local A=$(aapt dump badging $A | grep -e "application-label:" -e "VersionName")
            local V=$(echo $A | sed -e "s/.*versionName='//" -e "s/' .*//")
            local T=$(echo $A | sed -e "s/.*application-label:'//" -e "s/'.*//")
            ;;
        esac
    echo ${T}_$(echo $V).apk
}

# Begin script
for APK in $(ls "$SRC"/*.apk); do
    APKNAME=$(get_apk_filename "$APK")
    rm -f $TGT/$(echo APKNAME | sed "s/_.*//")_*.apk
    mv "$APK" "$TGT"/$APKNAME
done






apk