非公開APIとは
AndroidにはAPIの種類があります。
殆どの方が使用するのは、publicAPI(AndroidStudioで開発する際誰もが使用できるAPI)だと思います。
Android Code Serarch UserHandle#myUserId()を見てみるとMethodの上に@SystemApiや@hideやらついています。
これらのAPIは普段3rdParty(GooglePlayからインストールするようなApp)では使用できないAPIになります。
じゃなぜこれの説明をするのって??
日々の業務の中でPre-inAppを作成しており、そのAppを配信化する事になりました。
しかし!!先ほど説明した非公開API(@SysteApiや@hideがついているMethod)は使用しない方針で進める事になりました。
現状各Pre-inAppには大量の使っており、置き換えもしくは設計の見直しが必要になりました。
ということでまず非公開APIにも見分け方があるという事で今回はそちらを記載します。
なぜ見分け方を知る必要があるか??
Googleは非公開APIを見分けるToolを用意してくれています。veridex
しかし、なぜか出力されないAPIもあるという事に気が付き、自身でも見分け方を知っておく必要がありました。
見分け方1-APIのみに@SystemApi or @hideが付与
例:Android Code Serarch UserHandle#myUserId()
こちらは簡単です。APIの直下に付与されている場合、そのアノテーションが有効化されます。
SystemApiの場合は、@hideと@SystemApiの2つが付与されSystemApiに識別されます。
hideApiは@hideのみが付与されhideApiに識別されます。
見分け方2-Classに@SystemApi or @hideが付与
例:VolumeInfo.java
Class自体にアノテーションが付与されている場合はClass全体が非公開APIと識別されます。
こちらは普段使用する方は殆どいないと思います。
もちろんAndroidStudio等で入力しても自動変換されず、buildすらできない状態になります。
見分け方3-Classに@SystemApi、APIに@hideが付与
Class全体はSystemApiですが、APIの上に@hideが付与されている場合はそちらが優先されます。
補足
他にも種類はありますが、殆どの非公開APIはこれでも網羅できます。
またSystemApiとhideの違いについてはAppをインストールする場所によって、利用可能か変わってきます。
Appをインストールするパーテーションという仕切りによって権限が変わり
system配下の場合hideApi, SystemApiも利用可能。product配下の場合SystemApiが利用可能になります。
最後に
もしこれからAppを作られる方は特別な理由がない限りはApp層のAppには非公開APIを使用しない事をお勧めします。
基本的にGoogle自体もhideApi, SystemApiの利用はお勧めしてません。