マーケットの対応に備える
修正を入れるのは /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