PHP が APK をアップロードした後に APK パッケージ情報を自動的に抽出する方法 (ダウンロード例)_PHP チュートリアル
入社して最初のプロジェクトはマーケティングです。そのため、バックグラウンドで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('/
///// //////
if(preg_match('/
$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 の特殊な処理方法のため、情報を抽出できないことがわかります。つまり、
この 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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。
