2021年12月1日水曜日

自動的に公開されるアプリってなんなんだよ(怒

ドはまりしました。

ContentProviderでデータ共有しているアプリとそれを利用しているResolverで全くうまくいかなかった。

ここ数年正直Androidへの興味が正直失せていたのは事実なんですが、ここまでガードするかというほどガードされてました。まぁいいんですが。言いたいことはあるけどもキリがないですねぇ…。

と、今回ハマった経緯は、SDKレベル29か30で止めておくとそれなりにエミュレータ上のAndroid12でも動いてくれていた。が、targetSDKを31に上げると動作が怪しくなっていくという。よくあるパターン。Androidの方針としては従来のリソースはできる限りリソースが動作できるようにAndroid側でカバーして実行してくれるのですが、その指標としてビルド時のtartgetSDKレベルを使用しています。それでもダメとなるとバッサリ行かれちゃいますが、その辺は色々な人がかかわっているようで、流行やら何やらで色々変わっている印象を受けます。

とりあえず利用する側の調整が落ち着いたので、共有側に手を入れたのですが、Android11とか12だと全くうまくいかないという結果に。

エラーを見ても全くどういう状況下把握すらできず、ひたすらググるのみ。ただ、ほとんどの情報は枯れた過去のAndroidバージョンの話とかが大半でほしい情報がなかなか得られず、右往左往しました。その中でも興味深いと思ったのが、uriのcontent://com.hogehoge.provider/tableという記述の「content://」を取ったらうまくいったという記述。いやいやまさかwと思いつつもやってみると実行時エラーの内容が変わっていって、しかも何となく内部で動いてくれているっぽいような記述に変わっているという。実際のソースを追いかければその辺も見えてきそうなんですが、SDKは定義体ぐらいしか見れないのでなんていうかね…ソースは公開されているという話だけど、未だ見たことがない。

そんなブラックボックステストをしつつ、必要そうな記述を追加したり外したり、入れ替えたりと。ですが、結局変わらず。

あきらめついでにバッテリーが膨らんで放置しているスマホの電源を入れて動作確認したりしながらいろいろと考えてみるが、わからんものはわからんという当たり前の話。

しかしながらググりまくってなんか面白いサイトがあって、そこのページを見ていると今まで見たことないAndroidManifestのキーワードが。

<queries>

なんかパッケージ名とか記述してるみたいだけどなんなんだろうと、さっそくデベロッパーズドキュメントへ。

Android 11 以降をターゲットとするアプリで、自動的に公開されるアプリ以外のアプリとの連携が必要な場合は、アプリのマニフェスト ファイルに <queries> 要素を追加します。

は?自動的に公開されるアプリ?何を言ってるかマジわからんが…。

ん~っと、もしかしてパッケージとかインテントとかそれなりに投げればそれなりに処理されていたのが、アプリ側からは相手がいないように見えるってことか?しかもそれがデフォルト?

いやなにそれw

はぁ…kitkatぐらいの時点でAndroidの変更点とか見るのが嫌になってるんですが、そこのつながりにこんなこと書いてあったっけか??

と、ものすごい現状の動作の状況が納得いくので、期待して記述を追加してみました。

ちなみに、ContentProviderは基本的に何らかのpermissionを設定するように強制されているのか推奨されているのか不明な状態ですが、どっちにしてもandroid:protectionLevel="signature"が最低でも強要されると思われるので設定していたりします。リリース時はあれだけどデバッグ時はどうなんだろうと思って最初はリリースビルドを行ってエミュレータにファイルを入れてインストールしていたのですが、試しにそのまま実行したらうまくいきました。記憶をたどれば確かデバッグ用の認証キーでパッキングしているとかなんとか見かけた気がします。そのおかげでデバッグはそこまで面倒ではなさそう。

ただ、Android11はnormalでも動いた。12はどうだろう?→ダメでした。何らかの権限設定が必要で、ContentResolver単体で行おうとするとsignature以外に選択肢はなさそうです。

0 件のコメント:

コメントを投稿