{"owner":"didi","repo":"booster","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["CLAUDE.md"],"skills":{"CLAUDE.md":"# Booster Project Guide\n\n## Project Overview\n\nBooster is an open-source Android application quality optimization framework from DiDi, implementing extensible bytecode transformation and task processing through Gradle plugins + SPI mechanism.\n\n**Core Features**: Performance detection, system bug fixes, multi-threading optimization, app size reduction (resource deduplication, R class inlining, etc.)\n\n**Results**: 15%~25% stability improvement, 1MB~10MB package size reduction\n\n## Tech Stack\n\n- **Language**: Kotlin (primary) + Java\n- **Build**: Gradle 8.5 + Kotlin DSL\n- **Bytecode**: ASM + Javassist 3.30.2-GA\n- **Compatibility**: AGP 8.0 ~ 9.0 (v8_0, v8_1, v8_2, v8_3, v8_4, v8_5, v8_6, v8_7, v8_8, v8_9, v8_10, v8_12, v9_0)\n- **Publishing**: Maven Central (com.didiglobal.booster)\n\n## Module Architecture\n\n### Core Framework\n- `booster-gradle-plugin` - Gradle plugin entry point\n- `booster-api` - Core API and utilities\n- `booster-annotations` - Annotation definitions\n\n### SPI Layer (Extension Interfaces)\n- `booster-transform-spi` - Bytecode transformation interfaces (`Transformer`, `TransformContext`, `KlassPool`)\n- `booster-task-spi` - Task processor interface (`VariantProcessor`)\n\n### Bytecode Transformation Tools\n- `booster-transform-asm` - ASM implementation\n- `booster-transform-javassist` - Javassist implementation\n- `booster-transform-util` - Utility library\n\n### AGP Compatibility Layer\n- `booster-android-gradle-api` - API abstraction\n- `booster-android-gradle-compat` - Compatibility support\n- `booster-android-gradle-v8_*` - AGP version adapters (v8_0 ~ v8_12)\n- `booster-android-gradle-v9_0` - AGP 9.0 adapter\n\n### Transform Implementations\n- `booster-transform-thread` - Multi-threading optimization\n- `booster-transform-toast` - Toast crash fix\n- `booster-transform-r-inline` - R class constant inlining\n- `booster-transform-res-check` - Resource checking\n- `booster-transform-activity-thread` - ActivityThread optimization\n- `booster-transform-finalizer-watchdog-daemon` - Finalizer optimization\n- `booster-transform-logcat` - Logcat optimization\n- `booster-transform-media-player` - MediaPlayer optimization\n\n### Runtime Instrumentation\n- `booster-android-instrument-*` - Runtime hook implementations for each feature\n\n### Auxiliary Tools\n- `booster-cha` / `booster-cha-asm` - Class Hierarchy Analysis\n- `booster-graph-*` - Task graph visualization\n- `booster-task-list-*` - Task list tools\n- `booster-aapt2` - AAPT2 integration\n\n## Key Entry Files\n\n| File | Path | Purpose |\n|------|------|---------|\n| `BoosterPlugin.kt` | `booster-gradle-plugin/.../gradle/` | Plugin main class, implements `Plugin<Project>` |\n| `BoosterTransformTask.kt` | same | Bytecode transformation task |\n| `Transformer.kt` | `booster-transform-spi/.../transform/` | Transformer interface definition |\n| `TransformContext.kt` | same | Transform context |\n| `VariantProcessor.kt` | `booster-task-spi/.../task/spi/` | Variant processor interface |\n| `AsmTransformer.kt` | `booster-transform-asm/.../asm/` | ASM transformer implementation |\n| `ClassTransformer.kt` | same | Class transformer abstract class |\n\n## Common Commands\n\n```bash\n# Build project\n./gradlew build\n\n# Publish to local Maven\n./gradlew publishToMavenLocal\n\n# Run tests\n./gradlew test\n\n# Run integration tests\n./gradlew integrationTest\n\n# Compile integration tests (verify compatibility)\n./gradlew compileIntegrationTestKotlin\n\n# View all tasks\n./gradlew tasks\n```\n\n## AGP Version Compatibility Development\n\n### Kotlin 2.0 Metadata Compatibility\n\nAGP 8.9+ is compiled with Kotlin 2.0, producing Kotlin metadata incompatible with Kotlin 1.x. Solution:\n\n1. **Gradle Version**: Use Gradle 8.5+ (includes Kotlin 1.9.20 which better handles Kotlin 2.0 metadata)\n2. **Compiler Args**: Add to v8_9+ module's `build.gradle`:\n   ```groovy\n   tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {\n       kotlinOptions {\n           freeCompilerArgs += ['-Xskip-metadata-version-check']\n       }\n   }\n   ```\n\n### AGP Version to Gradle Version Mapping\n\n| AGP Version | Minimum Gradle Version |\n|-------------|------------------------|\n| 8.0 - 8.8   | 8.0+                   |\n| 8.9 - 8.11  | 8.11.1+                |\n| 8.12        | 8.13+                  |\n| 9.0         | 9.1+                   |\n\n### Adding New AGP Version Support\n\n1. Create module `booster-android-gradle-v{major}_{minor}`\n2. Copy existing module structure (e.g., v8_2)\n3. Update AGP dependency version and SDK tools version\n4. Implement `AGPInterface`, handling API changes\n5. Create `src/integrationTest/` directory with:\n   - `kotlin/.../V{major}{minor}IntegrationTest.kt` - Test class\n   - `resources/` - Test resources (app.gradle, lib.gradle, buildSrc/, src/)\n6. Create `src/e2eTest/` directory with standalone Android test project\n7. Update `GradleExecutor` version in integration test to match AGP requirements\n\n### Integration Test Structure\n\nEach AGP adapter module contains:\n- `src/integrationTest/` - Gradle TestKit integration tests\n- `src/e2eTest/` - Standalone Android project for end-to-end testing\n\n### Running Integration Tests\n\nIntegration tests require:\n1. Booster artifacts published to local Maven\n2. Android SDK with accepted licenses\n3. ANDROID_HOME environment variable set (or SDK at ~/Library/Android/sdk on macOS)\n\n```bash\n# First, publish to local Maven\n./gradlew publishToMavenLocal\n\n# Accept Android SDK licenses (one-time)\nsdkmanager --licenses\n\n# Then run integration tests\n./gradlew integrationTest\n```\n\n### Known Integration Test Issues\n\n#### 1. Dependency Resolution Conflict\n\n**Problem**: `io.bootstage.testkit:testkit-gradle-plugin:2.1.0` transitively depends on old booster versions from Maven Central (e.g., `booster-kotlinx:2.4.0`). This causes `NoSuchMethodError` at runtime because older versions lack methods like `capitalized()`.\n\n**Solution**: In test project's `buildSrc/build.gradle`, exclude transitive booster dependencies:\n```groovy\nimplementation(\"io.bootstage.testkit:testkit-gradle-plugin:2.1.0\") {\n    exclude group: 'com.didiglobal.booster'\n}\n```\n\n#### 2. Android SDK Detection\n\n**Problem**: If `sdkmanager` is in PATH (e.g., from Homebrew), the `AndroidSdk.location` detection may pick up the wrong SDK path.\n\n**Solution**: The `integration-test.gradle` sets `ANDROID_HOME` environment variable:\n```groovy\ndef androidHome = System.getenv('ANDROID_HOME') ?: \"${System.getProperty('user.home')}/Library/Android/sdk\"\nenvironment 'ANDROID_HOME', androidHome\n```\n\n### Running e2eTest Projects\n\nEach e2eTest is a standalone Android project that tests the booster plugin end-to-end.\n\n**Setup Requirements:**\n1. Publish booster to local Maven: `./gradlew publishToMavenLocal`\n2. Create `local.properties` with Android SDK path in the e2eTest directory:\n   ```properties\n   sdk.dir=/path/to/Android/sdk\n   ```\n\n**Running e2eTest:**\n```bash\ncd booster-android-gradle-v8_9/src/e2eTest\n./gradlew assembleDebug\n```\n\n**Configuration:**\n- `build.gradle.kts` - Root build file referencing booster plugin with version `1.0.0-SNAPSHOT`\n- `settings.gradle.kts` - Uses `mavenLocal()` in pluginManagement to resolve local booster\n- `app/build.gradle.kts` - Applies the booster plugin\n\n**Note**: `local.properties` is gitignored and must be created locally on each machine.\n\n## Extending Booster\n\n### Implementing Custom Transformer\n\n1. Create module, depend on `booster-transform-spi` and `booster-transform-asm`\n2. Extend `ClassTransformer` to implement transformation logic\n3. Register via SPI in `META-INF/services/`\n\n### Implementing Custom VariantProcessor\n\n1. Create module, depend on `booster-task-spi`\n2. Implement `VariantProcessor` interface\n3. Register via SPI in `META-INF/services/`\n\n## Code Standards\n\n- Package prefix: `com.didiglobal.booster`\n- Write new code in Kotlin\n- Follow Kotlin official coding conventions\n"},"files":{"CLAUDE.md":"# Booster Project Guide\n\n## Project Overview\n\nBooster is an open-source Android application quality optimization framework from DiDi, implementing extensible bytecode transformation and task processing through Gradle plugins + SPI mechanism.\n\n**Core Features**: Performance detection, system bug fixes, multi-threading optimization, app size reduction (resource deduplication, R class inlining, etc.)\n\n**Results**: 15%~25% stability improvement, 1MB~10MB package size reduction\n\n## Tech Stack\n\n- **Language**: Kotlin (primary) + Java\n- **Build**: Gradle 8.5 + Kotlin DSL\n- **Bytecode**: ASM + Javassist 3.30.2-GA\n- **Compatibility**: AGP 8.0 ~ 9.0 (v8_0, v8_1, v8_2, v8_3, v8_4, v8_5, v8_6, v8_7, v8_8, v8_9, v8_10, v8_12, v9_0)\n- **Publishing**: Maven Central (com.didiglobal.booster)\n\n## Module Architecture\n\n### Core Framework\n- `booster-gradle-plugin` - Gradle plugin entry point\n- `booster-api` - Core API and utilities\n- `booster-annotations` - Annotation definitions\n\n### SPI Layer (Extension Interfaces)\n- `booster-transform-spi` - Bytecode transformation interfaces (`Transformer`, `TransformContext`, `KlassPool`)\n- `booster-task-spi` - Task processor interface (`VariantProcessor`)\n\n### Bytecode Transformation Tools\n- `booster-transform-asm` - ASM implementation\n- `booster-transform-javassist` - Javassist implementation\n- `booster-transform-util` - Utility library\n\n### AGP Compatibility Layer\n- `booster-android-gradle-api` - API abstraction\n- `booster-android-gradle-compat` - Compatibility support\n- `booster-android-gradle-v8_*` - AGP version adapters (v8_0 ~ v8_12)\n- `booster-android-gradle-v9_0` - AGP 9.0 adapter\n\n### Transform Implementations\n- `booster-transform-thread` - Multi-threading optimization\n- `booster-transform-toast` - Toast crash fix\n- `booster-transform-r-inline` - R class constant inlining\n- `booster-transform-res-check` - Resource checking\n- `booster-transform-activity-thread` - ActivityThread optimization\n- `booster-transform-finalizer-watchdog-daemon` - Finalizer optimization\n- `booster-transform-logcat` - Logcat optimization\n- `booster-transform-media-player` - MediaPlayer optimization\n\n### Runtime Instrumentation\n- `booster-android-instrument-*` - Runtime hook implementations for each feature\n\n### Auxiliary Tools\n- `booster-cha` / `booster-cha-asm` - Class Hierarchy Analysis\n- `booster-graph-*` - Task graph visualization\n- `booster-task-list-*` - Task list tools\n- `booster-aapt2` - AAPT2 integration\n\n## Key Entry Files\n\n| File | Path | Purpose |\n|------|------|---------|\n| `BoosterPlugin.kt` | `booster-gradle-plugin/.../gradle/` | Plugin main class, implements `Plugin<Project>` |\n| `BoosterTransformTask.kt` | same | Bytecode transformation task |\n| `Transformer.kt` | `booster-transform-spi/.../transform/` | Transformer interface definition |\n| `TransformContext.kt` | same | Transform context |\n| `VariantProcessor.kt` | `booster-task-spi/.../task/spi/` | Variant processor interface |\n| `AsmTransformer.kt` | `booster-transform-asm/.../asm/` | ASM transformer implementation |\n| `ClassTransformer.kt` | same | Class transformer abstract class |\n\n## Common Commands\n\n```bash\n# Build project\n./gradlew build\n\n# Publish to local Maven\n./gradlew publishToMavenLocal\n\n# Run tests\n./gradlew test\n\n# Run integration tests\n./gradlew integrationTest\n\n# Compile integration tests (verify compatibility)\n./gradlew compileIntegrationTestKotlin\n\n# View all tasks\n./gradlew tasks\n```\n\n## AGP Version Compatibility Development\n\n### Kotlin 2.0 Metadata Compatibility\n\nAGP 8.9+ is compiled with Kotlin 2.0, producing Kotlin metadata incompatible with Kotlin 1.x. Solution:\n\n1. **Gradle Version**: Use Gradle 8.5+ (includes Kotlin 1.9.20 which better handles Kotlin 2.0 metadata)\n2. **Compiler Args**: Add to v8_9+ module's `build.gradle`:\n   ```groovy\n   tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {\n       kotlinOptions {\n           freeCompilerArgs += ['-Xskip-metadata-version-check']\n       }\n   }\n   ```\n\n### AGP Version to Gradle Version Mapping\n\n| AGP Version | Minimum Gradle Version |\n|-------------|------------------------|\n| 8.0 - 8.8   | 8.0+                   |\n| 8.9 - 8.11  | 8.11.1+                |\n| 8.12        | 8.13+                  |\n| 9.0         | 9.1+                   |\n\n### Adding New AGP Version Support\n\n1. Create module `booster-android-gradle-v{major}_{minor}`\n2. Copy existing module structure (e.g., v8_2)\n3. Update AGP dependency version and SDK tools version\n4. Implement `AGPInterface`, handling API changes\n5. Create `src/integrationTest/` directory with:\n   - `kotlin/.../V{major}{minor}IntegrationTest.kt` - Test class\n   - `resources/` - Test resources (app.gradle, lib.gradle, buildSrc/, src/)\n6. Create `src/e2eTest/` directory with standalone Android test project\n7. Update `GradleExecutor` version in integration test to match AGP requirements\n\n### Integration Test Structure\n\nEach AGP adapter module contains:\n- `src/integrationTest/` - Gradle TestKit integration tests\n- `src/e2eTest/` - Standalone Android project for end-to-end testing\n\n### Running Integration Tests\n\nIntegration tests require:\n1. Booster artifacts published to local Maven\n2. Android SDK with accepted licenses\n3. ANDROID_HOME environment variable set (or SDK at ~/Library/Android/sdk on macOS)\n\n```bash\n# First, publish to local Maven\n./gradlew publishToMavenLocal\n\n# Accept Android SDK licenses (one-time)\nsdkmanager --licenses\n\n# Then run integration tests\n./gradlew integrationTest\n```\n\n### Known Integration Test Issues\n\n#### 1. Dependency Resolution Conflict\n\n**Problem**: `io.bootstage.testkit:testkit-gradle-plugin:2.1.0` transitively depends on old booster versions from Maven Central (e.g., `booster-kotlinx:2.4.0`). This causes `NoSuchMethodError` at runtime because older versions lack methods like `capitalized()`.\n\n**Solution**: In test project's `buildSrc/build.gradle`, exclude transitive booster dependencies:\n```groovy\nimplementation(\"io.bootstage.testkit:testkit-gradle-plugin:2.1.0\") {\n    exclude group: 'com.didiglobal.booster'\n}\n```\n\n#### 2. Android SDK Detection\n\n**Problem**: If `sdkmanager` is in PATH (e.g., from Homebrew), the `AndroidSdk.location` detection may pick up the wrong SDK path.\n\n**Solution**: The `integration-test.gradle` sets `ANDROID_HOME` environment variable:\n```groovy\ndef androidHome = System.getenv('ANDROID_HOME') ?: \"${System.getProperty('user.home')}/Library/Android/sdk\"\nenvironment 'ANDROID_HOME', androidHome\n```\n\n### Running e2eTest Projects\n\nEach e2eTest is a standalone Android project that tests the booster plugin end-to-end.\n\n**Setup Requirements:**\n1. Publish booster to local Maven: `./gradlew publishToMavenLocal`\n2. Create `local.properties` with Android SDK path in the e2eTest directory:\n   ```properties\n   sdk.dir=/path/to/Android/sdk\n   ```\n\n**Running e2eTest:**\n```bash\ncd booster-android-gradle-v8_9/src/e2eTest\n./gradlew assembleDebug\n```\n\n**Configuration:**\n- `build.gradle.kts` - Root build file referencing booster plugin with version `1.0.0-SNAPSHOT`\n- `settings.gradle.kts` - Uses `mavenLocal()` in pluginManagement to resolve local booster\n- `app/build.gradle.kts` - Applies the booster plugin\n\n**Note**: `local.properties` is gitignored and must be created locally on each machine.\n\n## Extending Booster\n\n### Implementing Custom Transformer\n\n1. Create module, depend on `booster-transform-spi` and `booster-transform-asm`\n2. Extend `ClassTransformer` to implement transformation logic\n3. Register via SPI in `META-INF/services/`\n\n### Implementing Custom VariantProcessor\n\n1. Create module, depend on `booster-task-spi`\n2. Implement `VariantProcessor` interface\n3. Register via SPI in `META-INF/services/`\n\n## Code Standards\n\n- Package prefix: `com.didiglobal.booster`\n- Write new code in Kotlin\n- Follow Kotlin official coding conventions\n"},"items":[{"name":"CLAUDE.md","path":"CLAUDE.md","title":"CLAUDE.md","content":"# Booster Project Guide\n\n## Project Overview\n\nBooster is an open-source Android application quality optimization framework from DiDi, implementing extensible bytecode transformation and task processing through Gradle plugins + SPI mechanism.\n\n**Core Features**: Performance detection, system bug fixes, multi-threading optimization, app size reduction (resource deduplication, R class inlining, etc.)\n\n**Results**: 15%~25% stability improvement, 1MB~10MB package size reduction\n\n## Tech Stack\n\n- **Language**: Kotlin (primary) + Java\n- **Build**: Gradle 8.5 + Kotlin DSL\n- **Bytecode**: ASM + Javassist 3.30.2-GA\n- **Compatibility**: AGP 8.0 ~ 9.0 (v8_0, v8_1, v8_2, v8_3, v8_4, v8_5, v8_6, v8_7, v8_8, v8_9, v8_10, v8_12, v9_0)\n- **Publishing**: Maven Central (com.didiglobal.booster)\n\n## Module Architecture\n\n### Core Framework\n- `booster-gradle-plugin` - Gradle plugin entry point\n- `booster-api` - Core API and utilities\n- `booster-annotations` - Annotation definitions\n\n### SPI Layer (Extension Interfaces)\n- `booster-transform-spi` - Bytecode transformation interfaces (`Transformer`, `TransformContext`, `KlassPool`)\n- `booster-task-spi` - Task processor interface (`VariantProcessor`)\n\n### Bytecode Transformation Tools\n- `booster-transform-asm` - ASM implementation\n- `booster-transform-javassist` - Javassist implementation\n- `booster-transform-util` - Utility library\n\n### AGP Compatibility Layer\n- `booster-android-gradle-api` - API abstraction\n- `booster-android-gradle-compat` - Compatibility support\n- `booster-android-gradle-v8_*` - AGP version adapters (v8_0 ~ v8_12)\n- `booster-android-gradle-v9_0` - AGP 9.0 adapter\n\n### Transform Implementations\n- `booster-transform-thread` - Multi-threading optimization\n- `booster-transform-toast` - Toast crash fix\n- `booster-transform-r-inline` - R class constant inlining\n- `booster-transform-res-check` - Resource checking\n- `booster-transform-activity-thread` - ActivityThread optimization\n- `booster-transform-finalizer-watchdog-daemon` - Finalizer optimization\n- `booster-transform-logcat` - Logcat optimization\n- `booster-transform-media-player` - MediaPlayer optimization\n\n### Runtime Instrumentation\n- `booster-android-instrument-*` - Runtime hook implementations for each feature\n\n### Auxiliary Tools\n- `booster-cha` / `booster-cha-asm` - Class Hierarchy Analysis\n- `booster-graph-*` - Task graph visualization\n- `booster-task-list-*` - Task list tools\n- `booster-aapt2` - AAPT2 integration\n\n## Key Entry Files\n\n| File | Path | Purpose |\n|------|------|---------|\n| `BoosterPlugin.kt` | `booster-gradle-plugin/.../gradle/` | Plugin main class, implements `Plugin<Project>` |\n| `BoosterTransformTask.kt` | same | Bytecode transformation task |\n| `Transformer.kt` | `booster-transform-spi/.../transform/` | Transformer interface definition |\n| `TransformContext.kt` | same | Transform context |\n| `VariantProcessor.kt` | `booster-task-spi/.../task/spi/` | Variant processor interface |\n| `AsmTransformer.kt` | `booster-transform-asm/.../asm/` | ASM transformer implementation |\n| `ClassTransformer.kt` | same | Class transformer abstract class |\n\n## Common Commands\n\n```bash\n# Build project\n./gradlew build\n\n# Publish to local Maven\n./gradlew publishToMavenLocal\n\n# Run tests\n./gradlew test\n\n# Run integration tests\n./gradlew integrationTest\n\n# Compile integration tests (verify compatibility)\n./gradlew compileIntegrationTestKotlin\n\n# View all tasks\n./gradlew tasks\n```\n\n## AGP Version Compatibility Development\n\n### Kotlin 2.0 Metadata Compatibility\n\nAGP 8.9+ is compiled with Kotlin 2.0, producing Kotlin metadata incompatible with Kotlin 1.x. Solution:\n\n1. **Gradle Version**: Use Gradle 8.5+ (includes Kotlin 1.9.20 which better handles Kotlin 2.0 metadata)\n2. **Compiler Args**: Add to v8_9+ module's `build.gradle`:\n   ```groovy\n   tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach {\n       kotlinOptions {\n           freeCompilerArgs += ['-Xskip-metadata-version-check']\n       }\n   }\n   ```\n\n### AGP Version to Gradle Version Mapping\n\n| AGP Version | Minimum Gradle Version |\n|-------------|------------------------|\n| 8.0 - 8.8   | 8.0+                   |\n| 8.9 - 8.11  | 8.11.1+                |\n| 8.12        | 8.13+                  |\n| 9.0         | 9.1+                   |\n\n### Adding New AGP Version Support\n\n1. Create module `booster-android-gradle-v{major}_{minor}`\n2. Copy existing module structure (e.g., v8_2)\n3. Update AGP dependency version and SDK tools version\n4. Implement `AGPInterface`, handling API changes\n5. Create `src/integrationTest/` directory with:\n   - `kotlin/.../V{major}{minor}IntegrationTest.kt` - Test class\n   - `resources/` - Test resources (app.gradle, lib.gradle, buildSrc/, src/)\n6. Create `src/e2eTest/` directory with standalone Android test project\n7. Update `GradleExecutor` version in integration test to match AGP requirements\n\n### Integration Test Structure\n\nEach AGP adapter module contains:\n- `src/integrationTest/` - Gradle TestKit integration tests\n- `src/e2eTest/` - Standalone Android project for end-to-end testing\n\n### Running Integration Tests\n\nIntegration tests require:\n1. Booster artifacts published to local Maven\n2. Android SDK with accepted licenses\n3. ANDROID_HOME environment variable set (or SDK at ~/Library/Android/sdk on macOS)\n\n```bash\n# First, publish to local Maven\n./gradlew publishToMavenLocal\n\n# Accept Android SDK licenses (one-time)\nsdkmanager --licenses\n\n# Then run integration tests\n./gradlew integrationTest\n```\n\n### Known Integration Test Issues\n\n#### 1. Dependency Resolution Conflict\n\n**Problem**: `io.bootstage.testkit:testkit-gradle-plugin:2.1.0` transitively depends on old booster versions from Maven Central (e.g., `booster-kotlinx:2.4.0`). This causes `NoSuchMethodError` at runtime because older versions lack methods like `capitalized()`.\n\n**Solution**: In test project's `buildSrc/build.gradle`, exclude transitive booster dependencies:\n```groovy\nimplementation(\"io.bootstage.testkit:testkit-gradle-plugin:2.1.0\") {\n    exclude group: 'com.didiglobal.booster'\n}\n```\n\n#### 2. Android SDK Detection\n\n**Problem**: If `sdkmanager` is in PATH (e.g., from Homebrew), the `AndroidSdk.location` detection may pick up the wrong SDK path.\n\n**Solution**: The `integration-test.gradle` sets `ANDROID_HOME` environment variable:\n```groovy\ndef androidHome = System.getenv('ANDROID_HOME') ?: \"${System.getProperty('user.home')}/Library/Android/sdk\"\nenvironment 'ANDROID_HOME', androidHome\n```\n\n### Running e2eTest Projects\n\nEach e2eTest is a standalone Android project that tests the booster plugin end-to-end.\n\n**Setup Requirements:**\n1. Publish booster to local Maven: `./gradlew publishToMavenLocal`\n2. Create `local.properties` with Android SDK path in the e2eTest directory:\n   ```properties\n   sdk.dir=/path/to/Android/sdk\n   ```\n\n**Running e2eTest:**\n```bash\ncd booster-android-gradle-v8_9/src/e2eTest\n./gradlew assembleDebug\n```\n\n**Configuration:**\n- `build.gradle.kts` - Root build file referencing booster plugin with version `1.0.0-SNAPSHOT`\n- `settings.gradle.kts` - Uses `mavenLocal()` in pluginManagement to resolve local booster\n- `app/build.gradle.kts` - Applies the booster plugin\n\n**Note**: `local.properties` is gitignored and must be created locally on each machine.\n\n## Extending Booster\n\n### Implementing Custom Transformer\n\n1. Create module, depend on `booster-transform-spi` and `booster-transform-asm`\n2. Extend `ClassTransformer` to implement transformation logic\n3. Register via SPI in `META-INF/services/`\n\n### Implementing Custom VariantProcessor\n\n1. Create module, depend on `booster-task-spi`\n2. Implement `VariantProcessor` interface\n3. Register via SPI in `META-INF/services/`\n\n## Code Standards\n\n- Package prefix: `com.didiglobal.booster`\n- Write new code in Kotlin\n- Follow Kotlin official coding conventions\n","category":"root","tokens":1956}]}