Skip to content

Commit

Permalink
Merge pull request #46 from skydoves/plugin/baseline-profile
Browse files Browse the repository at this point in the history
Add baseline profile module
  • Loading branch information
skydoves committed Oct 5, 2023
2 parents eda8b9d + 98e6bd9 commit 34809d9
Show file tree
Hide file tree
Showing 15 changed files with 6,040 additions and 10 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/android.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,4 +62,4 @@ jobs:
- name: Build with Gradle
run: |
./gradlew --scan --stacktrace \
assemble -x :benchmark:pixel6api31Setup -x :benchmark:pixel6api31NonMinifiedReleaseAndroidTest -x :benchmark:collectNonMinifiedReleaseBaselineProfile
assemble -x :baselineprofile:pixel6api31Setup -x :baselineprofile:pixel6api31NonMinifiedReleaseAndroidTest -x :baselineprofile:collectNonMinifiedReleaseBaselineProfile
2 changes: 1 addition & 1 deletion .github/workflows/publish-snapshot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:
run: chmod +x gradlew

- name: Release build
run: ./gradlew assemble --scan -x :benchmark:pixel6api31Setup -x :benchmark:pixel6api31NonMinifiedReleaseAndroidTest -x :benchmark:collectNonMinifiedReleaseBaselineProfile
run: ./gradlew assemble --scan -x :baselineprofile:pixel6api31Setup -x :baselineprofile:pixel6api31NonMinifiedReleaseAndroidTest -x :baselineprofile:collectNonMinifiedReleaseBaselineProfile

- name: Publish to MavenCentral
run: |
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ jobs:
run: chmod +x gradlew

- name: Release build
run: ./gradlew assemble --scan -x :benchmark:pixel6api31Setup -x :benchmark:pixel6api31NonMinifiedReleaseAndroidTest -x :benchmark:collectNonMinifiedReleaseBaselineProfile
run: ./gradlew assemble --scan -x :baselineprofile:pixel6api31Setup -x :baselineprofile:pixel6api31NonMinifiedReleaseAndroidTest -x :baselineprofile:collectNonMinifiedReleaseBaselineProfile

- name: Publish to MavenCentral
run: |
Expand Down
13 changes: 13 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ plugins {
id(libs.plugins.android.application.get().pluginId)
id(libs.plugins.kotlin.android.get().pluginId)
id(libs.plugins.kotlin.parcelize.get().pluginId)
id(libs.plugins.androidx.baselineprofile.get().pluginId)
}

android {
Expand All @@ -47,6 +48,15 @@ android {
jvmTarget = libs.versions.jvmTarget.get()
}

buildTypes {
create("benchmark") {
initWith(buildTypes.getByName("release"))
signingConfig = signingConfigs.getByName("debug")
matchingFallbacks += listOf("release")
isDebuggable = false
}
}

lint {
abortOnError = false
}
Expand All @@ -58,4 +68,7 @@ dependencies {
implementation(libs.androidx.material)
implementation(libs.androidx.constraint)
implementation(libs.glide)
implementation(libs.profileinstaller)

baselineProfile(project(":baselineprofile"))
}
5,775 changes: 5,775 additions & 0 deletions app/src/release/generated/baselineProfiles/baseline-prof.txt

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions baselineprofile/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
59 changes: 59 additions & 0 deletions baselineprofile/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import com.skydoves.tranformationlayout.Configuration
import com.android.build.api.dsl.ManagedVirtualDevice

@Suppress("DSL_SCOPE_VIOLATION") // TODO: Remove once KTIJ-19369 is fixed
plugins {
alias(libs.plugins.android.test)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.androidx.baselineprofile)
}

android {
namespace = "com.skydoves.transformationlayout.benchmark"
compileSdk = Configuration.compileSdk

compileOptions {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
}

kotlinOptions {
jvmTarget = libs.versions.jvmTarget.get()
}

defaultConfig {
minSdk = 24
targetSdk = Configuration.targetSdk
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}

targetProjectPath = ":app"

testOptions.managedDevices.devices {
maybeCreate<ManagedVirtualDevice>("pixel6api31").apply {
device = "Pixel 6"
apiLevel = 31
systemImageSource = "aosp"
}
}
}

// This is the plugin configuration. Everything is optional. Defaults are in the
// comments. In this example, you use the GMD added earlier and disable connected devices.
baselineProfile {

// This specifies the managed devices to use that you run the tests on. The default
// is none.
managedDevices += "pixel6api31"

// This enables using connected devices to generate profiles. The default is true.
// When using connected devices, they must be rooted or API 33 and higher.
useConnectedDevices = false
}

dependencies {
implementation(libs.androidx.test.runner)
implementation(libs.androidx.test.uiautomator)
implementation(libs.androidx.benchmark.macro)
implementation(libs.androidx.profileinstaller)
}
17 changes: 17 additions & 0 deletions baselineprofile/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Designed and developed by 2020 skydoves (Jaewoong Eum)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<manifest />
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/*
* Designed and developed by 2020 skydoves (Jaewoong Eum)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.skydoves.transformationlayout.benchmark

import android.os.Build
import androidx.annotation.RequiresApi
import androidx.benchmark.macro.junit4.BaselineProfileRule
import org.junit.Rule
import org.junit.Test

/**
* This test class generates a basic startup baseline profile for the target package.
*
* We recommend you start with this but add important user flows to the profile to improve their performance.
* Refer to the [baseline profile documentation](https://d.android.com/topic/performance/baselineprofiles)
* for more information.
*
* You can run the generator with the Generate Baseline Profile run configuration,
* or directly with `generateBaselineProfile` Gradle task:
* ```
* ./gradlew :app:generateReleaseBaselineProfile -Pandroid.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile
* ```
* The run configuration runs the Gradle task and applies filtering to run only the generators.
*
* Check [documentation](https://d.android.com/topic/performance/benchmarking/macrobenchmark-instrumentation-args)
* for more information about available instrumentation arguments.
*
* After you run the generator, you can verify the improvements running the [StartupBenchmarks] benchmark.
**/
@RequiresApi(Build.VERSION_CODES.P)
class BaselineProfileGenerator {

@get:Rule
val rule = BaselineProfileRule()

@Test
fun generate() {
rule.collect(
"com.skydoves.transformationlayoutdemo",
stableIterations = 2,
maxIterations = 8,
) {
pressHome()
startActivityAndWait()
}
}
}
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ plugins {
alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.android.test) apply false
alias(libs.plugins.androidx.baselineprofile) apply false
alias(libs.plugins.nexus.plugin)
alias(libs.plugins.spotless)
alias(libs.plugins.dokka)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@
package com.skydoves.tranformationlayout

object Configuration {
const val compileSdk = 33
const val targetSdk = 33
const val compileSdk = 34
const val targetSdk = 34
const val minSdk = 21
const val majorVersion = 1
const val minorVersion = 1
Expand Down
27 changes: 23 additions & 4 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,16 @@ androidxMaterial = "1.9.0"
constraintLayout = "2.1.4"
glide = "4.16.0"
spotless = "6.21.0"
junit = "1.1.5"
espresso-core = "3.5.1"
uiautomator = "2.2.0"
benchmark-macro-junit4 = "1.2.0-rc01"
androidx-baselineprofile = "1.2.0-rc01"
profileinstaller = "1.3.1"
androidxMacroBenchmark = "1.2.0-beta05"
androidxTest = "1.5.2"
baselineProfiles = "1.3.1"
uiAutomator = "2.3.0-alpha04"

[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }
Expand All @@ -20,11 +30,20 @@ dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" }
nexus-plugin = { id = "com.vanniktech.maven.publish", version.ref = "nexusPlugin" }
kotlin-binary-compatibility = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "kotlinBinaryCompatibility" }
spotless = { id = "com.diffplug.spotless", version.ref = "spotless" }
androidx-baselineprofile = { id = "androidx.baselineprofile", version.ref = "androidx-baselineprofile" }

[libraries]
agp = { module = "com.android.tools.build:gradle", version.ref = "agp" }
kotlin-gradlePlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }

androidx-material = { module = "com.google.android.material:material", version.ref = "androidxMaterial" }
androidx-constraint = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintLayout" }
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" }
junit = { group = "androidx.test.ext", name = "junit", version.ref = "junit" }
espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espresso-core" }
uiautomator = { group = "androidx.test.uiautomator", name = "uiautomator", version.ref = "uiautomator" }
benchmark-macro-junit4 = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "benchmark-macro-junit4" }
profileinstaller = { group = "androidx.profileinstaller", name = "profileinstaller", version.ref = "profileinstaller" }

# unit test
androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidxTest" }
androidx-profileinstaller = { module = "androidx.profileinstaller:profileinstaller", version.ref = "baselineProfiles" }
androidx-benchmark-macro = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "androidxMacroBenchmark" }
androidx-test-uiautomator = { module = "androidx.test.uiautomator:uiautomator", version.ref = "uiAutomator" }
3 changes: 3 additions & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
@file:Suppress("UnstableApiUsage")

include(":baselineprofile")


// Designed and developed by 2020 skydoves (Jaewoong Eum)
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down
11 changes: 10 additions & 1 deletion transformationlayout/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ plugins {
id(libs.plugins.kotlin.android.get().pluginId)
id(libs.plugins.kotlin.parcelize.get().pluginId)
id(libs.plugins.nexus.plugin.get().pluginId)
id(libs.plugins.androidx.baselineprofile.get().pluginId)
}

apply(from = "${rootDir}/scripts/publish-module.gradle.kts")
Expand All @@ -45,7 +46,6 @@ android {
compileSdk = Configuration.compileSdk
defaultConfig {
minSdk = Configuration.minSdk
targetSdk = Configuration.targetSdk
}

resourcePrefix = "transformation"
Expand All @@ -68,6 +68,13 @@ android {
}
}

baselineProfile {
filter {
include("com.skydoves.transformationlayout.**")
exclude("com.skydoves.transformationlayoutdemo.**")
}
}

tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.freeCompilerArgs += listOf(
"-Xexplicit-api=strict"
Expand All @@ -76,4 +83,6 @@ tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {

dependencies {
implementation(libs.androidx.material)

baselineProfile(project(":baselineprofile"))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
Lcom/skydoves/transformationlayout/DefaultParamValues;
HSPLcom/skydoves/transformationlayout/DefaultParamValues;-><clinit>()V
HSPLcom/skydoves/transformationlayout/DefaultParamValues;-><init>()V
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getAllContainerColors()I
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getContainerColor()I
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getDirection()Lcom/skydoves/transformationlayout/TransformationLayout$Direction;
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getDuration()J
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getElevationShadowEnabled()Z
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getEndElevation()F
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getFadeMode()Lcom/skydoves/transformationlayout/TransformationLayout$FadeMode;
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getFitMode()Lcom/skydoves/transformationlayout/TransformationLayout$FitMode;
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getHoldAtEndEnabled()Z
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getPathMotion()Lcom/skydoves/transformationlayout/TransformationLayout$Motion;
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getScrimColor()I
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getStartElevation()F
HSPLcom/skydoves/transformationlayout/DefaultParamValues;->getZOrder()I
Lcom/skydoves/transformationlayout/R$styleable;
HSPLcom/skydoves/transformationlayout/R$styleable;-><clinit>()V
Lcom/skydoves/transformationlayout/TransformationLayout;
HSPLcom/skydoves/transformationlayout/TransformationLayout;->$r8$lambda$uZMR26-6RFv7NfHBY2vd015EkBk(Lcom/skydoves/transformationlayout/TransformationLayout;I)V
HPLcom/skydoves/transformationlayout/TransformationLayout;-><init>(Landroid/content/Context;Landroid/util/AttributeSet;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->bindTargetView(Landroid/view/View;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getAllContainerColors()I
HPLcom/skydoves/transformationlayout/TransformationLayout;->getAttrs(Landroid/util/AttributeSet;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getContainerColor()I
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getDuration()J
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getElevationShadowEnabled()Z
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getEndElevation()F
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getHoldAtEndEnabled()Z
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getScrimColor()I
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getStartElevation()F
HSPLcom/skydoves/transformationlayout/TransformationLayout;->getZOrder()I
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setAllContainerColors(I)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setContainerColor(I)V
HPLcom/skydoves/transformationlayout/TransformationLayout;->setDirection(Lcom/skydoves/transformationlayout/TransformationLayout$Direction;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setDuration(J)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setElevationShadowEnabled(Z)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setEndElevation(F)V
HPLcom/skydoves/transformationlayout/TransformationLayout;->setFadeMode(Lcom/skydoves/transformationlayout/TransformationLayout$FadeMode;)V
HPLcom/skydoves/transformationlayout/TransformationLayout;->setFitMode(Lcom/skydoves/transformationlayout/TransformationLayout$FitMode;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setHoldAtEndEnabled(Z)V
HPLcom/skydoves/transformationlayout/TransformationLayout;->setPathMotion(Lcom/skydoves/transformationlayout/TransformationLayout$Motion;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setScrimColor(I)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setStartElevation(F)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setTypeArray$lambda$1$lambda$0(Lcom/skydoves/transformationlayout/TransformationLayout;I)V
HPLcom/skydoves/transformationlayout/TransformationLayout;->setTypeArray(Landroid/content/res/TypedArray;)V
HSPLcom/skydoves/transformationlayout/TransformationLayout;->setZOrder(I)V
Lcom/skydoves/transformationlayout/TransformationLayout$$ExternalSyntheticLambda4;
HSPLcom/skydoves/transformationlayout/TransformationLayout$$ExternalSyntheticLambda4;-><init>(Lcom/skydoves/transformationlayout/TransformationLayout;I)V
HSPLcom/skydoves/transformationlayout/TransformationLayout$$ExternalSyntheticLambda4;->run()V
Lcom/skydoves/transformationlayout/TransformationLayout$Direction;
HSPLcom/skydoves/transformationlayout/TransformationLayout$Direction;->$values()[Lcom/skydoves/transformationlayout/TransformationLayout$Direction;
HSPLcom/skydoves/transformationlayout/TransformationLayout$Direction;-><clinit>()V
HSPLcom/skydoves/transformationlayout/TransformationLayout$Direction;-><init>(Ljava/lang/String;II)V
Lcom/skydoves/transformationlayout/TransformationLayout$FadeMode;
HSPLcom/skydoves/transformationlayout/TransformationLayout$FadeMode;->$values()[Lcom/skydoves/transformationlayout/TransformationLayout$FadeMode;
HSPLcom/skydoves/transformationlayout/TransformationLayout$FadeMode;-><clinit>()V
HSPLcom/skydoves/transformationlayout/TransformationLayout$FadeMode;-><init>(Ljava/lang/String;II)V
Lcom/skydoves/transformationlayout/TransformationLayout$FitMode;
HSPLcom/skydoves/transformationlayout/TransformationLayout$FitMode;->$values()[Lcom/skydoves/transformationlayout/TransformationLayout$FitMode;
HSPLcom/skydoves/transformationlayout/TransformationLayout$FitMode;-><clinit>()V
HSPLcom/skydoves/transformationlayout/TransformationLayout$FitMode;-><init>(Ljava/lang/String;II)V
Lcom/skydoves/transformationlayout/TransformationLayout$Motion;
HSPLcom/skydoves/transformationlayout/TransformationLayout$Motion;->$values()[Lcom/skydoves/transformationlayout/TransformationLayout$Motion;
HSPLcom/skydoves/transformationlayout/TransformationLayout$Motion;-><clinit>()V
HSPLcom/skydoves/transformationlayout/TransformationLayout$Motion;-><init>(Ljava/lang/String;II)V
Lcom/skydoves/transformationlayout/TransformationParams;
Lcom/skydoves/transformationlayout/TransitionExtensionKt;
HSPLcom/skydoves/transformationlayout/TransitionExtensionKt;->onTransformationStartContainer(Landroid/app/Activity;)V
Lcom/skydoves/transformationlayout/ViewExtensionKt;
HSPLcom/skydoves/transformationlayout/ViewExtensionKt;->visible(Landroid/view/View;Z)V

0 comments on commit 34809d9

Please sign in to comment.