Posted at

[Android]Googleのセットアップウィザードについて

More than 3 years have passed since last update.

誰得情報ですが、Kitkat以降?に追加されたAndroid端末を初回起動するときに表示されるGoogleのセットアップウィザードについて少し調べたのでメモしておきます。


Google Setup Wizard

初回起動時に表示されるあれです。

パッケージ名はcom.google.android.setupwizardです。

セットアップ中はナビゲーションバーにはバックキーしか表示されず、システムバーにも限られた情報しか表示されません。

このアプリはOSSではなくGoogleのプリプロエタリなアプリなのでソースは公開されていないです。(多分。公開されていたら教えてください。)

仕組みは詳しく調べていませんが、Androidのソースコードにcom.android.setupwizard.navigationbarという階層があるので、システムで用意されているようです。

CyanogenなどのカスタムROMでも同様のセットアップアプリが用意されているので、ベンダーなら作ることができるかもしれません。


起動方法

通常は初回起動時に勝手に起動されるのですが、もう一度やってみたい!というとき用に起動方法がのこされていました。

すでにこちらで紹介されていました。

Androidで特殊なアップデート方法をした後にホームボタンが効かなくなった場合の対処法

以下のadbコマンド、というかintentを発行するだけで呼ぶことができます。

externedなComponentNameらしく、普通のアプリからでも起動可能なようです。

adb shell am start -n com.google.android.setupwizard/.SetupWizardTestActivity

debug用の機能っぽいのでいつの間にか削除されているかもしれません。


セットアップが終了しているかの判別

標準APIでSETUP_WIZARD_HAS_RUNというものがあり、ContentResolverを使ってセットアップ実行済みかを取得することができるように書いてありますが、Google Setup Wizardではこの値は変更されず、取得できません。

考えてみれば、セットアップ実行前だと


  • Google Playにアクセスできないのでアプリの新規インストールできない

  • 設定画面もみれず開発者モードにできないのでadb installも出来ない

  • ファイルマネージャーも開けない(そもそもない端末もありますが)のでapk直接インストールも出来ない

と、ほとんどのアプリの場合セットアップ前であることはあり得ません。

(カスタムROMやroot化端末でのプリイン?)

なので判別自体ほぼ不要ですが、ちょっと気になったので調べてみました。

rootを取得済みならセットアップウィザードアプリのPreferenceファイル等を調べれば分かりそうです。

そうでない場合、このアプリではセットアップ完了後にSetupWizardActivityのComponentをdisableに変更しているようですので、

com.google.android.setupwizard/.SetupWizardActivity

のintentが発行か可能か調べればだいたいの目安にはなりそうです。

参考:SetupWizard AndroidManifest.xml


example.java

PackageManager pm = context.getPackageManager();

Intent i = new Intent();
i.setClassName("com.google.android.setupwizard", "com.google.android.setupwizard.SetupWizardActivity");
List<ResolveInfo> list = pm.queryIntentActivities(i, 0);
if (list.size() == 0){
// 実行可能なActivityがない = セットアップが完了している
return;
}

// intentの受け取り先が見つかった時点でsetup実行前の可能性が高いです。
// 念のためPackageManager.getComponentEnabledSettingで変更されたかを確認してもいいかもしれません。
// int enabledSetting = pm.getComponentEnabledSetting(new ComponentName(activityInfo.packageName, activityInfo.name));


仕様が変更される可能性もあり確実ではないと思いますが。。


セットアップ終了、開始の検知

開始時と終了時にそれぞれBroadcastIntentを発行してくれているので、それを受信すれば検知できます。

親切ですね。

<!-- 以下のフィルターを任意のBroadcastReceiverに追加します。-->

<intent-filter>
<!-- 開始時に発行されていたIntent。名前的に他にも発行されているかもしれません -->
<action android:name="com.google.android.setupwizard.CHECKIN_SUCCESS" />
<!-- 終了時に発行されていたIntent -->
<action android:name="com.google.android.setupwizard.SETUP_WIZARD_FINISHED" />
</intent-filter>


Android標準のセットアップ?

昔はcom.android.setupwizardというpackageNameのアプリが入っていたようです。

いつの間にか消えて(?)Googleのプリプロエタリなものに置き換えられています。

おそらくGoogle Playを利用する上でアカウントの設定など、初回に済ませておきたい項目ができたのでしょう。

もしくは戦略的な問題かと思われます。

昔のセットアップウィザードは忘れてしまいました。。

その頃はSETUP_WIZARD_HAS_RUNの設定値を見ることで正しくセットアップ状況を確認できたのかもしれません。