iPhone 研究室さんにご紹介いただきました

また、効果を確認しながら一つ一つアプリを終了していけば、最も効果的にメモリを開放することができるアプリを把握することもできます。急いで iPhone の動作を改善したい時に役立つのではないでしょうか。

というわけで、ぜひこの爽快感を味わってみてください。

SysStats MonitorでiPhoneのメモリ解放効果を確認して爽快な気分に | ID: 46189 | iPhone 研究室]

上記で引用させていただいた部分は、まさしく、私が言いたかったことです。それとともに、全般を通じて、自分では説明しきれなかった「爽快感」を、見事に表現していただいています。
開発者として、うれしい限りです。
みなさまも、ぜひ、この爽快感を味わっていただければと思います。

SysStats Monitor / SysStats Lite 1.8がリリースされました。

本日、iOS4のマルチタスキング環境で、さらに使いやすくするための機能追加と改善をした、SysStats Monitor / SysStats Lite 1.8がリリースされました。

変更点

SysStats Monitorの機能追加
  • Dashboad画面のレイアウトパターンを、2種類から選択できるようにしました。
  • プロセス一覧画面で、ブックマークされているが起動されていないプロセスを非表示にできるようにしました。
  • マルチタスク対応環境では、初期状態のプロセスブックマークに用意するアプリを追加しました。
共通の変更
  • プロセス一覧画面で、終了を検知したプロセスも表示するようにしました。
  • その他、いくつかのバグ修正や改善をしました。

「最近使ったアプリケーション」と組合せて使う

過去に何度か紹介していますが、「最近使ったアプリケーション」と組合せると、おもしろい使い方ができます。

SysStats Monitorを起動して、「最近使ったアプリケーション」を表示させる

まず、とりあえずSysStats Monitorを起動してから、ホームボタンをダブルクリックすると、画面再下部に、「最近使ったアプリケーション」のアイコンリストが表示されます。そこで、任意のアイコンを長押しすると、各アイコンに"-"のバッジが現れます。

「最近使ったアプリケーション」から、アイコンを削除する。

ここで任意のアプリのアイコンをタップすると、そのアイコンが削除されますが、そのアプリがバックグラウンドに存在していれば、同時にプロセスの終了も行われます。例えば、ここでSafariのアイコンをタップした場合、以下のようになった場合を考えてみます。

この間に起きた、目立った変化は以下の通りです。

その他(MB) 空き(MB)
Safari終了前 181.8 3.1
Safari終了後 142.1 43.5
変化量 -39.7 +40.4

このことから、Safariのプロセスが終了して、空きメモリが増えたことが想像できると思います。このように、1つずつ確認しながら終了させることで、どのアプリがどのくらいメモリを使っているのかを、大まかに掴むことができると思います。
また、プロセス一覧画面の、「終了を検知したもの」のセクションを見ることでも、終了されたことが確認できます。
興味がある方は、ぜひお試しください。

あと、ついでに気付いたことですが、アイコンに"-"のバッジが表示されている状態のときは、CPU負荷が高くなるようです。そのまま放置しないよう、注意した方がいいのかなと思いました。

注: 上記のスクリーンショットは、SysStats Monitorのオプション機能で、CPU統計情報を最上段にする配置パターンを選択したときのものです。SysStats Liteでは、メモリ使用状況は画面の最上段に固定配置されているので、半分見えなくなってしまいます。

プロセスブックマークのiOS4への最適化 (SysStats Monitorのみ)

プロセスブックマークに標準で用意するエントリーを追加

プロセスブックマークに標準で用意するエントリー数を、大きく増やしました。

SysStats Monitorを、マルチタスキングをサポートする環境で実行した場合のみ、左記のアプリに対応するエントリーが標準で登録されています。
(iOS4でバックグラウンド化されているアプリを確認する方法 - The iPhone Development Playgroundで紹介したときの画像と同じものです。)


実行中でないプロセスの非表示化


iOS4でブックマークしたくなるバックグラウンドプロセスが増えたので、実行中でないプロセスの情報が表示されていると、一覧が見づらくなっていました。
その対策として、画面の最上部左側のボタンで、「実行中」を選択すると、実行中でないプロセスを非表示にすることができるようしました。


各機能の詳細については、アプリに付属のヘルプドキュメントを参照してください。

バックグラウンドプロセスが多い時のメモリ使用状況の不思議

SysStats Monitor/SysStats Liteでは、host_statistics()という関数をHOST_VM_INFO指定で呼び出して得られるvm_statistics構造体から、現在のメモリ使用状況を取得して表示しています。アプリをたくさん起動して、バックグラウンドプロセスが多い状態を作ると、以下のような感じになります。

この中で、実際にvm_statistics構造体から取得できる値は空き、現在非使用中、現在使用中、固定中の4項目のみです。最も大きな面積を占めている「その他」は、物理RAM容量(この場合は253MB)から、その4項目の合計を差し引いた値を表示しています。

「その他」という領域を設けた理由については、
SysStats Monitor/Liteの「その他」領域について - The iPhone Development Playground
を参照してください。

この状態から、ホームボタンのダブルクリックで「最近使ったアプリケーション」を表示させ、いくつかのアイコンを削除してプロセスを終了させると、それらのプロセスが確保していたメモリが解放されるはずです。実際には、以下のように表示が変化します。

さて、ここで大きく値が変動したのはどの部分でしょうか?
「その他」が減って、「空き」が増えているところが目立っていますね。それ以外の動きはごくわずかになっています。
このことから、iOSでは、アプリが確保しているメモリの多くは、vm_statistics構造体で見えているものとは異なる仕組みで管理されていることが推測されます。また、iPhone Simulatorでこのアプリを動かした場合は、その他に当たる部分は0になるので、iOS特有のことだと思われます。
同時にこれは、iOSでは、vm_statistics構造体で得られる値の中で、空きメモリサイズ以外の変化は、あまり意味が無いということも言えるかもしれません。iOS4になってからは、バックグラウンドプロセスの数が、かなり増えたので、以前よりもその傾向が強くなっているようにも思います。

このあたりは、開発者向けドキュメントでも説明されておらず、まだ謎に包まれたことが多いので、推測ばかりで何も結論が出ないモヤモヤした話になってしまいましたが、興味がある方にとって、何かのヒントになれば幸いです。

iOS4でバックグラウンド化されているアプリを確認する方法

iOS4から提供されているマルチタスク機能によって、アプリ実行中にホームボタンを押した時に、プロセスを終了させず、バックグラウンドで一時停止状態にすることができるようになっていることは、多くの方がすでにご存知だと思います。
PCとは異なり、バックグラウンドで一時停止状態になるのは、すべてのアプリではなく、開発者がそう振舞うよう、選択したものだけです。また、OS4から提供されている機能なので、OS3.x以前のバージョンをベースにしたアプリでは、今まで通り、ホームボタンを押せば、プロセスが終了されます。
iOS4では、ホームボタンをダブルクリックすると、「最近使ったアプリケーション」が参照できるようになっています。ただそこでは、あくまでも「最近使ったアプリケーション」がわかるだけで、そのプロセスがバックグラウンドに存在するかどうかまではわかりません。

この例では、右の3つはバックグラウンドで一時停止状態になっているプロセスですが、一番左のものは、すでに終了されています。でも、その区別はつきませんよね。この機能を「タスクマネージャ」と表現している記事もあるようですが、その認識は誤っています。あくまでも、「最近使ったアプリケーション」のアイコンが並んでいるだけです。
バックグラウンドプロセスとして存在しているか否かは、SysStats MonitorSysStats Liteのようなアプリを使わないと、見ることができません。例えば、以下のようにプロセスの一覧を確認しながら、「最近使ったアプリケーション」を使って操作することができます。

「最近使ったアプリケーション」を長押しして、上記のような「-」を表示させた場合、アイコンを削除することができますが、そのアプリの状態よって、実際に行われることは異なります。

  • バックグラウンド化されているもの
    アイコンが削除されるとともに、プロセスが終了される
  • すでに終了しているもの
    アイコンが削除されるのみ

こんな感じで調べてみると、Appleから提供されている標準アプリは、ほぼバックグラウンド化する設定になっていることがわかりました。
そのときに調べてみた結果を以下にまとめてみましたので、興味がある方は、参考にしていただければと思います。

注意事項
SysStats MonitorSysStats Liteでは、OS3.x以前でバックグラウンド化されていたプロセスの名称は、事前に登録されていますが、それ以外のものは、「プロセスブックマーク機能」を使って1つずつ登録する必要があります。

SysStats Monitorのユニバーサル化を試してみました

iPadでは、従来の多くのiPhoneアプリを、そのまま何も手を加えずに動かすことできますが、iPad向けに作られたものと比べると、見劣りするというのが事実です。SysStats Monitorも、残念ながら、現時点ではその状態にあります。
iPadへの本格対応をする場合、当然のことながら、今のアプリをベースに作り込んで行くことになります。iPadが日本で発売されてから、すでに3週間経ってしまい、今さら感もありますが、まずは試しにアプリのプロジェクトをiPad対応(ユニバーサルバイナリ)にしてみたので、そのときのことを、メモを兼ねて、簡単にまとめてみました。

iPhone SDK3.2で実施したので、4.0には当てはまらない部分があることをご了承ください。

参考文献

当然ながら、iPad Programing GuideのStarting Your Project → Creating a Universal Applicationを参考にしました。 iOS Developer Library

ビルドターゲットをiPad用にアップグレード

iPad対応にするためのアップグレードは、ビルドターゲットごとに行うようになっている。まずは、プロジェクトの中の、ユニバーサル化したいターゲットを選択し、コンテキストメニューを開き、「現在のターゲットをiPad用にアップグレード...」を選択する。

以下のパネルが開くので、アップグレード方式を選択する。

ユニバーサル化の場合は、「One Universal application」が選択されていることを確認し、OKをクリック。

自動的に変更された項目

ここまでの作業で、自動的に変更されたのは、以下の項目でした。

ターゲットのプロパティ
  • Deployment

[変更前]

[変更後]

[変更前]

[変更後]

Info.plist

以下のように、Main nib file base name (iPad)というキーが追加される。
*1

グループの追加

Resources-iPadというグループが追加される。

とりあえず動かすためにやるべきこと

動く状態にするには、必要に応じて、以下のことを手作業で行います。

iPhone OS Deployment Targetの調整

iPhoneアプリケーションが3.1.3以前をベースとする場合は、iPhone OS Deployment Targetを、対応するバージョンに戻してやる必要がある。

この設定によって、アクティブSDKとして、3.1.3を選択できるようになる。
*2

iPad用のMain nibファイルを作成

Main nibファイルは自動生成されないので、自分で用意する必要がある。
今回のケースでは、元のiPhoneアプリのMain nibファイルをInterfaceBuilderで開き、「Create iPad Version」を選択することで、iPadサイズのWindowに変化されたnibファイルを生成した。

そのnibファイルを保存し、プロジェクトのResources-iPadの下に配置する。

アプリの実行

アクティブSDKを3.2に設定すればiPadアプリ、3.1.3に設定すればiPhoneアプリとして実行される。

実行してみた結果は。。

以下は、とりあえずiPadアプリとして実行したときのスナップショットです。

このような標準のUITableViewのみで構成されている画面は、自動的にリサイズされ、それなりに表示してくれます。
もう一つ見てみましょう。

こちらの画面は、元々ビューを固定された位置とサイズで配置しています。自動変換はされないので、iPadに最適なレイアウトになるよう調整することが必要です。

何となく感じがわかって来たので、遅ればせながら、iPad対応を本格的に検討してみようと思います。

*1:SDK3.2では、nibファイル自体は自動で生成されないので、自分で作る必要があります。

*2:SDK3.2では、これをやらないと、iPhoneアプリとしてiPhoneシミュレータで実行することができなくなってしまいます。

iPhoneの中で動いているプロセス

SysStats Monitor/SysStats Liteでは、iPhoneの中で動いているプロセスの一覧を表示しています。
バックグラウンドで動いている標準アプリのことは、これまでにも説明してきましたが、それ以外のものについては特に触れていませんでした。AppStoreのカスタマーレビューにも、説明してほしいという声があったので気になっていたところ、そのあたりをまとめてくれているいい記事を見つけたので紹介したいと思います。

http://yebo-blog.blogspot.com/2009/11/iphone-os.html

各プロセスの役割が、簡潔に説明されており、わかりやすくまとまっているのではと思います。
ここに出ているものは常駐しているものがほとんどですが、それ以外に必要なときに随時起動されるものがいくつかあるようです。私の方で観察していて見つけたものについて、以下に補足します。

アプリをアップデートしているときに起動されるもの

  • installd
  • securityd
  • itunesstored

SysStats Monitorでは、以下のような感じで確認できます。*1

コピー/ペースト操作をしたときに起動されるもの

  • pasteboardd

位置情報を取得する操作をしたときに起動されるもの

  • locationd

iPhoneをPCに接続すると起動されるもの

  • ptpd
  • afcd
  • notification_pro
  • installd
  • mDNSResponderHel
  • syslog_relay


興味がある方は、これらの操作をした直後に、プロセス一覧画面で確認してみてください。
ちょっとマニアックな内容でしたね。

*1:開発中のスクリーンショットなので、表示色は現在リリースされているものと異なります。

SysStats Monitor/Liteの「その他」領域について

SysStats Liteのカスタマーレビューにて、メモリ使用状況の「その他」領域について質問をいただいたようなので、それについて説明したいと思います。
技術的な観点では、
SysStats Liteの「測定できない領域」は、わかりにくいものですよね。 - The iPhone Development Playground
にて説明しているので、一部重複する内容もありますが、ご了承ください。

メモリ使用状況の円グラフに表示している数値は、iPhoneOSで提供されている標準機能を使って取得しています。そこでは、

  • 固定中
  • 現在使用中
  • 現在非使用中
  • 空き

の4つの領域のサイズが得られます。

これらの合計値を見ていて、以下のことに気づきました。

  • 物理RAMサイズとこれらの合計値を比較すると、かなり差がある。
  • 合計値は、変動する。

このことから、この合計値を母数とする円グラフは、変化を比較することには適さないと考えました。
さらに調べていくと、合計値の変動は、Safariなどの標準アプリが、バックグラウンドで起動されているかどうかに影響される傾向が見えてきました。

  • Safariが起動されているときには、この合計値は少なくなる。


  • Safariを終了させるとこの合計値が増える。

母数を物理RAMサイズとすることで、こういった変化を円グラフで把握することができています。
そして、その時に生じる物理RAMサイズと、前述の4つの領域の合計値の差分を「その他」としています。
このケースでは、主に「その他」の領域が解放され、「空き」が増えたということが見て取れると思います。

「その他」領域があるのは、このように円グラフの正確さを追求した結果であることをご理解いただければと思います。