2011-12-27 4 views
2

ユースケースはこちらです。私は企業向けのカスタムアプリケーションを作成します。これらのアプリケーションはプロプライエタリであり、様々な理由からAndroidマーケットには不適切です。一部の顧客は、アプリケーションが定期的に社内サーバーに定期的に連絡して更新をチェックし、必要に応じて自動的にダウンロードしてインストールすることを要求しています。私はこれを行うための働く仕組みを持っていますが、私が望むほど堅牢ではありません。最善の解決策は、Android versionCode(およびおそらくVersionName)をサーバーに渡して、サーバー上の潜在的なアップグレード.apkのversionCodeと比較する、アプリケーションをデバイス上で実行することです。サーバー上の.apkがアップグレードを表す場合にのみ、デバイスにアップロードされてインストールされます。アンドロイド環境外の.apkファイルからAndroidのversionCode&versionNameを取得するにはどうすればよいですか?

多くの提案されたソリューションが掲載されています。 1つの一般的な方法は、versionCodeとversionNameを含む別のテキストファイルをサーバーに配置することですが、このテキストファイルが.apkファイルの値と同期しないように管理エラーが発生する可能性があります。結果は、一定で不必要なダウンロードになります。 apktoolやそのラッパーを使用するなど、実行可能なさまざまなソリューションには別の欠点があります。

私が追求している回避策がありますが、最近ダウンロードされてインストールされた.apkファイル(チェックサムなど)についての追加情報が一部残っているようです。この情報をサーバーに渡して比較することができます。これは仕事にすることができます、それはちょうど私が好きなクリーンssではないです。

私は、.apkファイルからversionCodeとversionNameを取得できるライブラリ.jarファイルを探しています。基本的に、.apkファイルの場所を表すFileオブジェクトが渡され、versionCodeとversionNameを取得するメソッドが提供されます。

他の提案を歓迎します。

答えて

0

私はこれを行う方法を見つけましたが、かすかな心のためではありません。私はAXMLPrinter2.jarをダウンロードしました。このファイルは、アンドロイド.XMLファイルの内容の読み込み、解釈、および表示に使用できる自己完結型の.jarファイルです。特に、AndroidManifest.xmlのコンテンツを人間が読める形式で表示するのはうってつけの仕事です。しかし、AndroidManifest.xmlのコンテンツにプログラムでアクセスする必要がありました。

これは興味深いところです。

まず、AXMLPrinter2.jarでMANIFEST.XMLファイルを抽出して、メインクラスAXMLPrinterを見つけました。

次に、AXMLPrinter2.jarに含まれるAXMLパーサを囲む比較的単純なラッパーであることが判明し、ReadAndroidManifestという新しいクラスを派生したAXMLPrinter.classをコンパイルしました。このクラスはサーバ上での使用のためにインテンシブされるため、単純なコンストラクタReadAndroidManifest(File apkFile)を持ち、getVersionCode()とgetVersionName()の2つのメソッドを提供します。

AXMLPrinter2.jarファイルをweb-appライブラリ(変更なし)に追加し、apkファイルがアップグレードを表すかどうかを判断するサーブレットの部分に派生クラスReadAndroidManifestを追加しました。

明らかに、この手法はAndroidManifest.xmlファイルのすべての要素にアクセスするためのより一般的な方法で拡張できますが、上記の単純なバージョンは私の目的のために完全に機能します。

0

私は、同じことを考えています。多くの記事を読んだ後、純粋なJAVAコードを使ってpackageNameとバージョンをAPKから取得する最も快適な方法だと思います。 Android環境)。

まず、私はapktoolをドローロードしました。何らかの理由でリンクが動作しない場合は、apktoolとなります。ダウンロードページの下にapktoolの依存関係とヘルパースクリプトのウィンドウがあります。次に、私はフォルダを解凍し、そのaapt.exeを取得し、私のJavaプロジェクトフォルダに置きます。

その後、私のJavaコード内で、私はこのように書きます。

ProcessBuilder builder = new ProcessBuilder("PATH_TO_APKTOOL_AAPT.exe", "dump", "badging", "path_to_your_apk_file"); 
Process p; 
String output = ""; 
try { 
p = builder.start(); 
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream())); 
    String line; 
    while (true) { 
    line = r.readLine(); 
     if (line == null) { break; } 
    output += line; 
    } 
     Pattern pattern = Pattern.compile("package: name='(.*?)'", Pattern.CASE_INSENSITIVE); 
     Matcher m = pattern.matcher(output);    
     m.find(); 
    System.out.println("package name:" + m.group(1).trim()); 
    pattern = Pattern.compile("package:.*?versionCode='(.*?)'", Pattern.CASE_INSENSITIVE); 
    m = pattern.matcher(output); 
    m.find(); 
    System.out.println("version:" + m.group(1).trim()); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

`

まあ、それは一種の少ない副作用およびAPKのパッケージ名とバージョンを得るための簡単な方法でありますコード:)

関連する問題