temporaryなめも帳

だらだらと備忘録とか。誰かの為になることをねがって。

android-DeviceOwner(GoogleのSample)を動かしてみる

これで正しいのか、まだよく分かってませんが動かすことは出来たのでおいておきます。 このやり方だと、デバッグが超大変なんだけど、、 もう少しコード読む必要がありそう。

アプリケーションを落としてきてビルドする

必要だったのは、以下の二つのアプリケーション。

https://github.com/googlesamples/android-DeviceOwner https://github.com/googlesamples/android-NfcProvisioning

落としてきて、AndroidStudioに食わせてビルドするだけ。 ただし、DeviceOwnerの方はAPKのHashとか作っておく必要があるので、Signed-APKを作成してHashを以下コマンドで作成した。

cat Application-release.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '=' > app_hash.txt

参考Link

DeviceOwnerなアプリケーションを入れ込む準備

DeviceOwnerなアプリケーションは単純にインストールするだけでは、動作しません。 こんなUIが出るだけ。

Screenshot_2015-06-07-21-09-11

FactoryReset直後にNFC(AndroidBeam)でパッケージ名、apkファイルのDL先、apkファイルのHashを送りつけるといいらしい。 この辺はAndroid5.0の時の記事が参考になりました。

Android 5.0 の Device Owner を有効にする方法

ただ、Googleさんのサンプルにはこの「DL先」と「Hash」を入れているところがなさそう。 これを追記してやる。

--- a/Application/src/main/java/com/example/android/nfcprovisioning/NfcProvisioningFragment.java
+++ b/Application/src/main/java/com/example/android/nfcprovisioning/NfcProvisioningFragment.java
@@ -129,6 +129,12 @@ public class NfcProvisioningFragment extends Fragment implements
             properties.put(DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME,
                     String.valueOf(System.currentTimeMillis()));
         }
+
+        // I just use sample DeviceOwner.apk from google.
+        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.example.android.deviceowner");
+        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "http://192.168.65.2:8080/Application-release.apk");
+        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "LMhnJMzo4gstAYyKPrSshH4tPSc");
+
         try {
             properties.store(stream, getString(R.string.nfc_comment));
             NdefRecord record = NdefRecord.createMime(

Hashは先ほどのコマンドで生成したものを利用する。 DOWNLOAD_LOCATIONの部分はPythonのSimpleHTTPServerで適当に建てておく。IPは宅内のLANのもの。

DeviceOwnerアプリのapkファイルのある箇所で、以下コマンドを叩くとサーバーが起きる。PCのウィルス対策ソフトがポート開けるのに邪魔したりするので、お気をつけを。。(しっかりハマった。)

$ ls
Application-release.apk
$ python -m SimpleHTTPServer 8080

これで準備完了。

インストールの実施

インストール先の端末はFactoryReset直後の状態(GoogleのSetupアプリ起動中)で行った。 GoogleのSetupアプリを抜けた後だと、「Oops!」になってしまう。たぶん、このアプリでの設定が終わった後に、どこぞのFlagが書き換えられているのだと思う。 この辺見てるとそんな感じ。

https://android.googlesource.com/platform/packages/apps/ManagedProvisioning/+/android-m-preview/src/com/android/managedprovisioning/DeviceOwnerProvisioningActivity.java#115

手順をまとめると以下。 1. インストール対象のデバイス(A)をFactoryResetする 2. もう一つのデバイス(B)にandroid-NfcProvisioningアプリをインストールする(上記の修正は盛り込んでおく。) 3. android-DeviceOwnerアプリのapkを任意の場所において、そこでサーバーを起動しておく 4. FactoryReset直後の画面でデバイスB->デバイスAにAndroidBeamを行う。この時、デバイスBにはandroid-NfcProvisioningを起動しておく。 5. 上手くいっていれば、デバイスAの暗号化を行うように画面が進むので、その通りにすすめる。 6. 再起動して抜けてくれば、インストール済みの状態になっている。

これで、DeviceAdminなアプリケーションとしてインストールが出来ている。 通常のものと違い、ユーザーがOFFに出来ないのがポイントなんでしょうね。 Screenshot_20150607-214044

結局DevicePolicyManager経由でコントロールするのなら、開発中は前に調べたやり方でやるのがよいのかなー。