2024年3月23日土曜日

Android アプリを久しぶりにビルドしたときのメモ

Android アプリを久しぶりにビルドしたときのメモ

概要

シミュレーターで動作するまでにいろいろとエラーを解消する必要があったのでメモしておきます
正直出過ぎるので都度対応するのが面倒な場合は一から書き直したほうが最新のプロジェクト構成にもなるので良いかなと思います

環境

  • macOS 14.4
  • Android Studio Iguana
  • コード最終コミット 2018/10/2

gradle plugin のバージョンの指定

エラー

A problem occurred evaluating project ':app'.

解決方法

build.gradle で gradle のバージョン部分を修正する
File -> Project Structure -> Project からでも OK

agp_version = '8.3.1'

distributionUrlの設定

エラー

Minimum supported Gradle version is 8.4. Current version is 8.2.

解決方法

./gradle/wrapper/gradle-wrapper.properties を作成し以下を記載する

distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip

namespace の指定がない

エラー

Namespace not specified. Specify a namespace in the module's build file.

解決方法

app/build.gradle への namespace ディレクティブの追加

android {
    namespace "com.example.myapp"

Suggestions のアップデート

エラー

  • 不明

解決方法

File -> Project Structure -> Suggestions から表示されている Update を適用すれば OK

この段階で gradle ビルドは成功した
以下は実行時に発生したエラーへの対処方法

AndroidX へのマイグレーション

エラー

Caused by: com.android.builder.errors.EvalIssueException: Configuration `:app:debugRuntimeClasspath` contains AndroidX dependencies, but the `android.useAndroidX` property is not enabled, which may cause runtime issues.

解決方法

./gradle.properties の作成と以下の追記

android.useAndroidX=true
android.enableJetifier=true

コードの AnroidX へのマイグレーション

エラー

import android.support.v7.app.AppCompatActivity がないなどのエラー多数

解決方法

なぜか Iguana には Migrate to AndroidX の機能がないので shell スクリプトを使う

#!/usr/bin/env bash

# I've found that the "Migrate to AndroidX" converter in Android Studio doesn't work very
# well, so I wrote my own script to do the simple job of converting package names.
#
# You can download a CSV of package names here: https://developer.android.com/topic/libraries/support-library/downloads/androidx-class-mapping.csv
#
# It'll run faster on a clean build because then there are fewer files to scan over.
#
# Uses `gsed` because I'm on a Mac. Can easily replace with `sed` if you don't have `gsed`.
# 
# This isn't perfect; it won't find every conversion issue. You break it you buy it. Viewer discretion is advised.

MAPPING_FILE=~/Downloads/androidx-class-mapping.csv
PROJECT_DIR=~/data/repo/android-fndic

replace=""
while IFS=, read -r from to
do
        replace+="; s/$from/$to/g"
done <<< "$(cat $MAPPING_FILE)"

find $PROJECT_DIR \( -name "*.kt" -o -name "*.java" -o -name "*.xml" \) -type f -not -path '*/\.git*' -print0 | xargs -0 gsed -i "$replace"

package 定義の削除

エラー

Setting the namespace via the package attribute in the source AndroidManifest.xml is no longer supported.

解決策

AndroidManifest.xml から package を削除

SDK バージョン修正

エラー

A failure occurred while executing com.android.build.gradle.internal.tasks.CheckAarMetadataWorkAction

上記プラス指定のバージョンが小さすぎるという旨の英語のエラーが出たはず

解決策

app/build.gradle への minSdkVersion と targetSdkVersion の修正

minSdkVersion 21
targetSdkVersion 34

AndroidManifest.xml の activity に android:exported の追加

エラー

android:exported needs to be explicitly specified for element

解決策

android:exported="true"

google-services のアップデート

エラー

Type 'com.google.gms.googleservices.GoogleServicesTask' field 'quickstartFile'

解決策

build.gradle 修正

classpath 'com.google.gms:google-services:4.4.1'
mavenCentral()

コードリファクタ

エラー

error: package R does not exist
error: cannot find symbol addTestDevice

など

解決方法

基本はリファクタ機能を使えば OK
Admob に関しては参考サイトの URL の通りにバナー広告などを設置する

Admob 修正

エラー

Missing application ID. AdMob publishers should follow the instructions

解決方法

https://developers.google.com/admob/android/quick-start?hl=ja#import_the_mobile_ads_sdk

AndroidManifest.xml に APPLICATION_ID を追記する

Admonb 修正2

エラー

The ad unit ID can only be set once on AdView.

解決策

xml 側とコード側で2回広告IDをセットしている場合はどちらかを削除する

adView.setAdUnitId("ca-pub-xxx")

アプリビルド時の Signing の修正

エラー

Android App Bundle をアップロードするには、Play App Signing に登録している必要があります。

解決策

公開鍵と pepk.jar をダウンロードし秘密鍵を生成
秘密鍵は Google Play にアップロード
公開鍵 (encryption_public_key.pem) は Google Play からダウンロード可能
これを使ってアプリに Signing する
keystore がない場合は Android Studio で作成する

  • java -jar pepk.jar --keystore=app.crt --alias=foo --output=app.key --rsa-aes-encryption --encryption-key-path=encryption_public_key.pem

最後に

アプリのプロジェクトは常に最新バージョンに対応しておかないと大変なことになります

参考サイト

0 件のコメント:

コメントを投稿