©️
【Android】OSS Licenses Gradle Plugin でライセンス一覧を表示する
前提
Version Catalogs を使用
1. OSS Licenses Gradle Plugin の導入
プロジェクト直下のbuild.gradleに、以下を追加します。
gradle/libs.versions.toml
[versions]
ossLicensesPlugin = "0.10.6"
playServicesOssLicenses = "17.1.0"
[libraries]
oss-licenses-plugin = { module = "com.google.android.gms:oss-licenses-plugin", version.ref = "ossLicensesPlugin" }
play-services-oss-licenses = { module = "com.google.android.gms:play-services-oss-licenses", version.ref = "playServicesOssLicenses" }
build.gradle
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath libs.oss.licenses.plugin
}
}
com.google.android.gms.oss-licenses-pluginを、サブプロジェクトのbuild.gradleに追加します。
README.md に記載されているように、com.android.applicationの下に追加します。
app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'com.google.android.gms.oss-licenses-plugin'
dependencies {
implementation(libs.play.services.oss.licenses)
}
app/build.gradle(plugins block を使う方法)
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'com.google.android.gms.oss-licenses-plugin'
}
dependencies {
implementation(libs.play.services.oss.licenses)
}
2. ライセンス情報ファイルの生成
ビルドして、third_party_licensesとthird_party_licenses_metadataファイルを作成します(この2ファイルの出力先はapp/build/generated/third_party_licenses/以下)。
# デバッグビルドだとライセンス情報が出力されないので、リリースビルド
./gradlew clean assembleRelease
3. ライセンス一覧画面の表示
IntentにOssLicensesMenuActivity(OssLicensesActivityではなく)を渡して、画面遷移します。
Activity にて
val intent = Intent(activity, OssLicensesMenuActivity::class.java)
startActivity(intent)
その他
OssLicensesMenuActivityのテーマやタイトルを変更する
<application ...>
<activity
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"
android:label="@string/oss_license_title"
android:theme="@style/Theme.AppCompat.DayNight" />
</application>
マルチモジュールのとき
ライセンス画面への遷移を設定画面(feature:settings)のようなモジュールから行う場合。
feature:settingsモジュールはcom.android.libraryで、com.google.android.gms.oss-licenses-pluginを適用できなかったため、Hilt で DI して、appモジュールで遷移処理を実装しました(他に方法があれば教えてください!)。
feature:settingsモジュール
SettingsNavigation.kt
interface SettingsNavigation {
fun navigateLicenses(activity: Activity)
}
SettingsActivity.kt
class SettingsActivity : AppCompatActivity() {
@Inject
lateinit var navigation: SettingsNavigation
fun onLicenseClicked() {
navigation.navigateLicenses(this)
}
}
app モジュール
ActivityNavigator.kt
object ActivityNavigator : SettingsNavigation {
override fun navigateLicenses(activity: Activity) {
val intent = Intent(activity, OssLicensesMenuActivity::class.java)
activity.startActivity(intent)
}
}
AppModule.kt
@Module
@InstallIn(SingletonComponent::class)
object AppModule {
@Provides
fun provideSettingsNavigation(): SettingsNavigation = ActivityNavigator
}
Discussion