バグレポートでAndroid Enterpriseの管理を知る

この記事は、[Android Enterprise Advent Calendar 2022](https://qiita.com/advent-calendar/2022/android-enterprise)の7日目の記事です。

## バグレポート
バグレポートはAndroidに用意されたバグの解析を助ける機能で、すべてのデバイスで利用できる便利なものです。
取得方法は[Android Studioの説明](https://developer.android.com/studio/debug/bug-report?hl=ja)にあり、
取得のためには、設定アプリから[開発者オプションを有効化](https://developer.android.com/studio/debug/dev-options?hl=ja)する必要があります。


## 管理されたデバイス
今回、バグレポートを取得するAndroid Enterpriseで管理されたデバイスについて紹介です。
- 機種 : Pixel 6Pro
- OS Version : 13
- 所有者 : 個人
- 仕事用プロファイル : あり

## 仕事用プロファイルについて
Android Enterpriseで管理する手法の一つで、個人用と仕事用にデバイスの領域を分割します。
それぞれの領域にあるアプリケーションは完全に分断されており、個人で所有するデバイスをBYOD(Bring Your Own Device)の目的に使ったり、企業で所有するデバイスをナレッジワーカー向けに提供するために用いられます。

ランチャアプリケーションにもよりますが、仕事用プロファイルのアプリケーションにはカバンマークがついて表示されます。
以下は、個人用プロファイルと仕事用プロファイルの同じアプリケーションを並べています。
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031533/4e188716-7572-c355-dba9-282a7c67c02b.png">


## バグレポート取得実践
最初に説明した通り、まずは開発者向けオプションを有効化します。

設定アプリ > デバイス情報 > ビルド番号 を何度かタップすることで有効化されます。
（今回は既に有効化してるため、画像のようになっています）
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031533/dafb5d47-8a0d-7efa-c583-707d194b8659.png">

物理ケーブルでadbコマンドを利用する場合は
設定アプリ > システム > 開発者オプション > USBデバッグ を有効

電源オプションのショートカットから取得する場合は
設定アプリ > システム > 開発者オプション > バグレポートのショートカット を有効
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031533/e2f17290-14a5-baab-6894-47bab5ce83c8.png">

今回はADBコマンドでレポートを取得するためコンソールからコマンドを実行します。
```
% adb bugreport ./Downloads
```

デバイスからのバグレポートが取得完了すると指定したフォルダにコピーされます。
```
/data/user_de/0/com.android.shell/file.... 41.4 MB/s (10225666 bytes in 0.236s)
Bug report copied to ./Downloads/bugreport-raven-TP1A.220624.021-2022-12-07-18-09-31.zip
```

バグレポートは圧縮ファイルで、解凍するといくつかのファイルが生成されます。
![スクリーンショット 2022-12-07 19.27.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3031533/fb30589d-6f22-3cbc-5839-ce8ba9d64a19.png)

## バグレポートを見る
解凍されたバグレポートの中にある一番大きなファイルであるbugreport-****.txtを開きます。

### OS情報

デバイスのOSバージョンなどの情報は**Build Fingerprint** から確認します。

```
Build fingerprint: 'google/raven/raven:13/TP1A.220624.021/8877034:user/release-keys'
```

ここで注目するのは以下の2つでGoogleのraven（Pixel 6Pro）であり、Android 13のビルドはTP1A.220624.021であることがわかります。
- google/raven/raven:13
- TP1A.220624.021

これ以外にもOSバージョンだけであれば、**ro.build.version.release**でも確認できます。
```
[ro.build.version.release]: [13]
```

### デバイス管理情報
デバイス管理の状態を見るには**DUMP OF SERVICE device_policy**のセクションを確認します。

```
DUMP OF SERVICE device_policy:
```

次に、どのアプリケーションが特別な権限を持っているかはProfile Owner や Device Ownerのadminから確認できます。

ここで表示されている**User 10**は、仕事用プロファイルのProfile Ownerであることを示しています。
**User 0**のある場合はプライマリユーザーであることを示します。

```
  Profile Owner (User 10): 
    admin=ComponentInfo{com.clomo.android.mdm_dev/com.clomo.android.mdm.activity.DeviceAdminEventReceiver}
    name=com.clomo.android.mdm_dev
    package=com.clomo.android.mdm_dev
    isOrganizationOwnedDevice=false
```

これらのパッケージがどのような制限をデバイスにかけているかは、Enabled Device Adminsの中から調べることができます。

一例ですが、**disableCamera=true**からは[カメラアプリケーションの禁止](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setCameraDisabled(android.content.ComponentName,%20boolean))。
**mPasswordComplexity=196608**から仕事用プロファイルの[パスワードポリシー](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#setRequiredPasswordComplexity(int))が設定されており、複雑性が[Medium](https://developer.android.com/reference/android/app/admin/DevicePolicyManager#PASSWORD_COMPLEXITY_MEDIUM)になっています。

```
  Enabled Device Admins (User 10, provisioningState: 3):
    com.clomo.android.mdm_dev/com.clomo.android.mdm.activity.DeviceAdminEventReceiver:
      (省略)
      disableCamera=true
      (省略)
      mPasswordComplexity=196608
```

また、parent（プライマリユーザー）にかけた制限を確認することもできます。
デバイスのロックに影響するパスワードポリシーにも複雑性が設定されており、Mediumであることがわかります。
```
      parentAdmin:
      　　　(省略)
        mPasswordComplexity=196608
```

### アカウント情報
デバイスに登録されているアカウント情報は**DUMP OF SERVICE account**のセクションを確認します。

ここでは、プライマリユーザ（User 0）には何もアカウントがなく、仕事用プロファイル(User 10)には管理アカウント（Managed Google Play）が登録されていることがわかります。
```
DUMP OF SERVICE account:
User UserInfo{0:所有者:c13}:
  Accounts: 0

(略)
    
User UserInfo{10:CLOMO MDM Managed Profile:1030}:
  Accounts: 1
    Account {name=17924334635904881233@android-for-work.gserviceaccount.com, type=com.google.work}
```

### パッケージ情報
デバイスにインストールされたアプリケーションは**Packages**セクションで確認できます。

```
Packages:
```

このアプリはパッケージIDがcom.google.android.youtubeのため、Youtubeアプリであることがわかります。

```
  Package [com.google.android.youtube] (726d541):
```
flagsはシステムアプリ(SYSTEM)であるかを判断するのに役に立ちます。

```
    flags=[ SYSTEM HAS_CODE ALLOW_CLEAR_USER_DATA UPDATED_SYSTEM_APP ALLOW_BACKUP KILL_AFTER_RESTORE RESTORE_ANY_VERSION LARGE_HEAP ]
```

Perissionsでは、アプリケーションの権限情報を確認することができ、declared(アプリで宣言)、install(インストール時に付与)、runtime(必要な時に付与)をそれぞれ確認できます。
```
    declared permissions:
      com.google.android.youtube.permission.C2D_MESSAGE: prot=signature, INSTALLED
    install permissions:
      com.google.android.c2dm.permission.RECEIVE: granted=true

    （略）
      runtime permissions:
        android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]    
```

また、アプリケーションがどのユーザ（プライマリユーザー、仕事用プロファイル）にインストールされているかもinstalledから確認することができます。
```
   User 0: ceDataInode=3201 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=1 instant=false virtual=false

   User 10: ceDataInode=7741 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=1 instant=false virtual=false
```

## 最後に
Android Enterpriseの分野では、アプリケーションがインストールされない！デバイスの制限がかかってない！のような問題が発生し、アプリケーションのLogcatやダンプだけでは判断つかない問題が多発します。
そういった場合の解決のヒントになるものとしてバグレポートを活用することが度々あります。色々読んでみると興味深いレポートになっているのでぜひ一度取得して眺めてみていただければと思います！