マーケット向け対応

マーケットの対応に備える

修正を入れるのは /system/bin/installd

マーケットの仕組みはよく分からない。DRMとかその辺は特に…。

gappsを試してみるで行った作業で、マーケットからアプリをダウンロード出来るようにする。
(ダウンロード出来ないアプリは…何でだろう!? DBっぽいコンテンツプロバイダー周りになにか有りそう)

素の状態では、
空き容量が足りないため、このアイテムはインストールできません。
とでる。
英語では、
Sorry, there's not enought space to install this item.
DDMSでは、
Couldn't clear application caches.
がでる。

ざっと流れを見てみた。
./frameworks/base/services/java/com/android/server/PackageManagerService.java
   ↓
./frameworks/base/services/java/com/android/server/Installer.java
   ↓ (socket経由)
./frameworks/base/cmds/installd/installd.c
   ↓
./frameworks/base/cmds/installd/commands.c
と処理が流れていた。

問題の箇所は
static int disk_free()
{
    struct statfs sfs;
    if (statfs(PKG_DIR_PREFIX, &sfs) == 0) {
        return sfs.f_bavail * sfs.f_bsize;
    } else {
        return -1;
    }
}
unsigned long が混じっているのに、戻り値はint、IS01の/dataが大きすぎて、
intの最大値を超えてマイナスになっていた。
ちなみに手元での正しい値は、
2158275584=戻り値
2147483647=intの最大
約2GB以上でマイナスに突入する(と思う…。)。

付け焼き刃だが、最大値を超えた場合は最大値を返すようにした。
$ diff -u commands.c.orig commands.c
--- commands.c.orig	2011-01-14 21:47:21.447346848 +0900
+++ commands.c	2011-01-15 03:50:12.549910110 +0900
@@ -14,6 +14,7 @@
 ** limitations under the License.
 */
 
+#include <limits.h>
 #include "installd.h"
 
 int install(const char *pkgname, uid_t uid, gid_t gid)
@@ -112,6 +113,8 @@
 {
     struct statfs sfs;
     if (statfs(PKG_DIR_PREFIX, &sfs) == 0) {
+        if( ((unsigned long)(sfs.f_bavail * sfs.f_bsize)) > ((unsigned long)INT_MAX) )
+            return INT_MAX;
         return sfs.f_bavail * sfs.f_bsize;
     } else {
         return -1;
makeして、
$ adb push installd /system/bin/
で良いかと思う。

一応、これで容量問題はなくなり…ダウンロード出来るようになる。
のだが、ダウンロードできないものもある。
./packages/providers/DownloadProvider/src/com/android/providers/downloads/Helpers.java
の、
public static final boolean discardPurgeableFiles(Context context, long targetBytes)
内でエラーになっているようだが、コンテンツプロバイダー周りを使っているらしくイマイチ分からない。
もっと、Helpers.java内及び関係周り、上層も追跡しないと分からない。

コメント
  • ここでGoogleService系のapkが配布されています。カスタムROMの一種のようですが詳細は不明です・・・
    piraterum
    http://code.google.com/p/piraterum/source/browse/branches/OfficialFroyoSensePirate/system/app/

    2.3.1_r1ではここから必要なサービスをダウンロード、インストールすることでマーケットが使えるようになりました。
    現時点ではFlashPlayerやOpenWnnなどが見えないので、インストール時のロケールの問題かもしれません。 -- (RO215IS01) 2011-01-18 13:14:06
  • こちらでは、本wikiの”gappsを試してみる” に書いた2番目の
    リンク先の内容でOpenWnn等も検索時にヒットするようになるのですが、
    ダウンロードに失敗します。
    何が足らないのかまだ追いかけていません^^;

    2.3.1_r1では /data の容量問題はでませんか? -- (is01rebuild) 2011-01-18 18:28:25
  • 2.3.1_r1では容量問題は出てません。
    代わりに?本Wikiのgappsの手順では、ファイルコピー後再起動した時点で再起動ループに入ってダメでした。
    また、apkはインストール手順に入ったところで落ちます・・・(adb installでも同様でした) -- (RO215IS01) 2011-01-18 18:45:07
  • 2.3.1_r1で本wiki手順でFlash Player等がヒットするようになりましたが、ずっとダウンロード中のままです。 -- (fi01) 2011-01-18 19:01:11
  • >>RO215IS01さん
    了解です。
    ダウンロードはpermissionのページの先頭ですが、
    わかりにくいので別ページにします。

    >>fi01さん
    コピー出来ないソフトウェアのダウンロードが出来ないのかもしれません。
    ソースをちょっとだけ追ってみたのですが、簡単には分かりませんでした。
    しかし、ずっとダウンロード中のままですか。
    2.2_r1.3ではダウンロードが中止されるのですが、、、。
    微妙に実装が変わっているのかもしれません。
    -- (is01rebuild) 2011-01-22 04:24:15
名前:
コメント:

すべてのコメントを見る















(2011/01/15 4:16 公開)
最終更新:2011年01月15日 04:24
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。