入社して最初のプロジェクトはマーケティングです。そのため、バックグラウンドで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 //针对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

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Linux 新バージョン
SublimeText3 Linux 最新バージョン

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ホットトピック



