GAEのBlobstoreとapkファイル | sola's note

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

全てのサーバに言える事かわかりませんが、
Google App Engine for JavaのBlobstoreにアップロードしたapkファイルをダウンロードした時に、
apkファイルがインストール出来たり、出来なかったりしたので、簡単に調査。

(当然ですが、問題となりやすい
レスポンスヘッダのContent-Typeにapplication/vnd.android.package-archiveが必要というのは
クリアしていることが条件の調査です。)

操作としては大きく次の二つがありますが、
挙動が安定しなかったのは、後者の「ダウンロード→インストール」の場合。
「ダウンロード→展開」の場合は、どれも問題なく出来ました。

・apkファイルダウンロード→展開
・apkファイルダウンロード→インストール

インストール出来ない場合というのは、ダウンロードしたapkファイルを展開する際に
「パッケージの解析中に問題が発生しました」
というエラーが出て、Android端末にインストール出来ない状況です。

今回調査した内容について、
サーバに問題があるのか、クライアントに問題があるのかという事について
googleから公式に発表されていないので、あくまで結果のみの掲載となります。


ではまず前提条件。
クライアント側の設定とサーバ側の設定。

■クライアント側
・formのpostでダウンロード用サーブレットの呼び出し。
・formのgetでダウンロード用サーブレットの呼び出し。
・aタグでダウンロード用サーブレットの呼び出し。

■サーバ側
・リクエストパラメータを解析して、BlobstoreServiceのserveメソッドを利用してダウンロード処理。


プログラムで書くと次のような感じです。

■クライアント側
formの場合の例:
<form action="/hoge/fuga" method="post">
<!-- 必要に応じてパラメータ設定 -->
<input type="submit" value="post"/>
</form>

aタグの場合の例:
<a href="/hoge/fuga?key=${key}">aタグ</a>

■サーバ側(Slim3フレームワークでのプログラムとなります)
BlobstoreService blobstoreService = BlobstoreServiceFactory
        .getBlobstoreService();
BlobInfoFactory blobInfoFactory = new BlobInfoFactory();

//BlobKeyを取得
String blobKeyStr = asString("blob-key");

// ブロブキー生成
BlobKey blobKey = new BlobKey(blobKeyStr);

BlobInfo blobInfo = blobInfoFactory.loadBlobInfo(blobKey);

// ファイル名を指定
response.setHeader("Content-Type",
        "application/vnd.android.package-archive");
response.setHeader("Content-Disposition", "attachment; filename="
        + blobInfo.getFilename() + "");

blobstoreService.serve(blobKey, response);
return null;


結果はというと、
・formのpostでダウンロード用サーブレットの呼び出し。→×インストール失敗
・formのgetでダウンロード用サーブレットの呼び出し。→○インストール成功
・aタグでダウンロード用サーブレットの呼び出し。→○インストール成功
でした。

冒頭でも記載しましたが、ダメだった理由が、
blobstore特有の挙動によるものなのか、Androidの端末の個体差に何かあるのかというのは不明です。

追伸
formのmethodをgetにしても、サーバ側でリクエストのリファラをいじくると
インストール時にエラーが発生する模様です。
原因はわかりませんが、事象は発生率100%で確認されました。