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衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。
