elfen00’s blog

プログラミング(Python3,C++,Typescript,javascript)関連等とガジェット(Android)関連

【Android】Root不要 Device Provisioning を使ったDocomo端末でのPackage Disablerの導入

adb pm hideがセキュリティでエラーが出る、そしてPackageDisablerが導入できない主にDocomo端末使いに人向けの記事です。ファクトリーリセットが必要となるので注意してください。
Android7.0のSC-05g(Galaxy s6)x2で動作確認しました。

追記: pm hideできなくても以下のように pm uninstall -k --user 0 で消去できることがあるようです。こちらのほうが圧倒的に簡単なので試してみると良いと思います。hideと違い戻せないらしいですが
ユーザー単位っぽいのでマルチユーザー対応端末だと話が変わってきそうです

adb shell pm uninstall -k --user 0 "com.nttdocomo.android.accountauthenticator"

概要

Device Provisioning とは主に企業で端末のポリシーを設定するのに使う機能です。 この機能を使うことでドコモに支配されていたDevice Ownerを好きなアプリに設定することができます。

【必要なもの】

NFCが付いたAndroid5.0以降の端末x2 (1台がセットアップする端末)
コメントより セットアップする側の端末はSIMカードを抜いた方がいいようです。
Android開発環境(AndroidStuido)

手順

準備

APKの入手

com.kunkunsoft.rootpackagedisablerfree あたりを適当に入手してください 以下ではファイル名は app.apkとしておきます。

Hashの計算

公式ドキュメントには

A String extra holding the URL-safe base64 encoded SHA-256 or SHA-1 hash (see notes below) of the file at download location specified in EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION.

とあるのですが具体的なやり方としては以下のサイトにある

cat app.apk | openssl dgst -binary -sha1 | openssl base64 | tr '+/' '-_' | tr -d '='

nfc - Checksum Error while provisioning Android Lollipop - Stack Overflow

アプリのホスト

アプリをダウンロードできるようにホストします。

python -m SimpleHTTPServer 8080

で適当にローカルでホストするのが簡単です。

プログラムの作成

公式ドキュメントからのリンクはGoogleAppsを導入していないとアクセスできませんがGithubにあります。

git clone https://github.com/googlesamples/android-NfcProvisioning.git

CreateAPKができるように Tool>Android >Sync Project with Gradle Filesを押して出てきたメッセージに従いSDKをダウンロードしてください。とりあえずビルドできるようにしてください。

./Application/src/main/java/com/example/android/nfcprovisioning/NfcProvisioningFragment.javaを書き換えます

EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAMEは要らないので無視するために

128~131行目の

                    if (e.getKey().equals(
                            DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME)
                            && Build.VERSION.SDK_INT >= 23) {

                    if ((e.getKey().equals(
                            DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME)
                            && Build.VERSION.SDK_INT >= 23)
                            || e.getKey().equals(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME)
                            ) {
 

に書き換えます。

またNdefMessage createNdefMessageの最後のtry以前( "String.valueOf(System.currentTimeMillis()));"の次の次の行)に

properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, "com.kunkunsoft.rootpackagedisablerfree");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, "http://192.168.0.2:8080/app.apk");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, "fmXL_oyTBiWwN8aNnJLtGaMr0sk");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION,"true");
        properties.setProperty(DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED,"true");

以上のものを付け加えます。 LocationとChecksumは自身の環境のものを使ってください。 ビルドしてインストールしてください。

実行

導入する端末を初期化して "開始"のボタンが出てる状態で待機してください。

アプリをもうー方にインストールして起動します

https://github.com/googlesamples/android-NfcProvisioning/raw/master/screenshots/1-main.png

この画面のパッケージ名、SecurityType WifiPasswordを埋めてください APIレベルによって変わってくるので環境依存ですがClass name of ~ の空欄がある場合上記ソースコードで無視するようにしたので不要です。 Security Typeは NONE, WPA or WEP です

埋めたら設定のAndroid Beamがオンの状態で2つの端末の背面をあわせてAndroidBeamで繋いでください。仕事用の端末としてセットアップされるはずです。

ここまでできればあとはPakageDisablerを使ってキャリアアプリを消しましょう。 ちなみにPackageDisabler等は管理者権限をもつのでアプリのメニューからしか削除できません。 PackageDisablerが入っているとadb restore がうまく動かないことがあるようなのでrestoreしたい人は消しましょう

【参考】

Google 公式ドキュメントたち

4. Provision customer devices  |  Android EMM Developers  |  Google Developers

DevicePolicyManager | Android Developers

Google 公式サンプルアプリ

GitHub - googlesamples/android-NfcProvisioning

その他参考にさせて頂いたサイト

kobashing.hatenablog.com この記事を元にパラメータを増やしたらできました。

https://twitter.com/rio_lio_riotwitter.com 裏垢とか言ってなんか不安ですが情報はとても参考になりました。 今のことができるNFCタグを販売しているらしいです。普通にNFCタグでやろうとすると888byteのが必要で買うのが面倒です。

動作原理詳細

普通はDocomoに邪魔をされてDeviceOwnerになれないのですが端末の初期化直後に限りこの権限を奪うことができるというものです。 Androidの標準の機能を使っているので悪いことはしてません