💨

Androidプロジェクトで別private Repositoryのaarを読み込む

に公開

前提

  • GitHub Packagesなどサーバーを立てずに実現する。
  • ライブラリとしてのrepositoryを置いて都度aar化するわけではなく、外部提供のaarを管理するためのprivate repositoryを運用するイメージ。
  • aarは開発用と本番用の2つを管理し、アプリ側からflavor, build typeに応じて読み込む。
  • AndroidプロジェクトではKotlin DSLを利用。

1. aarを置くrepositoryの準備

手順

  1. private repositoryを作成。
    • https://github.com/tarobu/sample-repoとする。
  2. 利用したいaarの準備
    • SampleLib-stub.aar, SampleLib.aarとする。
  3. pomファイルの準備 ※準備していない場合は後述する内容で作成
    • SampleLib.pomとする。
  4. aarをダウンロードする操作が関わるユーザー全員にアクセス権限を付与(Team単位だったり)。
  5. default branch以外にアクセスさせたいならbranchを作成
    • 今回はfeature branchを対象とする
  6. Maven構成にしてaar, pomを配置する。
    • root/任意のpath/groupId/artifactId/version/xxx.aar(xxx-stub.aar, xxx.pomも)
      • 任意のpath: 1つ以上のディレクトリ(階層OK), 今回はmavenとする。
      • groupId: pomに記載の値でcom.tarobu.sampleの場合はcom/tarobu/sampleのpathになる。
      • artifactId: pomに記載の値でtarotaroの場合はそのままtarotaroのpathになる。
      • version: pomに記載の値で1.0.0の場合はそのまま1.0.0
    • ↑の今回の値だと以下の構成になる。
      • root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.aar
      • root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib-stub.aar
      • root/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom
    • ↑URL的にはbranch名も含まれるので以下のような値になるはず。
      • https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.aar
      • https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib-stub.aar
      • https://github.com/tarobu/sample-repo/blob/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom
    • 一応補足: aarやpomの構成は上記のようにMaven構成にする必要があるがREADMEや他の要素は自由で置いてOK。

pomの中身の確認

  • 以下などを参考にしベースを作成する。
  • 例で設定した今回の値だと以下のような値になる。
    // ..
      <groupId>com.tarobu.sample</groupId>
      <artifactId>tarotaro</artifactId>
      <version>1.0.0</version>
      <packaging>aar</packaging>
    // ..
    

2. aarを置いてるrepositoryにアクセスするためのPersonal Access Tokenの準備

3. Androidプロジェクト側の設定

  1. local.propertiesに先ほど作成したPATを記述する。keyは次のステップで指定する値と同じになるように。今回はpat=とすると以下。
pat=gph_xxxxxxx
  1. 構成次第だがrootのbuild.gradle.ktsで以下のようにする。
    // ..
    repositories {
        google()
        mavenCentral()
        // ※↑はあくまで基本的に同じ箇所に記述するでいいことを明示するためであってaarを読み込むために必要というわけではない

        maven {
            url = uri("https://raw.githubusercontent.com/tarobu/sample-repo/feature/maven")
            credentials(HttpHeaderCredentials::class.java) {
                val pat = localproperties.getProperty("pat")
                // TODO 必要だったらnullチェックなど
                this.name = "Authorization"
                this.value = "token $pat"
            }
            // TODO これ要らないかも
            authentication {
                create("header", HttpHeaderCredentials::class.java)
            }
        }
    }
    // ..
  • 以下、解説
    • uri: https://raw.githubusercontent.com/ + organization + repository名 + branch名 + aarを置いたrepository側で設定した任意のpath(今回はmavenとしたけど一致さえすれば何でもOK, 何もなしはダメ)
      • https://raw.githubusercontent.com/というのはrepositoryの要素のURL(例えばpomファイル)をブラウザで開いた時にGitHub右上にrawタブがあるのでそれを押すと同じようなURLになることが確認できるはず。
    • 今回は前のステップでPATをlocal.propertiesに記述する前提だからだが、もちろん他の方法でもOK。参考にCIでのbuildの場合はjobでlocal.propertiesにpat=...で書き込めればOK。

4. 環境ごとにライブラリをimplementationする

今回はstub用と通常のaarをflavorで分けて読み込む前提なので以下のようにする

dependencies {
    // devImplementationなどは環境に応じて使えるか次第で今回は関係ないので説明省略
    devImplementation("com.tarobu.sample:tarotaro:1.0.0:stub@aar")
    prodImplementation("com.tarobu.sample:tarotaro:1.0.0@aar")
}
  • 指定はpom記載の$groupId:$artifactId:$version$classifier@aar
    • classifierはaarの前に付けている区別する値がある場合で、今回だとSampleLib-stub.aarstub部分。

5. Sync Project with Gradle Filesで読み込む

  • Sync..結果で「Failed..」みたいになっている場合はPATの問題があるためターミナルで以下を実行して200返ってくるか確認すると良い。
    curl -L -v -H "Authorization: token PAT" "https://raw.githubusercontent.com/tarobu/sample-repo/feature/maven/com/tarobu/sample/tarotaro/1.0.0/SampleLib.pom"
    
  • 色々aarを置いてるrepository側の構成を変えてSyncし直してエラーは出ないが明らかにaarのコード(importなど)にアクセスできていない場合はgradleのキャッシュ問題で読み込めていない可能性があるのでキャッシュを破棄してみると良い。
    • User/.gradle/cachesを全削除して再実施。

Discussion