Skip to content

Commit

Permalink
Added support for Android dynamic feature plugins
Browse files Browse the repository at this point in the history
Resolves #441

Co-authored-by: gabrielprado-mb <57372429+gabrielprado-mb@users.noreply.github.com>

PR #445
  • Loading branch information
shanshin committed Sep 22, 2023
1 parent 0c80c9e commit ac35dc2
Show file tree
Hide file tree
Showing 21 changed files with 366 additions and 0 deletions.
45 changes: 45 additions & 0 deletions kover-gradle-plugin/examples/android/dynamic/app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
plugins {
id ("com.android.application")
id ("org.jetbrains.kotlin.android")
id ("org.jetbrains.kotlinx.kover")
}

android {
namespace = "kotlinx.kover.test.android"
compileSdk = 32

defaultConfig {
applicationId = "kotlinx.kover.test.android"
minSdk = 21
targetSdk = 31
versionCode = 1
versionName = "1.0"

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
isMinifyEnabled = true
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
buildFeatures {
viewBinding = true
}
dynamicFeatures += ":dyn"
}

dependencies {
implementation("androidx.core:core-ktx:1.8.0")
implementation("androidx.appcompat:appcompat:1.5.0")
implementation("com.google.android.material:material:1.6.1")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
testImplementation("junit:junit:4.13.2")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application android:label="@string/app_name">
<uses-library android:name="com.google.android.things" android:required="false" />

<activity android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Make this the first activity that is displayed when the device boots. -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
</application>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kotlinx.kover.test.android

object DebugUtil {
fun log(message: String) {
println("DEBUG: $message")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kotlinx.kover.test.android

import android.os.Bundle
import android.app.Activity

class MainActivity : Activity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kotlinx.kover.test.android

object Maths {
fun sum(a: Int, b: Int): Int {
DebugUtil.log("invoked sum")
return a + b
}

fun sub(a: Int, b: Int): Int {
DebugUtil.log("invoked sub")
return a - b
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
android:id="@+id/main_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="104dp"
android:layout_marginTop="28dp"
android:text="SERIALIZATION TEST"
android:textSize="20sp"
android:textStyle="bold"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<EditText
android:id="@+id/encoded_text"
android:layout_width="373dp"
android:layout_height="411dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:editable="false"
android:ems="10"
android:gravity="start|top"
android:inputType="textMultiLine"
android:textAlignment="viewStart"
android:textSize="12sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/main_label" />

</androidx.constraintlayout.widget.ConstraintLayout>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<resources>
<string name="app_name">Android Test</string>
</resources>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<resources>

<style name="Theme.App" parent="android:Theme.Material.Light.DarkActionBar" />
</resources>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package kotlinx.kover.test.android

import org.junit.Test

import org.junit.Assert.*


class LocalTests {
@Test
fun testDebugUtils() {
assertEquals(3, Maths.sum(1, 2))
}
}
7 changes: 7 additions & 0 deletions kover-gradle-plugin/examples/android/dynamic/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
plugins {
id("com.android.application") version "7.4.0" apply false
id("com.android.library") version "7.4.0" apply false
id ("com.android.dynamic-feature") version "7.4.0" apply false
id("org.jetbrains.kotlin.android") version "1.8.20" apply false
id("org.jetbrains.kotlinx.kover") version "0.7.3" apply false
}
78 changes: 78 additions & 0 deletions kover-gradle-plugin/examples/android/dynamic/dyn/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
plugins {
id ("com.android.dynamic-feature")
id ("org.jetbrains.kotlin.android")
id ("org.jetbrains.kotlinx.kover")
}

android {
namespace = "kotlinx.kover.test.android"

compileSdk = 32

defaultConfig {
minSdk = 21

testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

compileOptions {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
}

dependencies {
implementation("androidx.core:core-ktx:1.8.0")
implementation("androidx.appcompat:appcompat:1.5.0")
testImplementation("junit:junit:4.13.2")
implementation(project(":app"))
}


/*
* Kover configs
*/

dependencies {
kover(project(":app"))
}


koverReport {
// filters for all report types of all build variants
filters {
excludes {
classes(
"*Fragment",
"*Fragment\$*",
"*Activity",
"*Activity\$*",
"*.databinding.*",
"*.BuildConfig"
)
}
}

androidReports("release") {
// filters for all report types only of 'release' build type
filters {
excludes {
classes(
"*Fragment",
"*Fragment\$*",
"*Activity",
"*Activity\$*",
"*.databinding.*",
"*.BuildConfig",

// excludes debug classes
"*.DebugUtil"
)
}
}
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:dist="http://schemas.android.com/apk/distribution">

<application
android:allowBackup="true"
android:supportsRtl="true"
tools:targetApi="31">
</application>

<dist:module
dist:instant="false"
dist:title="Dynamic title">
<dist:delivery>
<dist:install-time />
</dist:delivery>
<dist:fusing dist:include="false" />
</dist:module>

</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package kotlinx.kover.test.android.dyn

object DebugUtil {
fun log(message: String) {
println("LIB DEBUG: $message")
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package kotlinx.kover.test.android.dyn

object MagicFactory {
fun generate(): Int {
DebugUtil.log("generate Int")
return 42
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package kotlinx.kover.test.android

import kotlinx.kover.test.android.dyn.MagicFactory
import org.junit.Test

import org.junit.Assert.*


class LocalLibTests {
@Test
fun testDebugUtils() {
assertEquals(42, MagicFactory.generate())
}
}
23 changes: 23 additions & 0 deletions kover-gradle-plugin/examples/android/dynamic/gradle.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Kotlin code style for this project: "official" or "obsolete":
kotlin.code.style=official
# Enables namespacing of each library's R class so that its R class includes only the
# resources declared in the library itself and none from the library's dependencies,
# thereby reducing the size of the R class for that library
android.nonTransitiveRClass=true
19 changes: 19 additions & 0 deletions kover-gradle-plugin/examples/android/dynamic/settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
}

rootProject.name = "android_dynamic"
include(":app", ":dyn")
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package kotlinx.kover.gradle.plugin.test.functional.cases

import kotlinx.kover.gradle.plugin.test.functional.framework.checker.CheckerContext
import kotlinx.kover.gradle.plugin.test.functional.framework.starter.ExamplesTest

internal class DynamicFeatureTests {
@ExamplesTest("android/dynamic", commands = [":dyn:koverXmlReportRelease"])
fun CheckerContext.test() {
subproject("dyn") {
xmlReport("release") {
classCounter("kotlinx.kover.test.android.DebugUtil").assertAbsent()
methodCounter("kotlinx.kover.test.android.Maths", "sum").assertCovered()
methodCounter("kotlinx.kover.test.android.dyn.MagicFactory", "generate").assertCovered()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,4 @@ internal const val ANDROID_APP_PLUGIN_ID = "com.android.application"

internal const val ANDROID_LIB_PLUGIN_ID = "com.android.library"

internal const val ANDROID_DYNAMIC_PLUGIN_ID = "com.android.dynamic-feature"
Loading

0 comments on commit ac35dc2

Please sign in to comment.