[Flutter] 環境変数の確認方法とAPKファイル生成時に沼った話　 AAPT: error: resource android:attr/lStar not found.

# 環境変数の確認方法とAPKファイル生成時のエラー対応

プロジェクト内で環境変数が適切に暗号化されているかどうかを確認する方法の一つとして、生成されたAPKファイルをデコンパイルしてその内容を確認することができます。
今回はその実装手順とエラーで沼った内容について書きたいと思います。

## 手順解説

### APKファイルの生成
まずは、以下のコマンドを実行してAPKファイルを生成します。
```bash
flutter build apk
```
このコマンドは、デフォルトでリリースモードのAPKファイルを生成します。デバッグモードやプロファイルモードのAPKを生成したい場合は、それぞれ以下のコマンドを使用します。

デバッグモードのAPKを生成する場合：
```bash
flutter build apk --debug
```

プロファイルモードのAPKを生成する場合：
```bash
flutter build apk --profile
```

また、特定のABI（Application Binary Interface）向けのAPKを生成する場合は、以下のように指定します：

```bash
flutter build apk --target-platform android-arm,android-arm64,android-x64
```

これにより、APKが生成されます。


成功すると以下のように表示されます。
![スクリーンショット 2024-06-07 9.33.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772799/0682827b-2d33-3793-b25f-ff6c397e885e.png)

生成されたファイルの場所
```
<プロジェクト名>/
├── build/
│   ├── app/
│   │   ├── outputs/
│   │   │   ├── flutter-apk/
│   │   │   │   └── app-release.apk
```

### APKファイルのデコンパイル
APKファイルのデコンパイルする際はツールを使って実装します。
今回はjadxを使ってデコンパイルすることにしました。
理由としてはHomebrewから簡単にインストールできてすぐに使用できるからです🤩

1. jadxをインストール
    ```bash
    brew install jadx
    ```

2. デコンパイル用のディレクトリを作成
    ```bash
    mkdir output_directory
    ```

3. APKをデコンパイル
    ```bash
    jadx -d output_directory --show-bad-code /Users/UserName/プロジェクト名/build/app/outputs/apk/release/app-release.apk
    ```

### デコンパイルされたソースコードの確認
次に、デコンパイルされたソースコードを確認します。

APIKeyが含まれているかどうかを確認するには以下のコマンドを使用します。
```bash
grep -r "ここに利用しているAPIKeyを入力" output_directory
```
何も表示されなければ暗号化されていることになります。

また、特定のファイル（例：.envファイル）を探す場合は以下のコマンドを使用します。
```bash
find output_directory -name "*.env"
```
これで何も表示されなければ暗号化されているということになります。

:::note alert
デコンパイルしたソースコードに.envファイルやAPIキーが含まれている場合、それらの情報が暗号化されていないことを意味します。
暗号化されていないと、アプリケーションのセキュリティに重大なリスクが生じます🥵
:::

### 暗号化されていない場合のリスク
**機密情報の漏洩**

デコンパイルされたファイルにAPIキーやその他の機密情報が含まれていると、誰でも簡単にその情報を取得することができます。
APIキーが漏洩すると、悪意のあるユーザーがAPIを不正に使用する可能性があります。

**アカウントの乗っ取り**
APIキーや認証トークンが漏洩すると、アカウントが乗っ取られる可能性があります。これにより、データの改ざんや不正アクセスが発生する可能性があります。

**サービスの悪用**

APIキーが不正に使用されると、サービスが過剰に利用されるリスクがあります。これにより、使用制限を超えるAPIリクエストが発生し、サービスのパフォーマンスやコストに悪影響を及ぼす可能性があります。

:::note info
以上の理由から暗号化確認は重要です👁️
:::



# APKファイル生成時のエラー: AAPT: error: resource android:attr/lStar not found.
APKファイル生成時に以下のエラーにハマリました☠️

エラー全文
```plaintext
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のバージョンを更新する

提示内容を実装しても解決できませんでした😭

最終的に以下の記事を参考にして解決することができました。

https://github.com/rodgomesc/vision-camera-code-scanner/issues/112

`android/build.gradle`ファイルに以下の行を追加しました。
```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）以降で導入された属性で、テーマ関連の設定に使用されているようです。

https://developer.android.com/reference/org/w3c/dom/Attr

https://developer.android.com/guide/topics/resources/color-list-resource?hl=ja

最後まで読んでいただきありがとうございました🙇🏻


# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを
募集しております。詳しくは採用情報ページをご確認ください。

https://eda-inc.jp/recruit/

みなさまからのご応募をお待ちしております。