2010-06-10 75 views
18

Estoy tratando de crear un script PHP para obtener la versión de la aplicación del archivo APK de Android. Extraer el archivo XML del archivo APK (zip) y luego analizar XML es una forma, pero creo que debería ser más simple. Algo así como PHP Manual, ejemplo n. ° 3. ¿Alguna idea de cómo crear el guion?PHP: ¿Cómo obtener la versión del archivo android .apk?

+0

¿Tiene la posibilidad de instalar el SDK de Android en ¿el servidor? –

+0

¿Dónde se encuentra el zip para el que desea obtener información? – 2ndkauboy

+0

@Francesco: Sin Android SDK @ Kau-Boy: archivo zip (apk) se encuentra en el servidor con scripts php ¿Es posible hacer algo como en el enlace que publiqué (ejemplo # 3)? – Solata

Respuesta

47

Si tiene instalado el SDK de Android en el servidor, puede usar el ejecutable de PHP (o similar) para ejecutar la herramienta aapt (en $ANDROID_HOME/platforms/android-X/tools).

$ aapt dump badging myapp.apk

Y la salida debe incluir:

package: name='com.example.myapp' versionCode='1530' versionName='1.5.3'

Si no puede instalar el SDK de Android, por cualquier razón, entonces tendrá que analizar formato binario XML de Android. El archivo AndroidManifest.xml dentro de la estructura zip de APK es no texto sin formato.

Tendría que portar un utility like AXMLParser de Java a PHP.

+0

Sin Android SDK en el servidor, con script PHP.Estoy buscando una solución como en el enlace que publiqué (ejemplo # 3) – Solata

+0

Actualicé mi respuesta. –

+0

@ChristopherOrr ¿Puede dar un ejemplo sobre la primera manera, no puedo ejecutarlo a través de mi servidor de Windows! – iSun

1

Uso esto en la CLI:

apktool if 1.apk 
aapt dump badging 1.apk 

Puede utilizar estos comandos en PHP usando exec o shell_exec.

6

He creado un conjunto de funciones de PHP que encontrarán solo el código de versión de un APK. Esto se basa en el hecho de que el archivo AndroidMainfest.xml contiene el código de versión que la primera etiqueta, y en base a la axml (binario formato XML Android) como described here

<?php 
$APKLocation = "PATH TO APK GOES HERE"; 

$versionCode = getVersionCodeFromAPK($APKLocation); 
echo $versionCode; 

//Based on the fact that the Version Code is the first tag in the AndroidManifest.xml file, this will return its value 
//PHP implementation based on the AXML format described here: https://stackoverflow.com/questions/2097813/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package/14814245#14814245 
function getVersionCodeFromAPK($APKLocation) { 

    $versionCode = "N/A"; 

    //AXML LEW 32-bit word (hex) for a start tag 
    $XMLStartTag = "00100102"; 

    //APK is esentially a zip file, so open it 
    $zip = zip_open($APKLocation); 
    if ($zip) { 
     while ($zip_entry = zip_read($zip)) { 
      //Look for the AndroidManifest.xml file in the APK root directory 
      if (zip_entry_name($zip_entry) == "AndroidManifest.xml") { 
       //Get the contents of the file in hex format 
       $axml = getHex($zip, $zip_entry); 
       //Convert AXML hex file into an array of 32-bit words 
       $axmlArr = convert2wordArray($axml); 
       //Convert AXML 32-bit word array into Little Endian format 32-bit word array 
       $axmlArr = convert2LEWwordArray($axmlArr); 
       //Get first AXML open tag word index 
       $firstStartTagword = findWord($axmlArr, $XMLStartTag); 
       //The version code is 13 words after the first open tag word 
       $versionCode = intval($axmlArr[$firstStartTagword + 13], 16); 

       break; 
      } 
     } 
    } 
    zip_close($zip); 

    return $versionCode; 
} 

//Get the contents of the file in hex format 
function getHex($zip, $zip_entry) { 
    if (zip_entry_open($zip, $zip_entry, 'r')) { 
     $buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry)); 
     $hex = unpack("H*", $buf); 
     return current($hex); 
    } 
} 

    //Given a hex byte stream, return an array of words 
function convert2wordArray($hex) { 
    $wordArr = array(); 
    $numwords = strlen($hex)/8; 

    for ($i = 0; $i < $numwords; $i++) 
     $wordArr[] = substr($hex, $i * 8, 8); 

    return $wordArr; 
} 

//Given an array of words, convert them to Little Endian format (LSB first) 
function convert2LEWwordArray($wordArr) { 
    $LEWArr = array(); 

    foreach($wordArr as $word) { 
     $LEWword = ""; 
     for ($i = 0; $i < strlen($word)/2; $i++) 
      $LEWword .= substr($word, (strlen($word) - ($i*2) - 2), 2); 
     $LEWArr[] = $LEWword; 
    } 

    return $LEWArr; 
} 

//Find a word in the word array and return its index value 
function findWord($wordArr, $wordToFind) { 
    $currentword = 0; 
    foreach ($wordArr as $word) { 
     if ($word == $wordToFind) 
      return $currentword; 
     else 
      $currentword++; 
    } 
} 
    ?> 
+0

hi @ CHeil402 cómo obtener el nombre de la versión –

1
aapt dump badging ./apkfile.apk | grep sdkVersion -i 

Usted recibirá una legible por humanos formar.

sdkVersion:'14' 
targetSdkVersion:'14' 

Basta con buscar aapt en su sistema si tiene instalado el SDK de Android. mina está en:

<SDKPATH>/build-tools/19.0.3/aapt 
1

El formato de volcado es un poco extraño y no el más fácil de trabajar. Solo para ampliar algunas de las otras respuestas, este es un script de shell que estoy usando para analizar el nombre y la versión de los archivos APK.

aapt d badging PACKAGE | gawk $'match($0, /^application-label:\'([^\']*)\'/, a) { n = a[1] } 
           match($0, /versionName=\'([^\']*)\'/, b) { v=b[1] } 
           END { if (length(n)>0 && length(v)>0) { print n, v } }' 

Si solo quiere la versión, obviamente puede ser mucho más simple.

aapt d badging PACKAGE | gawk $'match($0, /versionName=\'([^\']*)\'/, v) { print v[1] }' 

Éstos son variaciones adecuadas tanto para gawk y mawk (un poco menos duraderos en el caso de los cambios de formato de volcado, pero debe estar bien):

aapt d badging PACKAGE | mawk -F\' '$1 ~ /^application-label:$/ { n=$2 } 
            $5 ~ /^ versionName=$/ { v=$6 } 
            END{ if (length(n)>0 && length(v)>0) { print n, v } }' 

aapt d badging PACKAGE | mawk -F\' '$5 ~ /^ versionName=$/ { print $6 }' 
Cuestiones relacionadas