aapt dump badging test.apk | grep "VersionName" | sed -e "s/.*versionName='//" -e "s/' .*//"
วิธีนี้จะตอบคำถามโดยส่งกลับเฉพาะหมายเลขเวอร์ชันตามผลลัพธ์ แต่ ......
เป้าหมายตามที่ระบุไว้ก่อนหน้านี้ควรตรวจสอบว่า apk บนเซิร์ฟเวอร์ใหม่กว่าที่ติดตั้งไว้ก่อนที่จะพยายามดาวน์โหลดหรือติดตั้ง วิธีที่ง่ายที่สุดในการทำเช่นนี้คือรวมหมายเลขรุ่นในชื่อไฟล์ของ apk ที่โฮสต์บนเซิร์ฟเวอร์เช่นmyapp_1.01.apk
คุณจะต้องสร้างชื่อและหมายเลขเวอร์ชันของแอพที่ติดตั้งแล้ว (หากติดตั้งไว้) เพื่อทำการเปรียบเทียบ คุณจะต้องมีอุปกรณ์ที่รูทหรือติดตั้งไบนารี aapt และ busybox หากไม่ได้รวมอยู่ในรอม
สคริปต์นี้จะได้รับรายการแอปจากเซิร์ฟเวอร์ของคุณและเปรียบเทียบกับแอพที่ติดตั้ง ผลลัพธ์คือรายการที่ถูกตั้งค่าสถานะสำหรับการอัพเกรด / การติดตั้ง
#/system/bin/sh
SERVER_LIST=$(wget -qO- "http://demo.server.com/apk/" | grep 'href' | grep '\.apk' | sed 's/.*href="https://stackoverflow.com//' | \
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
อย่างที่มีคนถามว่าจะทำอย่างไรโดยไม่ใช้ aapt นอกจากนี้ยังเป็นไปได้ที่จะดึงข้อมูล apk ด้วย apktool และการเขียนสคริปต์เล็กน้อย วิธีนี้ช้าลงและไม่ง่ายใน android แต่จะทำงานบน windows / mac หรือ linux ตราบใดที่คุณมีการตั้งค่า 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
พิจารณาโฟลเดอร์ดร็อปบนเซิร์ฟเวอร์ของคุณด้วย อัปโหลด apks ไปยังมันและงาน cron จะเปลี่ยนชื่อและย้ายไปยังโฟลเดอร์อัพเดตของคุณ
#!/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