Magicode logo
Magicode
7 min read

AWS CodeArtifact に Android のライブラリを公開して依存関係を取得するまでの全記録

https://cdn.apollon.ai/media/notebox/1cb1ae01-4876-401b-a55c-ea40e76a1bad.jpeg

事前準備

  1. [Android Studio] > [File] > [New] > [New Project...] から Android プロジェクトを作成
  2. AWS CLI をインストール。 AWS CodeArtifact のリポジトリに接続するためには AWS CLI をインストールして AWS 認証情報を設定する必要があります
  3. ターミナルで aws configure を実施
$ aws configure
  • AWS CLI のセットアップを行う
    • アクセスキー ID とシークレットアクセスキーは AWS コンソール 内 IAM Management Console の [セキュリティ認証情報] で作成することができます
    • Default region name は CodeArtifact にライブラリ公開用のリポジトリを作成するリージョンにしました
    • Default output format は一旦 json にしておきました
  1. CodeArtifact に Android のライブラリを公開するためのリポジトリを作成
  2. Android Studio の Terminal で以下を実施
$ export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain <ドメイン> --domain-owner <AWS アカウント ID> --query authorizationToken --output text`
$ echo "codeartifactToken=$CODEARTIFACT_AUTH_TOKEN" > ~/.gradle/gradle.properties
※ コマンドは CodeArtifact に作成したリポジトリの [接続手順の表示] からコピーすることができます

Android のライブラリを公開する方法

  1. [Android Studio] > [File] > [New] > [New Module...] で Android Library を作成
  2. ライブラリの build.gradle に maven-publish プラグインと公開セクションを追記
plugins {
    id "com.android.library"
    id "maven-publish"
}

android {
    compileSdk 32

    defaultConfig {
        minSdk 21
        targetSdk 32

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles "consumer-rules.pro"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    testImplementation "junit:junit:4.13.2"
    androidTestImplementation "androidx.test.ext:junit:1.1.3"
}

afterEvaluate {
    publishing {
        publications {
            release(MavenPublication) {
                groupId = "<グループ ID>"
                artifactId = "<アーティファクト ID>"
                version = "<バージョン>"
                from components.release
            }
        }
        repositories {
            maven {
                url "https://<ドメイン>-<AWS アカウント ID>.d.codeartifact.<リージョン>.amazonaws.com/maven/<リポジトリ名>/"
                credentials {
                    username "aws"
                    password System.env.CODEARTIFACT_AUTH_TOKEN
                }
            }
        }
    }
}
// 追記が必要なコードは CodeArtifact に作成したリポジトリの [接続手順の表示] で gradle を選択するとコピーすることができます
  1. Android Studio の Terminal で以下を実施
$ ./gradlew publish

依存関係を取得する方法

  1. Android Studio Chipmunk で新規プロジェクトを作成した場合は settings.gradle ファイルに Maven セクションを追加
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url "https://<ドメイン>-<AWS アカウント ID>.d.codeartifact.<リージョン>.amazonaws.com/maven/<リポジトリ名>/"
            credentials {
                username "aws"
                password "$codeartifactToken"
            }
        }
    }
}
// 追記が必要なコードは CodeArtifact に作成したリポジトリの [接続手順の表示] で gradle を選択するとコピーすることができます
  1. Android アプリの build.gradle に依存関係を取得するコードを追加
plugins {
    id "com.android.application"
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "jp.co.example"
        minSdk 21
        targetSdk 32
        versionCode 1
        versionName "1.0.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation "<グループ ID>:<アーティファクト ID>:<バージョン>"

    implementation "androidx.appcompat:appcompat:1.4.1"
    implementation "com.google.android.material:material:1.6.0"
    implementation "androidx.constraintlayout:constraintlayout:2.1.4"
    testImplementation "junit:junit:4.13.2"
    androidTestImplementation "androidx.test.ext:junit:1.1.3"
    androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
}

関連リンク

その他

Android ライブラリの開発において気をつけている点

開発するライブラリでは OSS のライブラリに依存しないようにする

アプリ側と開発するライブラリ側で同じオープンソースのライブラリに依存している場合、アプリとライブラリ側を比較して OSS ライブラリのバージョンの大きい方が採用されアプリとライブラリ側で統一される。それにより不具合が生じたり使用する OSS ライブラリのバージョンが制限されたり等の問題が起こる可能性がある。故に不特定多数のアプリで使用されることが想定されているライブラリは Kotlin を用いずに Java で開発した方がいいのではないかという説も。

Discussion

コメントにはログインが必要です。