環境変数の確認方法とAPKファイル生成時のエラー対応
プロジェクト内で環境変数が適切に暗号化されているかどうかを確認する方法の一つとして、生成されたAPKファイルをデコンパイルしてその内容を確認することができます。
今回はその実装手順とエラーで沼った内容について書きたいと思います。
手順解説
APKファイルの生成
まずは、以下のコマンドを実行してAPKファイルを生成します。
flutter build apk
このコマンドは、デフォルトでリリースモードのAPKファイルを生成します。デバッグモードやプロファイルモードのAPKを生成したい場合は、それぞれ以下のコマンドを使用します。
デバッグモードのAPKを生成する場合:
flutter build apk --debug
プロファイルモードのAPKを生成する場合:
flutter build apk --profile
また、特定のABI(Application Binary Interface)向けのAPKを生成する場合は、以下のように指定します:
flutter build apk --target-platform android-arm,android-arm64,android-x64
これにより、APKが生成されます。
生成されたファイルの場所
<プロジェクト名>/
├── build/
│ ├── app/
│ │ ├── outputs/
│ │ │ ├── flutter-apk/
│ │ │ │ └── app-release.apk
APKファイルのデコンパイル
APKファイルのデコンパイルする際はツールを使って実装します。
今回はjadxを使ってデコンパイルすることにしました。
理由としてはHomebrewから簡単にインストールできてすぐに使用できるからです🤩
-
jadxをインストール
brew install jadx
-
デコンパイル用のディレクトリを作成
mkdir output_directory
-
APKをデコンパイル
jadx -d output_directory --show-bad-code /Users/UserName/プロジェクト名/build/app/outputs/apk/release/app-release.apk
デコンパイルされたソースコードの確認
次に、デコンパイルされたソースコードを確認します。
APIKeyが含まれているかどうかを確認するには以下のコマンドを使用します。
grep -r "ここに利用しているAPIKeyを入力" output_directory
何も表示されなければ暗号化されていることになります。
また、特定のファイル(例:.envファイル)を探す場合は以下のコマンドを使用します。
find output_directory -name "*.env"
これで何も表示されなければ暗号化されているということになります。
デコンパイルしたソースコードに.envファイルやAPIキーが含まれている場合、それらの情報が暗号化されていないことを意味します。
暗号化されていないと、アプリケーションのセキュリティに重大なリスクが生じます🥵
暗号化されていない場合のリスク
機密情報の漏洩
デコンパイルされたファイルにAPIキーやその他の機密情報が含まれていると、誰でも簡単にその情報を取得することができます。
APIキーが漏洩すると、悪意のあるユーザーがAPIを不正に使用する可能性があります。
アカウントの乗っ取り
APIキーや認証トークンが漏洩すると、アカウントが乗っ取られる可能性があります。これにより、データの改ざんや不正アクセスが発生する可能性があります。
サービスの悪用
APIキーが不正に使用されると、サービスが過剰に利用されるリスクがあります。これにより、使用制限を超えるAPIリクエストが発生し、サービスのパフォーマンスやコストに悪影響を及ぼす可能性があります。
以上の理由から暗号化確認は重要です👁️
APKファイル生成時のエラー: AAPT: error: resource android:attr/lStar not found.
APKファイル生成時に以下のエラーにハマリました☠️
エラー全文
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':background_fetch:verifyReleaseResources'.
> A failure occurred while executing com.android.build.gradle.tasks.VerifyLibraryResourcesTask$Action
> Android resource linking failed
ERROR:/Users/UserName/プロジェクト名/build/background_fetch/intermediates/merged_res/release/values/values.xml:2520: AAPT: error: resource android:attr/lStar not found.
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 1m 18s
Running Gradle task 'assembleRelease'... 78.5s
┌─ Flutter Fix ──────────────────────────────────────────────────────────────────────────────┐
│ [!] Your project requires a newer version of the Kotlin Gradle plugin. │
│ Find the latest version on https://kotlinlang.org/docs/releases.html#release-details, then │
│ update /Users/UserName/プロジェクト名/android/build.gradle: │
│ ext.kotlin_version = '<latest-version>' │
└────────────────────────────────────────────────────────────────────────────────────────────┘
どうやらAPKをビルドしようとした際に、Androidリソースリンクエラーが発生しているようで、特に、android:attr/lStar
が見つからないというエラーが出ているということでした。
解決策
とりあえず解決策をChatGPTに問い合わせました🤖
以下の方法が提示されました
- Kotlin Gradleプラグインのバージョンを更新する
- 依存関係を最新バージョンに更新する
- GradleとAndroid Gradle Pluginのバージョンを更新する
提示内容を実装しても解決できませんでした😭
最終的に以下の記事を参考にして解決することができました。
android/build.gradle
ファイルに以下の行を追加しました。
buildscript {
ext.kotlin_version = '1.9.10'
ext {
appCompatVersion = "1.4.2"
playServicesLocationVersion = "21.0.1"
compileSdkVersion = 33 // 追加
}
//省略
}
compileSdkVersionとは
Androidアプリのビルド設定で指定されるパラメータで、アプリをコンパイルする際に使用するAndroid SDKのバージョンを示します。
解決策の背景
エラーを解決するために、android/build.gradle
ファイルにcompileSdkVersion = 33
を追加しました。
これにより、プロジェクトがAndroid SDKバージョン33を使ってコンパイルされるようになりました。
なぜこれが解決策となったか
-
compileSdkVersion
: compileSdkVersionがAPIレベル31未満の場合や、依存関係のバージョン不整合が原因のようです。
追加したcompileSdkVersion = 33
によって、プロジェクトがSDKバージョン33でコンパイルされるようになり、android:attr/lStar
が利用可能になりました。
これにより、リソースリンクのエラーが解消されました。
android:attr/lStarは、Android 12(APIレベル31)以降で導入された属性で、テーマ関連の設定に使用されているようです。
最後まで読んでいただきありがとうございました🙇🏻
告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。
みなさまからのご応募をお待ちしております。