入社して最初のプロジェクトはマーケティングです。そのため、バックグラウンドで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情報コード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 アイコンを見つける必要があります。以下のコードを参照してください:
抽出する必要があるすべての情報を配列に保存し、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