ホームページ >バックエンド開発 >PHPチュートリアル >PHP が APK をアップロードした後に APK パッケージ情報を自動的に抽出する方法 (ダウンロード例)_PHP チュートリアル

PHP が APK をアップロードした後に APK パッケージ情報を自動的に抽出する方法 (ダウンロード例)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:12:061147ブラウズ

入社して最初のプロジェクトはマーケティングです。そのため、バックグラウンドでAPKソフトウェアなどをアップロードする必要があります。便宜上、APK をアップロードした後、システムは APK パッケージ名、製品名、バージョン情報、APK コード、プログラム サイズ、アイコンなどの APK ファイルの関連情報を自動的に抽出します。初期治療

コマンド java -jar AXMLPrinter2.jar AndroidManifest.xml > cmdAfter.xml
を使用して cmdAfter.xml ファイルを取得し、cmdAfter.xml ファイルを分析して関連情報を取得します。

しかし、残念ながら、このファイルからapkパッケージ名は取得できますが、icoアイコンファイル名やその他の関連情報は取得できません。下の写真のように

上の図では、ラベルやアイコンなどはすべてフラグ値であり、必要な結果を直接取得することはできません。この値とAPKファイルの内部ファイルの関係を解析したことがありますが、APKごとに構造が異なるため実装が面倒です。実際、Android マーケットなどの一部の Web サイトでは、APK をアップロードすると、APK パッケージ名が抽出されるだけでなく、ICON アイコン、サイズ、その他の情報も含まれます。他の誰かがそれを行うことができるので、これを回避する方法があるに違いないと考えました。そこで研究の結果、期待通りの結果が得られました。その方法をここに記録し、交換を歓迎します。

コア抽出APK情報コード
コードをコピー コードは次のとおりです:

  /***
   * 分析已上传的APK文件,提取所需要的数据
   */
  function upAPK(){
    global $_config_product_apktool_count;//使用apktool.jar解压的次数,原因下面有说明。
    if($this->msg!='')return;//如果有错误,返回
    $dir=$this->upload_path;//上传路径
    $stringsXML_exists=false;
    if(file_exists($dir.'package/res/values/strings.xml'))unlink($dir.'package/res/values/strings.xml');
    for($i=0;$i<$_config_product_apktool_count && !$stringsXML_exists;$i++){
//针对UC的APK包或其类似的APK包,解压一次并不能完全得到strings.xml文件或相关文件。目前只有采用这个办法了。
//在系统cmd下直接使用java -jar ...执行解压,有时可以得到strings.xml文件,有时也得不到,不知道是不是jar包的问题。
exec('java -jar ../apktool.jar d -f '.$this->tmpFile.' '.$dir.'package');//注释:解压完毕再往下执行
      $stringsXML_exists=file_exists($dir.'package/res/values/strings.xml');
    }
    //检查AndroidManifest.xml文件是否存在,如果不存在,则不是合法的APK文件
    if(!file_exists($dir.'package/AndroidManifest.xml')){$this->msg='不是合法的APK文件,请重新上传!';return;}
    $AndroidManifestXML=file_get_contents($dir.'package/AndroidManifest.xml');//读取AndroidManifest.xml

    if(preg_match('/package=\"([^\"]*)\"/i',$AndroidManifestXML,$package))$returnVal['package']=$package[1];//如果有包名,返回到数组

    //增加versionCode
    if(preg_match('/versionCode=\"([^\"]*)\"/i',$AndroidManifestXML,$versionCode))$returnVal['versionCode']=$versionCode[1];//如果有版本代码,返回到数组

    //检测到包名后判断数据库中是否已经存在。
    if($this->id==0){//添加新产品时检测,修改产品不检测
      if($returnVal['package']!=''){
        $sql='select id from product where package='.SqlEncode($package[1]);
        $result=mysql_query($sql);
        if(mysql_num_rows($result)>0){
          $this->msg='该APK已经存在,请更换!';
          return;
        }
      }else{
        $this->msg='系统无法检测该APK信息,请联系管理员!';
        return;
      }
    }

if($stringsXML_exists)$stringXML=file_get_contents($dir.'package/res/values/strings.xml');//strings.xml がある場合は、strings.xml ファイルを読み取ります
if(preg_match('/versionName) = "([^"]*)"/i',$AndroidManifestXML,$ver))$returnVal['ver']=$ver[1];//バージョン番号がある場合は配列に返す
//バージョン番号 現在、次の 2 つの状況があります: 1. バージョン番号は AndroidManifest.xml に直接リストされており、上記の通常のルールを通じて抽出できます
//2. バージョン番号はラベルと同じであり、 strings.xml ファイル
//2011-11 -23 add
if($stringXML!='' && strstr($ver[1],'@')){
if(preg_match('/^@string/( .*)/i',$ver[1 ],$findVer)){
if(preg_match('/([^<]*) )/',$stringXML ,$a))$returnVal['ver']=$a[1];
///// //////
if(preg_match('/ if($stringsXML_exists && preg_match('/ if(preg_match('/([^<]*)/',$stringXML,$name)){
$returnVal['name']=$name[1];//商品名がある場合は配列に戻る*/**
*/
$ Returnval ['name'] = preg_replace ('/s | "/', '', $ returnval ['name']);
}} // // $this->msg=$returnVal['package '].'--'.$returnVal['ver'].'--'.$returnVal['thumbimg'].'--'.$returnVal[' name'];
if($this-> oldAPK!=''){// 再アップロードすると、元の APK ファイルと icon.png 画像が削除されます
unlink($dir.$this->oldAPK);
unlink( $dir.$this->oldAPK. '.png');
}
//package/res ディレクトリの下のディレクトリを走査します [drawable|drawable-hdpi|drawable-nodpi|drawable-ldpi|drawable-mdpi]
//システムは最大のアイコンを取得しますアイコンのサイズ
$tmpArr[0]=0;$tmpArr[1]=0;$tmpArr[2]='drawable';
$dirs=opendir($dir.'package/res') ;
while(($ file=readdir($dirs))){
preg_match('/(drawable(-.*?dpi)?)/i',$file,$drawable_folder);
$iconPath=$dir 'PACKAGE/Res/ (File_exists ($ iconpath)) {
$ iconinfo = Getimages ze ($ iconpath); [0]>$tmpArr[0] && $iconInfo[1]>$tmpArr[1]){
$tmpArr[0]=$iconInfo[0];$tmpArr[1]=$ iconInfo[1]; $tmpArr[2]=$drawable_folder[1];
;
Closedir($dirs);
if(rename($dir.'package/res/'.$tmpArr[2].'/'.$returnVal[ 'thumbimg'].'.png',$dir.$ this->iframe_key.'.apk.png')){// ディレクトリが見つかり、正常に移動されました
$returnVal['thumbimg']=$this- >iframe_key.'.apk.png';
}
if( !move_uploaded_file($this->tmpFile,$dir.$this->iframe_key.'.apk')){$this->msg= 「アップロードに失敗しました!」 ';return;}//APKファイルを転送
$returnVal['filename']=$this->iframe_key.'.apk';
$returnVal['size']=$this->size;
$this ->結果=$returnVal;
}


情報抽出プロセス

1. まず、apktool.jar コマンドを使用して、apk ファイル内の package/res/values/string.xml ファイルを抽出します。何らかの理由で、apk ファイルをリリースするときに、string.xml ファイルが必ずしも取得されない場合があります。したがって、バックグラウンドでは、リリースの最大数を制御する $_config_product_apktool_count パラメーターが追加されます。

2. リリースのルート ディレクトリにある AndroidManifest.xml ファイルを読み取ります。このファイルから、APK パッケージ名とバージョン情報を取得できます。

3. 新しくアップロードされた APK のパッケージ名がデータベースに存在するかどうかを確認します。同じパッケージ名を持つ APK をアップロードすることは禁止されています。変更は検出されません。

4. 定期的なルールに従って必要な情報を入手します。

ここで string.xml ファイルを抽出する必要があるのはなぜですか?

すべての情報が AndroidManifest.xml に含まれているわけではないためです。一部の情報は AndroidManifest.xml で「参照」としてのみ使用され、実際のレコードは string.xml にあります。たとえば

AndroidManifest.xmlのLabelとiconの値。

上の図では: label="@string/app_name" は、string.xml の string の name 属性が app_name の値であることを示します。これは APK の「ソフトウェア名」です。ここでは「マーケット」となります。次の図に示されています:

@drawable/quickflick_icon、quickflick_icon が ICON のファイル名であることを示します。

特別なニーズがあるため、最大の ICON アイコンを見つける必要があります。以下のコードを参照してください:

コードをコピーします コードは次のとおりです:

// package/res ディレクトリの下のディレクトリを走査 [ drawable|drawable-hdpi|drawable- nodpi|drawable-ldpi|drawable-mdpi]
//システムはアイコン サイズが最大のアイコンを採用します
$tmpArr[0]=0;$tmpArr[1]=0;$tmpArr [2]='drawable';
$dirs =opendir($dir.'package/res');
while(($file=readdir($dirs))){
preg_match('/(drawable(-.*) ?dpi)?)/i',$file ,$drawable_folder);
$iconPath=$dir.'package/res/'.$drawable_folder[1].'/'.$returnVal['thumbimg'].'。 png';
if(file_exists($iconPath) ; iconInfo[0];$tmpArr[1]=$iconInfo[1];$tmpArr[2]=$drawable_folder[1];
iconInfo .'---'。 $iconInfo[1];
closedir($dirs);
分析後、ICON アイコンは通常、APK の次のディレクトリに保存されます:drawable|drawable-hdpi|drawable-nodpi|drawable-ldpi|drawable-mdpi 最大の ICON アイコンがトラバーサル比較によって取得され、一時ディレクトリに移動されます。

抽出する必要があるすべての情報を配列に保存し、JavaScript を通じてフォームに書き込みます。下の写真に示すように:

APK情報の概要を抽出

上記のコードは、これまでのところ、アップロードされた APK から正常に情報を抽出でき、エラーは見つかりませんでした。上記のコードのコメントからも、「Pocket Baidu」APK の特殊な処理方法のため、情報を抽出できないことがわかります。つまり、" Pocket Baidu "

この APK 抽出機能を実装する際に重要なのは、APK パッケージの組織ルールを見つけることです。ルールを見つけるだけで、プログラムの実装は自然になります。

APKファイルをリリースする際は内容に注意してください

exec('java -jar ../apktool.jar d -f '.$this->tmpFile.' '.$dir.'package');

上記のステートメントを正常に実行するには、次の条件を満たす必要があります:

1. Java パッケージをインストールします。Java ディレクトリのユーザー ユーザー グループの権限は、読み取りと実行、フォルダー ディレクトリの一覧表示、読み取りです。

2. cmd.exe ファイルの場合、ユーザー グループの権限は次のとおりです: 読み取りと実行、読み取り

3. PHP では exec を呼び出すことができます

4. アップロードディレクトリにファイルを書き込む権限があることを確認してください

より良い抽出方法がある場合は、お互いにコミュニケーションを取り、学び合うことを歓迎します。

PHP 抽出 APK 情報 DEMO デモのダウンロード

ダウンロードアドレス:

http://xiazai.jb51.net/201304/yuanma/php_apk_jb51net.rar

http://www.bkjia.com/PHPjc/326771.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/326771.html技術記事入社して最初のプロジェクトはマーケティングです。そのため、バックグラウンドでAPKソフトウェアなどをアップロードする必要があります。便宜上、APK をアップロードした後、システムは次のような APK ファイルの関連情報を自動的に抽出します: apk パッケージ名...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。