2009-06-12 21 views
52

私はテストサーバーと運用サーバーにデータをアップロードするAndroidライブラリを持っています。開発者はこのライブラリを使用して開発者をテストし、Androidマーケットからアプリケーションをダウンロードするとプロダクションサーバーを使用したいと思います。アプリがAndroidマーケットからダウンロードされたかどうかを検出します。

これは、アプリケーションがどこから来たのかを伝えるために可能ですか(マーケットまたは非マーケット?)私は、署名されたJARファイルの存在を検出できると思います。

+0

アプリが公開されているかどうか、またはエンドユーザーがアプリをダウンロードした場所から知りたいですか? ユーザーがマーケットからアプリを読み込んだので、マーケットアプリがプロダクションサーバーを使用するか、アプリが公開されてそのアプリのコピーがすべてプロダクションアプリになるようにしてください。 – Grant

+0

グラント、私が探している違いは、開発時と制作時の違いです。開発者のコ​​ピーをテストサーバーに残しておきたいのです。私は、プロダクションサーバを使用するために "野生の中で"ダウンロードされたアプリがほしいと思う。 – sehugg

+0

何もしない別のアプリケーションを作成し、デバッグビルドを示すためにそれが存在するかどうかテストします。開発用端末にアプリをインストールします。 – OJW

答えて

38

はい、その署名を使用できます。開発中にデバッグキーを使用し、マーケットにアプリケーションをアップロードするときにリリースキーを使用する場合、そのアプリケーションが署名された署名をチェックし、そのテストまたはプロダクションサーバーに基づいてチェックすることができます。ここ アプリの署名を読み込むための小さなコード断片である:

try { 
     PackageManager manager = context.getPackageManager(); 
     PackageInfo appInfo = manager.getPackageInfo(
      YOUR_PACKAGE_NAME, PackageManager.GET_SIGNATURES); 

     // Now test if the first signature equals your debug key. 
     boolean shouldUseTestServer = 
      appInfo.signatures[0].toCharsString().equals(YOUR_DEBUG_KEY); 

    } catch (NameNotFoundException e) { 
     // Expected exception that occurs if the package is not present. 
    } 

YOUR_PACKAGE_NAMEは「com.wsl.CardioTrainer」のようなものでなければなりません。 AndroidManifest.xmlで使用したパッケージ名でなければなりません。 API 5以降ではグッドラック

マーク

+1

YOUR_RELEASE_KEYをハードコードするのは良い考えですか? リバースエンジニアリングでこれが明らかになりますか? – Thushan

+4

それは問題を解決するかもしれませんが、もし私があなただったら私の完全な秘密鍵を私のコードに入れることは間違いありません。 多分、あなたはキーの何かの20桁のサブセットを使うだけで逃げることができますか? –

+5

私はあなたの鍵で何らかの種類のハッシュを使用していると思っています。それで、パッケージ情報に格納されている鍵をハッシュしてから、それをチェックすると、リバースエンジニアリングされた人は誰でも実際の鍵を見ることができなくなります。 –

1

構成を本番環境にデフォルト設定し、構成をテスト環境に設定するカスタムInstrumentationを使用できます。計測はアンドロイド市場に公開する前に削除する必要があります。

3

マーケットアプリケーションがマーケットからダウンロードされたと言ってアプリケーションに「フラグを立てる」ことは何もわかりません。

この問題は別のAndroidライブラリで別の方法で解決されています。 AdMob Android SDKは、on their wikiの説明に従って、無料でダウンロードして使用できます。このライブラリは広告を配信するため、現在実行中のアプリケーションが開発者によってテストされているかどうか、またはアプリケーションが「野生で」使用されているかどうかを判断できるようにすることができます。彼らのアプローチは、開発者がXMLの "テスト"属性を設定するか、ライブラリに "setTesting(boolean)"関数を呼び出して、どの広告を提供するかをライブラリに知らせることでした。これは明らかに、開発者が公開前にコードまたはXMLの1行を変更することに依存する手作業によるアプローチのほうが多いです。

+1

ええ、それは1つのアプローチです。問題は、あなたが公開するときにそれを元に戻すことを忘れないことです。私は自動になる方法を探していました。しかたがない。 – sehugg

+1

'build.xml' Antビルドスクリプトをカスタマイズして、リリースビルドとデバッグビルディングの間で変数を入れ替えることができます。私は構成クラス(FacebookとTwitterのキー用)とリソースファイル(Google Maps用)が自動的にスワップされるようにしました。 –

0

"開発者モード"の設定をアプリに追加することができます。

別の可能性として、SDカードに特殊なファイルや設定ファイルがありますか?

10

、あなたはPackageManager.getInstallerPackageName(String)を使用することができます。ドキュメントから:

パッケージをインストールしたアプリケーションのパッケージ名を取得します。 パッケージがどのマーケットから来たのかを特定します。

Androidマーケットのパッケージを入手するには、this postが役立ちます。

関連する問題