Natural Intelligence による記事要点まとめ
・VC++ 2019 で Android アプリのアイコンを設定する手順を示している。
・利用デバイスの画面解像度別にアイコンを用意しておく。
・パッケージのビルドエラーが発生したら Debug フォルダを削除するのも一手である。
Windows 10 Pro(64 ビット)と Visual Studio Community 2019 の C++ で、 Android ネイティブアプリにアプリアイコンを設定する手順を記録しています。
ここまでに、Visual Studio 2019 で Android ネイティブアプリが作成でき、SDK や NDK が正しくセットアップされていて、 自動生成されたコードのビルドが通り、接続した実機で動作するようになっている前提です。
開発環境の構築についてはここでは触れていませんので、まだの方は、 「VS2019 の Android 開発環境を整える」 を先に参照してください。
VC++ 2019/2015 で新規プロジェクトを作成する
セットアップ済みの VS2019 で Android ネイティブアプリを作成し、
ビルド完了するまでの CPU や API レベル設定の手順について、書いています。
Android 端末は、画面サイズ、解像度ともさまざまですので、 設定したアイコンが綺麗に表示されるためには複数のサイズのアイコン画像を用意しなくてはなりません。
ですが、開発開始段階でそこに力を注ぐのもどうかと思いますから、 とりあえず表示されるものを用意しておいて、あとで追加する方法で良さそうです。
ここでは基本的なアイコン設定方法に加え、 テスト途中で遭遇した、パッケージのビルドエラーからの回復方法についても書いています。
なお、本サイトのご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
投稿 March 20, 2021
のちに、これが最も適切な方法ではないようだ、とわかっていますが、 何しろ最も簡単な手順でアイコンを設定できるため、まずはこれで設定し、 デフォルトで使用される Android の半円頭のアイコンでスマホが埋め尽くされ、 どれがどれだかわかりにくくなることを回避したいと思います。
アイコン用の画像として、
Android 9 の ZenFone Max (M2) で見ると、 アイコン画像の四隅を透過にしておくと丸く切り抜かれたアイコンとなり、 透過がない場合はその形のまま(四角い)アイコンとなるようです。 これについては深く検討していませんが、透過を含んでおいたほうが良さそうです。 透過を作るために、私は Windows 標準の「ペイント」と、Photoshop Elements を併用しています。
▼ Amazon 広告 ▼
Adobe Photoshop Elements 2024 | 通常版 | Windows対応 | オンラインコード版
Adobe Photoshop Elements 2024 | 通常版 | Mac対応 | オンラインコード版
VS2019 で Android ネイティブアプリ・プロジェクトを開き、ソリューションエクスプローラーから <プロジェクト名>.Packaging の res フォルダに、 drawable フォルダを作成します。 ソリューションエクスプローラーで res を右クリック、 「追加」、 「新しいフォルダー」と選び、 「drawable」と入力します。 あとで触れますが、作成するフォルダ名を間違えると面倒なことになるようですから、 スペルに注意して入力します(もちろん回復することもできます)。 また、このとき、drawable フォルダをエクスプローラーで作成してしまうと、 .Packaing に drawable フォルダを登録できなくなってしまうようです。
アイコンにしたい画像ファイルを、作成した drawable フォルダにコピーします。
ソリューションエクスプローラーで、今作成した drawable を右クリック、 「追加」、 「既存の項目」と選び、 iccomp.png として作成したアイコン画像を選択します。 動作としては、指定したアイコン画像を、もとの場所からこのフォルダにコピーしてプロジェクトに登録、となっています。
ファイル名は iccomp.png としていますが、このあと AndroidManifest.xml で指定すれば、別名でも良いのかも知れません。 サイズは、とりあえず 256 × 256 ピクセルとしています。 Adobe Photoshop Elements で作成する場合、圧縮率などの指定が必要になりますが、 圧縮あり、インターレースなしとしています。
AndroidManifest.xml で、アイコンファイル名を指定します。
Application タグに、android:icon を追加します。 このサイトの手順通りに進んできた場合は、下記のようになっています。 そうでない場合は、android:hasCode が false に設定されていますが、そこはそのままで問題ありません。
<application android:label="@string/app_name" android:hasCode="true" android:icon="@drawable/iccomp">
@drawable のあとでファイル名を指定しています。
drawable 指定ですから、デバイスの画面解像度から自動的に、 低解像度なら drawable-mdpi フォルダが、それより少し高い解像度なら drawable-hdpi フォルダが、 と参照されるフォルダが変わりますが、 「見つからない場合は次善のフォルダが選択される」とされており、 それらがどれも見つからないと、drawable フォルダが参照されることになるはずです。 ですので、これで、デバイスの解像度には関係なく、つまり綺麗に表示されるかどうかに関係なく、 このフォルダのアイコン画像が選択されることになります。
ZenFone Max (M2) では、これだけでうまくいきました。
投稿 March 20, 2021
デバイスの解像度に応じて、アイコン画像ファイルを使い分けられます。 基本的には、同じデザインのアイコン画像を複数のサイズで用意しておき、 なるべく拡大・縮小が起きずに綺麗に見えるようにします。
Android 4.4.2 の GEANEE スマホで試してみます。 画面解像度は 540 × 960 ピクセルです。 密度はすぐにはわかりませんが、 上記のように drawable に 256 × 256 ピクセルの iccomp.png だけを配置すると、問題なく表示されました。
drawable に対して付加する文字列と
物理的な画面サイズと dpi 値は比例すると考えて問題ありませんが、dpi だとわかりにくいので、Qiita の 「マルチ解像度対応 Drawable リソースの設置場所」 を参照するほうがわかりやすいです。
解像度 540 × 960 ピクセルの端末で、試しました。
まず、中密度、〜160 dpi、解像度 320 × 480 に対応する drawable-mdpi を作成し、アイコン画像ファイルを置いたら、 drawable より優先して利用されました。 Android Developer では、これが「基準密度」と書かれています。 テストでは、drawable と同じサイズ、デザインのまま、画像に適当に「M」とかを上書きしたものを使用しています。 ファイル名は同じである必要があります。
続けて、高密度、〜240 dpi、解像度 480 × 800 や 540 × 960 に対応する drawable-hdpi を作成し、アイコン画像ファイルを置いたら、 drawable や drawable-mdpi より優先して利用されました。 デバイスの解像度とぴったり一致なので、期待通りの動作です。
さらに、超高密度、〜320 dpi、解像度 720 × 1280 に対応する drawable-xhdpi を作成し、アイコン画像ファイルを置いたら、 drawable-hdpi のファイルのまま、変わりませんでした。 つまり、このフォルダのものは最適ではないと判断され、使われなかったということです。 期待通りの動作をしています。
修飾のない drawable には触れられていませんが、 これしかない場合は、これが使われるようです。
アイコンについて言えば、どの解像度に対して、何ピクセルの画像を用意すべきかは、 これだけではわかりません。
なお、Qiita には、 「画像をとりあえず Drawable フォルダに放り込むのをやめよう」 でも、解説されています。
投稿 March 20, 2021
Android Developer の 「アプリアイコンを mipmap ディレクトリに配置する」 を見ると、アイコンは mipmap フォルダに置くべきだとされています。
日本語になっている説明ですが、要はメーカー UI にうまく対応するためには、 アイコン画像ファイルは drawable フォルダに置くのではなく、 mipmap フォルダに置く必要がある、と言っているようです。
"drawable" の代わりに "mipmap" を指定してアイコン画像ファイルを配置するようですが、 AndroidManifest.xml も書き換える必要があるでしょう。
今度は Android 9 の ASUS ZenFone Max (M2)、画面解像度 720 × 1,520 ピクセルで試します。 密度はすぐにはわかりません。
AndroidManifest.xml で @drawable と指定したままなので、 事前に想像はつきますが、 ここまでに作成した drawable 系のフォルダはそのままに、 mipmap フォルダを作成してアイコン画像ファイルを置きましたが、 超高密度、〜320 dpi、解像度 720 × 1,280 に対応する drawable-xhdpi のアイコンが使われました。
もちろん、 mipmap-xhdpi を作成しても、 drawable-xhdpi のアイコン画像ファイルが使われました。
AndroidManifest.xml のアイコン画像ファイル指定部分で @drawable を指定していた部分を、 @mipmap に書き換えます。
<application android:label="@string/app_name" android:hasCode="true" android:icon="@mipmap/iccomp">
まずはデフォルトのフォルダとなるであろう mipmap フォルダを作成し、 アイコン画像ファイルを置くと、その画像が使用されました。 少なくともこれが本来の形と言えるのでしょう。
解像度別では、ZenFone Max (M2) では適切な mipmap-xhdpi フォルダを作成し、 アイコン画像ファイルを置くと、 mipmap に置いていた画像ではなく、この画像が使用されました。 期待通りです。
このときに、問題が起きていました。
上記動作は再確認したあとの動作ですので間違いではないのですが、 そこに至る前に、次のセクションに書いているような問題がありました。
Android ネイティブアプリのビルドでは、 なんだか直接エラーとなっている部分がわかりにくいので、 どういう理由かわからないままに、プロジェクト再作成になるかと思いました・・・。
投稿 March 20, 2021
AndroidManifest.xml で @mipmap 指定をしたあと、 最初に mipmap-xhdpi フォルダを作成し、 そこに drawable-xhdpi にあったアイコン画像ファイルをコピーしました。 その画像は、基本デザインに「xh」と上書きしたものでした。
VS2019 のツールバーにある、緑の右矢印ボタンをクリックして、 ビルド後デバイスに転送で実行すると、 mipmap-xhdpi の画像が使われました。
しかし、mipmap フォルダを作ると、 mipmap-xhdpi が最適と思われるにも関わらず、 mipmap にあるイメージが使われ、 mipmap-xhdpi の画像は使われませんでした。
いったん mipmap をなくし、mipmap-xhdpi だけにするとどうなるか、と思ったところで気が付きました。 入力ミスで、mipmap-xhdip となっていました。 フォルダ名にミスがあったものの、 mipmap 系のフォルダがそれしかなかったので、参照されただけのようです。 正しい名前である mipmap ができたら、それが優先して使われる、という具合です。
ソリューションエクスプローラーで mipmap-xhdpi とリネームすると、 正しくリネームされましたが、 Packaging のビルドが通らなくなりました。
mipmap フォルダや mipmap-xhdpi フォルダを削除して、 AndroidManifest.xml で @drawable 指定に戻しても、Packaging のビルドが通りません。
どこかに mipmap の設定が残っているのかと、 AndroidManifest.xml の他の部分を見ても、 .Packaging に含まれている他の2ファイル、 build.xml や project.properties を見ても、そのような設定はありません。
それでもビルドは通りません。 リビルドしても、通りません。 「ソリューションのクリーン」をしたあとでも、通りません。
「出力」タブには、次のように記録されています。
2>-package-resources: 2> [aapt] Creating full resource package... 2> [aapt] invalid resource directory name: D:\〜パスは省略〜\nsIconTest.Packaging\ARM64\Debug\Package\res mipmap-xhdip
nsIconText がプロジェクト名です。
どうやら res に mipmap-xhdip があることを期待して探しているようですが、リネームしたので、もうありません。 ついでにリネーム後の mipmap-xhdpi も、もうありません。 エクスプローラーで見ても、.Packaging の res フォルダに、mipmap-xhdpi フォルダはありません。 しかし、それでも探しています。
いったんは、プロジェクトの再作成を覚悟しましたが、問題は解決しました。
エクスプローラーでソリューションのあるフォルダを検索すると、 見つかりました。
エクスプローラーで見ると、 ターゲット CPU を ARM64 としていますので、 <プロジェクト名>.Packaging の下、 ARM64、 Debug、 Package、 res とフォルダを開いていくと、 追加や削除した歴代のフォルダが残っており、 そこに mipmap-xhdip フォルダがあり、 それをソリューションエクスプローラーでリネームした mipmap-xhdpi フォルダもありました。
ソリューションエクスプローラーでフォルダを削除しても、 この Debug にあるフォルダは削除されずに残り、 「ソリューションのクリーン」でもフォルダが削除されないため、 今ある res フォルダと配置が異なっている、これが原因のようです。
今回のケースで回復するには、res フォルダにある、もう使わなくなったフォルダだけを削除すればいいとは思うのですが、 今後のこともありますから、 .Packaging の ARM64 にある Debug フォルダをまるごと削除して再ビルドしてみます。
ビルドが通りました。
VS2019 での Android ネイティブアプリ開発においては、 今回のケース以外でも、ビルドエラーが出たときに、 どこに問題があるのかを突き止めるのが非常に難しいと思います。 別のノート PC に VS2019 から Android 開発環境を入れたときにも、 SDK や NDK の設定によりエラーとなって、いろいろ入れ替えたもののうまくいかず、どうにも納得いかないケースがありましたが、 そのときもこのように Debug フォルダを削除すれば回復したのかも、と思えます。
理不尽なエラーが出たら、Debug フォルダを削除、 と覚えておきます。
本サイトに関するトピックは 開発ブログに書き込んでいます。
AndroidManifest でアプリ名を指定する方法について、書いています。
個人なら無料で利用できる Visual Studio Community 2019 の、 Android 開発に必要な機能をインストールし、設定を完了させる手順について、書いています。
Android 8.1 端末で、開発者モードにする手順、解除する手順について、書いています。 開発者モードには、「Wi-fi が弱いときモバイルデータ通信を優先する」のような便利な設定もあります。
Android 開発に関する記事をまとめた Android 開発トップ もご覧ください。