[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KB9AB089TX9JNG6MNMBPKC":3,"skill-same:01M6KB9AB089TX9JNG6MNMBPKC":128},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":69,"commitSha":70,"skillDirectory":71,"forksCount":72,"repositoryHtmlUrl":73,"repositoryHomepageUrl":6,"ownerHtmlUrl":74,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":75,"install":76,"resources":89},"01M6KB9AB089TX9JNG6MNMBPKC","android-native-dev",null,"Android native application development and UI design guide. Covers Material Design 3, Kotlin\u002FCompose development, project configuration, accessibility, and build troubleshooting. Read this before Android native application development.","zhizhunbao\u002Fworkbuddy","zhizhunbao","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F7111063?v=4","01M6K6S4GJ0HA544MFAKAB913B","王鹏","01M6K6S4MEC7KW1Z6SCQ3FA876",9,"MIT","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002FSKILL.md",[18,23,26,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"android","android native dev","dev","native","read","developer documentation","material","project","mobile","compose","material design 3","guide","design","kotlin","WCAG","developer","ui","play","guidelines","google","2026-11-10 10:12:30",false,"---\nname: android-native-dev\ndescription: Android native application development and UI design guide. Covers Material Design 3, Kotlin\u002FCompose development, project configuration, accessibility, and build troubleshooting. Read this before Android native application development.\ndescription_zh: \"Android 原生应用开发指南\"\ndescription_en: \"Android native development guide (Material Design 3, Kotlin\u002FCompose)\"\nlicense: MIT\nmetadata:\n  version: \"1.0.0\"\n  category: mobile\n  sources:\n    - Material Design 3 Guidelines (material.io)\n    - Android Developer Documentation (developer.android.com)\n    - Google Play Quality Guidelines\n    - WCAG Accessibility Guidelines\n---\n\n## 1. Project Scenario Assessment\n\nBefore starting development, assess the current project state:\n\n| Scenario | Characteristics | Approach |\n|----------|-----------------|----------|\n| **Empty Directory** | No files present | Full initialization required, including Gradle Wrapper |\n| **Has Gradle Wrapper** | `gradlew` and `gradle\u002Fwrapper\u002F` exist | Use `.\u002Fgradlew` directly for builds |\n| **Android Studio Project** | Complete project structure, may lack wrapper | Check wrapper, run `gradle wrapper` if needed |\n| **Incomplete Project** | Partial files present | Check missing files, complete configuration |\n\n**Key Principles**:\n- Before writing business logic, ensure `.\u002Fgradlew assembleDebug` succeeds\n- If `gradle.properties` is missing, create it first and configure AndroidX\n\n### 1.1 Required Files Checklist\n\n```\nMyApp\u002F\n├── gradle.properties          # Configure AndroidX and other settings\n├── settings.gradle.kts\n├── build.gradle.kts           # Root level\n├── gradle\u002Fwrapper\u002F\n│   └── gradle-wrapper.properties\n├── app\u002F\n│   ├── build.gradle.kts       # Module level\n│   └── src\u002Fmain\u002F\n│       ├── AndroidManifest.xml\n│       ├── java\u002Fcom\u002Fexample\u002Fmyapp\u002F\n│       │   └── MainActivity.kt\n│       └── res\u002F\n│           ├── values\u002F\n│           │   ├── strings.xml\n│           │   ├── colors.xml\n│           │   └── themes.xml\n│           └── mipmap-*\u002F       # App icons\n```\n\n---\n\n## 2. Project Configuration\n\n### 2.1 gradle.properties\n\n```properties\n# Required configuration\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\n# Build optimization\norg.gradle.parallel=true\nkotlin.code.style=official\n\n# JVM memory settings (adjust based on project size)\n# Small projects: 2048m, Medium: 4096m, Large: 8192m+\n# org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n```\n\n> **Note**: If you encounter `OutOfMemoryError` during build, increase `-Xmx` value. Large projects with many dependencies may require 8GB or more.\n\n### 2.2 Dependency Declaration Standards\n\n```kotlin\ndependencies {\n    \u002F\u002F Use BOM to manage Compose versions\n    implementation(platform(\"androidx.compose:compose-bom:2024.02.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.material3:material3\")\n    \n    \u002F\u002F Activity & ViewModel\n    implementation(\"androidx.activity:activity-compose:1.8.2\")\n    implementation(\"androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0\")\n}\n```\n\n### 2.3 Build Variants & Product Flavors\n\nProduct Flavors allow you to create different versions of your app (e.g., free\u002Fpaid, dev\u002Fstaging\u002Fprod).\n\n**Configuration in app\u002Fbuild.gradle.kts**:\n\n```kotlin\nandroid {\n    \u002F\u002F Define flavor dimensions\n    flavorDimensions += \"environment\"\n    \n    productFlavors {\n        create(\"dev\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".dev\"\n            versionNameSuffix = \"-dev\"\n            \n            \u002F\u002F Different config values per flavor\n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fdev-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            \n            \u002F\u002F Different resources\n            resValue(\"string\", \"app_name\", \"MyApp Dev\")\n        }\n        \n        create(\"staging\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".staging\"\n            versionNameSuffix = \"-staging\"\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fstaging-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            resValue(\"string\", \"app_name\", \"MyApp Staging\")\n        }\n        \n        create(\"prod\") {\n            dimension = \"environment\"\n            \u002F\u002F No suffix for production\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fapi.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"false\")\n            resValue(\"string\", \"app_name\", \"MyApp\")\n        }\n    }\n    \n    buildTypes {\n        debug {\n            isDebuggable = true\n            isMinifyEnabled = false\n        }\n        release {\n            isDebuggable = false\n            isMinifyEnabled = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\")\n        }\n    }\n}\n```\n\n**Build Variant Naming**: `{flavor}{BuildType}` → e.g., `devDebug`, `prodRelease`\n\n**Gradle Build Commands**:\n\n```bash\n# List all available build variants\n.\u002Fgradlew tasks --group=\"build\"\n\n# Build specific variant (flavor + buildType)\n.\u002Fgradlew assembleDevDebug        # Dev flavor, Debug build\n.\u002Fgradlew assembleStagingDebug    # Staging flavor, Debug build\n.\u002Fgradlew assembleProdRelease     # Prod flavor, Release build\n\n# Build all variants of a specific flavor\n.\u002Fgradlew assembleDev             # All Dev variants (debug + release)\n.\u002Fgradlew assembleProd            # All Prod variants\n\n# Build all variants of a specific build type\n.\u002Fgradlew assembleDebug           # All flavors, Debug build\n.\u002Fgradlew assembleRelease         # All flavors, Release build\n\n# Install specific variant to device\n.\u002Fgradlew installDevDebug\n.\u002Fgradlew installProdRelease\n\n# Build and install in one command\n.\u002Fgradlew installDevDebug && adb shell am start -n com.example.myapp.dev\u002F.MainActivity\n```\n\n**Access BuildConfig in Code**:\n\n> **Note**: Starting from AGP 8.0, `BuildConfig` is no longer generated by default. You must explicitly enable it in your `build.gradle.kts`:\n> ```kotlin\n> android {\n>     buildFeatures {\n>         buildConfig = true\n>     }\n> }\n> ```\n\n```kotlin\n\u002F\u002F Use build config values in your code\nval apiUrl = BuildConfig.API_BASE_URL\nval isLoggingEnabled = BuildConfig.ENABLE_LOGGING\n\nif (BuildConfig.DEBUG) {\n    \u002F\u002F Debug-only code\n}\n```\n\n**Flavor-Specific Source Sets**:\n\n```\napp\u002Fsrc\u002F\n├── main\u002F           # Shared code for all flavors\n├── dev\u002F            # Dev-only code and resources\n│   ├── java\u002F\n│   └── res\u002F\n├── staging\u002F        # Staging-only code and resources\n├── prod\u002F           # Prod-only code and resources\n├── debug\u002F          # Debug build type code\n└── release\u002F        # Release build type code\n```\n\n**Multiple Flavor Dimensions** (e.g., environment + tier):\n\n```kotlin\nandroid {\n    flavorDimensions += listOf(\"environment\", \"tier\")\n    \n    productFlavors {\n        create(\"dev\") { dimension = \"environment\" }\n        create(\"prod\") { dimension = \"environment\" }\n        \n        create(\"free\") { dimension = \"tier\" }\n        create(\"paid\") { dimension = \"tier\" }\n    }\n}\n\u002F\u002F Results in: devFreeDebug, devPaidDebug, prodFreeRelease, etc.\n```\n\n---\n\n## 3. Kotlin Development Standards\n\n### 3.1 Naming Conventions\n\n| Type | Convention | Example |\n|------|------------|---------|\n| Class\u002FInterface | PascalCase | `UserRepository`, `MainActivity` |\n| Function\u002FVariable | camelCase | `getUserName()`, `isLoading` |\n| Constant | SCREAMING_SNAKE | `MAX_RETRY_COUNT` |\n| Package | lowercase | `com.example.myapp` |\n| Composable | PascalCase | `@Composable fun UserCard()` |\n\n### 3.2 Code Standards (Important)\n\n**Null Safety**:\n```kotlin\n\u002F\u002F ❌ Avoid: Non-null assertion !! (may crash)\nval name = user!!.name\n\n\u002F\u002F ✅ Recommended: Safe call + default value\nval name = user?.name ?: \"Unknown\"\n\n\u002F\u002F ✅ Recommended: let handling\nuser?.let { processUser(it) }\n```\n\n**Exception Handling**:\n```kotlin\n\u002F\u002F ❌ Avoid: Random try-catch in business layer swallowing exceptions\nfun loadData() {\n    try {\n        val data = api.fetch()\n    } catch (e: Exception) {\n        \u002F\u002F Swallowing exception, hard to debug\n    }\n}\n\n\u002F\u002F ✅ Recommended: Let exceptions propagate, handle at appropriate layer\nsuspend fun loadData(): Result\u003CData> {\n    return try {\n        Result.success(api.fetch())\n    } catch (e: Exception) {\n        Result.failure(e)  \u002F\u002F Wrap and return, let caller decide handling\n    }\n}\n\n\u002F\u002F ✅ Recommended: Unified handling in ViewModel\nviewModelScope.launch {\n    runCatching { repository.loadData() }\n        .onSuccess { _uiState.value = UiState.Success(it) }\n        .onFailure { _uiState.value = UiState.Error(it.message) }\n}\n```\n\n### 3.3 Threading & Coroutines (Critical)\n\n**Thread Selection Principles**:\n\n| Operation Type | Thread | Description |\n|----------------|--------|-------------|\n| UI Updates | `Dispatchers.Main` | Update View, State, LiveData |\n| Network Requests | `Dispatchers.IO` | HTTP calls, API requests |\n| File I\u002FO | `Dispatchers.IO` | Local storage, database operations |\n| Compute Intensive | `Dispatchers.Default` | JSON parsing, sorting, encryption |\n\n**Correct Usage**:\n```kotlin\n\u002F\u002F In ViewModel\nviewModelScope.launch {\n    \u002F\u002F Default Main thread, can update UI State\n    _uiState.value = UiState.Loading\n    \n    \u002F\u002F Switch to IO thread for network request\n    val result = withContext(Dispatchers.IO) {\n        repository.fetchData()\n    }\n    \n    \u002F\u002F Automatically returns to Main thread, update UI\n    _uiState.value = UiState.Success(result)\n}\n\n\u002F\u002F In Repository (suspend functions should be main-safe)\nsuspend fun fetchData(): Data = withContext(Dispatchers.IO) {\n    api.getData()\n}\n```\n\n**Common Mistakes**:\n```kotlin\n\u002F\u002F ❌ Wrong: Updating UI on IO thread\nviewModelScope.launch(Dispatchers.IO) {\n    val data = api.fetch()\n    _uiState.value = data  \u002F\u002F Crash or warning!\n}\n\n\u002F\u002F ❌ Wrong: Executing time-consuming operation on Main thread\nviewModelScope.launch {\n    val data = api.fetch()  \u002F\u002F Blocking main thread! ANR\n}\n\n\u002F\u002F ✅ Correct: Fetch on IO, update on Main\nviewModelScope.launch {\n    val data = withContext(Dispatchers.IO) { api.fetch() }\n    _uiState.value = data\n}\n```\n\n### 3.4 Visibility Rules\n\n```kotlin\n\u002F\u002F Default is public, declare explicitly when needed\nclass UserRepository {           \u002F\u002F public\n    private val cache = mutableMapOf\u003CString, User>()  \u002F\u002F Visible only within class\n    internal fun clearCache() {} \u002F\u002F Visible only within module\n}\n\n\u002F\u002F data class properties are public by default, be careful when used across modules\ndata class User(\n    val id: String,       \u002F\u002F public\n    val name: String\n)\n```\n\n### 3.5 Common Syntax Pitfalls\n\n```kotlin\n\u002F\u002F ❌ Wrong: Accessing uninitialized lateinit\nclass MyViewModel : ViewModel() {\n    lateinit var data: String\n    fun process() = data.length  \u002F\u002F May crash\n}\n\n\u002F\u002F ✅ Correct: Use nullable or default value\nclass MyViewModel : ViewModel() {\n    var data: String? = null\n    fun process() = data?.length ?: 0\n}\n\n\u002F\u002F ❌ Wrong: Using return in lambda\nlist.forEach { item ->\n    if (item.isEmpty()) return  \u002F\u002F Returns from outer function!\n}\n\n\u002F\u002F ✅ Correct: Use return@forEach\nlist.forEach { item ->\n    if (item.isEmpty()) return@forEach\n}\n```\n\n### 3.6 Server Response Data Class Fields Must Be Nullable\n\n```kotlin\n\u002F\u002F ❌ Wrong: Fields declared as non-null (server may not return them)\ndata class UserResponse(\n    val id: String = \"\",\n    val name: String = \"\",\n    val avatar: String = \"\"\n)\n\n\u002F\u002F ✅ Correct: All fields declared as nullable\ndata class UserResponse(\n    @SerializedName(\"id\")\n    val id: String? = null,\n    @SerializedName(\"name\")\n    val name: String? = null,\n    @SerializedName(\"avatar\")\n    val avatar: String? = null\n)\n```\n\n### 3.7 Lifecycle Resource Management\n\n```kotlin\n\u002F\u002F ❌ Wrong: Only adding Observer, not removing\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n    \u002F\u002F Memory leak!\n}\n\n\u002F\u002F ✅ Correct: Paired add and remove\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n\n    override fun onDetachedFromWindow() {\n        activity?.lifecycle?.removeObserver(this)\n        super.onDetachedFromWindow()\n    }\n}\n```\n\n### 3.8 Logging Level Usage\n\n```kotlin\nimport android.util.Log\n\n\u002F\u002F Info: Key checkpoints in normal flow\nLog.i(TAG, \"loadData: started, userId = $userId\")\n\n\u002F\u002F Warning: Abnormal but recoverable situations\nLog.w(TAG, \"loadData: cache miss, fallback to network\")\n\n\u002F\u002F Error: Failure\u002Ferror situations\nLog.e(TAG, \"loadData failed: ${error.message}\")\n```\n\n| Level | Use Case |\n|-------|----------|\n| `i` (Info) | Normal flow, method entry, key parameters |\n| `w` (Warning) | Recoverable exceptions, fallback handling, null returns |\n| `e` (Error) | Request failures, caught exceptions, unrecoverable errors |\n\n---\n\n## 4. Jetpack Compose Standards\n\n### 4.1 @Composable Context Rules\n\n```kotlin\n\u002F\u002F ❌ Wrong: Calling Composable from non-Composable function\nfun showError(message: String) {\n    Text(message)  \u002F\u002F Compile error!\n}\n\n\u002F\u002F ✅ Correct: Mark as @Composable\n@Composable\nfun ErrorMessage(message: String) {\n    Text(message)\n}\n\n\u002F\u002F ❌ Wrong: Using suspend outside LaunchedEffect\n@Composable\nfun MyScreen() {\n    val data = fetchData()  \u002F\u002F Error!\n}\n\n\u002F\u002F ✅ Correct: Use LaunchedEffect\n@Composable\nfun MyScreen() {\n    var data by remember { mutableStateOf\u003CData?>(null) }\n    LaunchedEffect(Unit) {\n        data = fetchData()\n    }\n}\n```\n\n### 4.2 State Management\n\n```kotlin\n\u002F\u002F Basic State\nvar count by remember { mutableStateOf(0) }\n\n\u002F\u002F Derived State (avoid redundant computation)\nval isEven by remember { derivedStateOf { count % 2 == 0 } }\n\n\u002F\u002F Persist across recomposition (e.g., scroll position)\nval scrollState = rememberScrollState()\n\n\u002F\u002F State in ViewModel\nclass MyViewModel : ViewModel() {\n    private val _uiState = MutableStateFlow(UiState())\n    val uiState: StateFlow\u003CUiState> = _uiState.asStateFlow()\n}\n```\n\n### 4.3 Common Compose Mistakes\n\n```kotlin\n\u002F\u002F ❌ Wrong: Creating objects in Composable (created on every recomposition)\n@Composable\nfun MyScreen() {\n    val viewModel = MyViewModel()  \u002F\u002F Wrong!\n}\n\n\u002F\u002F ✅ Correct: Use viewModel() or remember\n@Composable\nfun MyScreen(viewModel: MyViewModel = viewModel()) {\n    \u002F\u002F ...\n}\n```\n\n---\n\n## 5. Resources & Icons\n\n### 5.1 App Icon Requirements\n\nMust provide multi-resolution icons:\n\n| Directory | Size | Purpose |\n|-----------|------|---------|\n| mipmap-mdpi | 48x48 | Baseline |\n| mipmap-hdpi | 72x72 | 1.5x |\n| mipmap-xhdpi | 96x96 | 2x |\n| mipmap-xxhdpi | 144x144 | 3x |\n| mipmap-xxxhdpi | 192x192 | 4x |\n\nRecommended: Use Adaptive Icon (Android 8+):\n\n```xml\n\u003C!-- res\u002Fmipmap-anydpi-v26\u002Fic_launcher.xml -->\n\u003Cadaptive-icon>\n    \u003Cbackground android:drawable=\"@color\u002Fic_launcher_background\"\u002F>\n    \u003Cforeground android:drawable=\"@mipmap\u002Fic_launcher_foreground\"\u002F>\n\u003C\u002Fadaptive-icon>\n```\n\n### 5.2 Resource Naming Conventions\n\n| Type | Prefix | Example |\n|------|--------|---------|\n| Layout | layout_ | `layout_main.xml` |\n| Image | ic_, img_, bg_ | `ic_user.png` |\n| Color | color_ | `color_primary` |\n| String | - | `app_name`, `btn_submit` |\n\n### 5.3 Avoid Android Reserved Names (Important)\n\nVariable names, resource IDs, colors, icons, and XML elements **must not** use Android reserved words or system resource names. Using reserved names causes build errors or resource conflicts.\n\n**Common Reserved Names to Avoid**:\n\n| Category | Reserved Names (Do NOT Use) |\n|----------|----------------------------|\n| Colors | `background`, `foreground`, `transparent`, `white`, `black` |\n| Icons\u002FDrawables | `icon`, `logo`, `image`, `drawable` |\n| Views | `view`, `text`, `button`, `layout`, `container` |\n| Attributes | `id`, `name`, `type`, `style`, `theme`, `color` |\n| System | `app`, `android`, `content`, `data`, `action` |\n\n**Examples**:\n\n```xml\n\u003C!-- ❌ Wrong: Using reserved names -->\n\u003Ccolor name=\"background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon\">#000000\u003C\u002Fcolor>\n\n\u003C!-- ✅ Correct: Add prefix or specific naming -->\n\u003Ccolor name=\"app_background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon_primary\">#000000\u003C\u002Fcolor>\n```\n\n```kotlin\n\u002F\u002F ❌ Wrong: Variable names conflict with system\nval icon = R.drawable.my_icon\nval background = Color.White\n\n\u002F\u002F ✅ Correct: Use descriptive names\nval appIcon = R.drawable.my_icon\nval screenBackground = Color.White\n```\n\n```xml\n\u003C!-- ❌ Wrong: Drawable name conflicts -->\n\u003CImageView android:src=\"@drawable\u002Ficon\" \u002F>\n\n\u003C!-- ✅ Correct: Add prefix -->\n\u003CImageView android:src=\"@drawable\u002Fic_home\" \u002F>\n```\n\n---\n\n## 6. Build Error Diagnosis & Fixes\n\n### 6.1 Common Error Quick Reference\n\n| Error Keyword | Cause | Fix |\n|---------------|-------|-----|\n| `Unresolved reference` | Missing import or undefined | Check imports, verify dependencies |\n| `Type mismatch` | Type incompatibility | Check parameter types, add conversion |\n| `Cannot access` | Visibility issue | Check public\u002Fprivate\u002Finternal |\n| `@Composable invocations` | Composable context error | Ensure caller is also @Composable |\n| `Duplicate class` | Dependency conflict | Use `.\u002Fgradlew dependencies` to investigate |\n| `AAPT: error` | Resource file error | Check XML syntax and resource references |\n\n### 6.2 Fix Best Practices\n\n1. **Read the complete error message first**: Locate file and line number\n2. **Check recent changes**: Problems usually in latest modifications\n3. **Clean Build**: `.\u002Fgradlew clean assembleDebug`\n4. **Check dependency versions**: Version conflicts are common causes\n5. **Refresh dependencies if needed**: Clear cache and rebuild\n\n### 6.3 Debugging Commands\n\n```bash\n# Clean and build\n.\u002Fgradlew clean assembleDebug\n\n# View dependency tree (investigate conflicts)\n.\u002Fgradlew :app:dependencies\n\n# View detailed errors\n.\u002Fgradlew assembleDebug --stacktrace\n\n# Refresh dependencies\n.\u002Fgradlew --refresh-dependencies\n```\n\n---\n\n## 7. Material Design 3 Guidelines\n\nReview Android UI files for compliance with Material Design 3 Guidelines and Android best practices.\n\n### Design Philosophy\n\n#### M3 Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Personal** | Dynamic color based on user preferences and wallpaper |\n| **Adaptive** | Responsive across all screen sizes and form factors |\n| **Expressive** | Bold colors and typography with personality |\n| **Accessible** | Inclusive design for all users |\n\n#### M3 Expressive (Latest)\n\nThe latest evolution adds emotion-driven UX through:\n- Vibrant, dynamic colors\n- Intuitive motion physics\n- Adaptive components\n- Flexible typography\n- Contrasting shapes (35 new shape options)\n\n### App Style Selection\n\n**Critical Decision**: Match visual style to app category and target audience.\n\n| App Category | Visual Style | Key Characteristics |\n|--------------|--------------|---------------------|\n| Utility\u002FTool | Minimalist | Clean, efficient, neutral colors |\n| Finance\u002FBanking | Professional Trust | Conservative colors, security-focused |\n| Health\u002FWellness | Calm & Natural | Soft colors, organic shapes |\n| Kids (3-5) | Playful Simple | Bright colors, large targets (56dp+) |\n| Kids (6-12) | Fun & Engaging | Vibrant, gamified feedback |\n| Social\u002FEntertainment | Expressive | Brand-driven, gesture-rich |\n| Productivity | Clean & Focused | Minimal, high contrast |\n| E-commerce | Conversion-focused | Clear CTAs, scannable |\n\nSee [Design Style Guide](references\u002Fdesign-style-guide.md) for detailed style profiles.\n\n### Quick Reference: Key Specifications\n\n#### Color Contrast Requirements\n\n| Element | Minimum Ratio |\n|---------|---------------|\n| Body text | **4.5:1** |\n| Large text (18sp+) | **3:1** |\n| UI components | **3:1** |\n\n#### Touch Targets\n\n| Type | Size |\n|------|------|\n| Minimum | 48 × 48dp |\n| Recommended (primary actions) | 56 × 56dp |\n| Kids apps | 56dp+ |\n| Spacing between targets | 8dp minimum |\n\n#### 8dp Grid System\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| xs | 4dp | Icon padding |\n| sm | 8dp | Tight spacing |\n| md | 16dp | Default padding |\n| lg | 24dp | Section spacing |\n| xl | 32dp | Large gaps |\n| xxl | 48dp | Screen margins |\n\n#### Typography Scale (Summary)\n\n| Category | Sizes |\n|----------|-------|\n| Display | 57sp, 45sp, 36sp |\n| Headline | 32sp, 28sp, 24sp |\n| Title | 22sp, 16sp, 14sp |\n| Body | 16sp, 14sp, 12sp |\n| Label | 14sp, 12sp, 11sp |\n\n#### Animation Duration\n\n| Type | Duration |\n|------|----------|\n| Micro (ripples) | 50-100ms |\n| Short (simple) | 100-200ms |\n| Medium (expand\u002Fcollapse) | 200-300ms |\n| Long (complex) | 300-500ms |\n\n#### Component Dimensions\n\n| Component | Height | Min Width |\n|-----------|--------|-----------|\n| Button | 40dp | 64dp |\n| FAB | 56dp | 56dp |\n| Text Field | 56dp | 280dp |\n| App Bar | 64dp | - |\n| Bottom Nav | 80dp | - |\n\n### Anti-Patterns (Must Avoid)\n\n#### UI Anti-Patterns\n- More than 5 bottom navigation items\n- Multiple FABs on same screen\n- Touch targets smaller than 48dp\n- Inconsistent spacing (non-8dp multiples)\n- Missing dark theme support\n- Text on colored backgrounds without contrast check\n\n#### Performance Anti-Patterns\n- Startup time > 2 seconds without progress indicator\n- Frame rate \u003C 60 FPS (> 16ms per frame)\n- Crash rate > 1.09% (Google Play threshold)\n- ANR rate > 0.47% (Google Play threshold)\n\n#### Accessibility Anti-Patterns\n- Missing contentDescription on interactive elements\n- Element type in labels (e.g., \"Save button\" instead of \"Save\")\n- Complex gestures in kids apps\n- Text-only buttons for non-readers\n\n### Review Checklist\n\n- [ ] 8dp spacing grid compliance\n- [ ] 48dp minimum touch targets\n- [ ] Proper typography scale usage\n- [ ] Color contrast compliance (4.5:1+ for text)\n- [ ] Dark theme support\n- [ ] contentDescription on all interactive elements\n- [ ] Startup \u003C 2 seconds or shows progress\n- [ ] Visual style matches app category\n\n### Design References\n\n| Topic | Reference |\n|-------|-----------|\n| Colors, Typography, Spacing, Shapes | [Visual Design](references\u002Fvisual-design.md) |\n| Animation & Transitions | [Motion System](references\u002Fmotion-system.md) |\n| Accessibility Guidelines | [Accessibility](references\u002Faccessibility.md) |\n| Large Screens & Foldables | [Adaptive Screens](references\u002Fadaptive-screens.md) |\n| Android Vitals & Performance | [Performance & Stability](references\u002Fperformance-stability.md) |\n| Privacy & Security | [Privacy & Security](references\u002Fprivacy-security.md) |\n| Audio, Video, Notifications | [Functional Requirements](references\u002Ffunctional-requirements.md) |\n| App Style by Category | [Design Style Guide](references\u002Fdesign-style-guide.md) |\n\n---\n\n## 8. Testing\n\n> **Note**: Only add test dependencies when the user explicitly asks for testing.\n\nA well-tested Android app uses layered testing: fast local unit tests for logic, instrumentation tests for UI and integration, and Gradle Managed Devices to run emulators reproducibly on any machine — including CI.\n\n### 8.1 Test Dependencies\n\nBefore adding test dependencies, inspect the project's existing versions to avoid conflicts:\n\n1. Check `gradle\u002Flibs.versions.toml` — if present, add test deps using the project's version catalog style\n2. Check existing `build.gradle.kts` for already-pinned dependency versions\n3. Match version families using the table below\n\n**Version Alignment Rules**:\n\n| Test Dependency                              | Must Align With                                  | How to Check                                                          |\n|----------------------------------------------|--------------------------------------------------|-----------------------------------------------------------------------|\n| `kotlinx-coroutines-test`                    | Project's `kotlinx-coroutines-core` version      | Search for `kotlinx-coroutines` in build files or version catalog     |\n| `compose-ui-test-junit4`                     | Project's Compose BOM or `compose-compiler`      | Search for `compose-bom` or `compose.compiler` in build files         |\n| `espresso-*`                                 | All Espresso artifacts must use the same version  | Search for `espresso` in build files                                  |\n| `androidx.test:runner`, `rules`, `ext:junit` | Should use compatible AndroidX Test versions      | Search for `androidx.test` in build files                             |\n| `mockk`                                      | Must support the project's Kotlin version         | Check `kotlin` version in root `build.gradle.kts` or version catalog |\n\n**Dependencies Reference** — add only the groups you need:\n\n```kotlin\ndependencies {\n    \u002F\u002F --- Local unit tests (src\u002Ftest\u002F) ---\n    testImplementation(\"junit:junit:\u003Cversion>\")                          \u002F\u002F 4.13.2+\n    testImplementation(\"org.robolectric:robolectric:\u003Cversion>\")          \u002F\u002F 4.16.1+\n    testImplementation(\"io.mockk:mockk:\u003Cversion>\")                      \u002F\u002F match Kotlin version\n    testImplementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-test:\u003Cversion>\")  \u002F\u002F match coroutines-core\n    testImplementation(\"androidx.arch.core:core-testing:\u003Cversion>\")      \u002F\u002F InstantTaskExecutorRule for LiveData\n    testImplementation(\"app.cash.turbine:turbine:\u003Cversion>\")             \u002F\u002F Flow\u002FStateFlow testing\n\n    \u002F\u002F --- Instrumentation tests (src\u002FandroidTest\u002F) ---\n    androidTestImplementation(\"androidx.test.ext:junit:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:runner:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:rules:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-core:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-contrib:\u003Cversion>\")   \u002F\u002F RecyclerView, Drawer\n    androidTestImplementation(\"androidx.test.espresso:espresso-intents:\u003Cversion>\")   \u002F\u002F Intent verification\n    androidTestImplementation(\"androidx.test.espresso:espresso-idling-resource:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.uiautomator:uiautomator:\u003Cversion>\")\n\n    \u002F\u002F --- Compose UI tests (only if project uses Compose) ---\n    androidTestImplementation(\"androidx.compose.ui:ui-test-junit4\")      \u002F\u002F version from Compose BOM\n    debugImplementation(\"androidx.compose.ui:ui-test-manifest\")          \u002F\u002F required for createComposeRule\n}\n```\n\n> **Note**: If the project uses a Compose BOM, `ui-test-junit4` and `ui-test-manifest` don't need explicit versions — the BOM manages them.\n\nEnable Robolectric resource support in the `android` block:\n\n```kotlin\nandroid {\n    testOptions {\n        unitTests.isIncludeAndroidResources = true  \u002F\u002F required for Robolectric\n    }\n}\n```\n\n### 8.2 Testing by Layer\n\n| Layer              | Location           | Runs On                 | Speed                | Use For                                          |\n|--------------------|--------------------|-------------------------|----------------------|--------------------------------------------------|\n| Unit (JUnit)       | `src\u002Ftest\u002F`        | JVM                     | ~ms                  | ViewModels, repos, mappers, validators           |\n| Unit + Robolectric | `src\u002Ftest\u002F`        | JVM + simulated Android | ~100ms               | Code needing Context, resources, SharedPrefs     |\n| Compose UI (local) | `src\u002Ftest\u002F`        | JVM + Robolectric       | ~100ms               | Composable rendering & interaction               |\n| Espresso           | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | View-based UI flows, Intents, DB integration     |\n| Compose UI (device)| `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | Full Compose UI flows with real rendering        |\n| UI Automator       | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | System dialogs, notifications, multi-app         |\n| Managed Device     | `src\u002FandroidTest\u002F` | Gradle-managed AVD      | ~minutes (first run) | CI, matrix testing across API levels             |\n\nSee [Testing](references\u002Ftesting.md) for detailed examples, code patterns, and Gradle Managed Device configuration.\n\n### 8.3 Testing Commands\n\n```bash\n# Local unit tests (fast, no emulator)\n.\u002Fgradlew test                          # all modules\n.\u002Fgradlew :app:testDebugUnitTest        # app module, debug variant\n\n# Single test class\n.\u002Fgradlew :app:testDebugUnitTest --tests \"com.example.myapp.CounterViewModelTest\"\n\n# Instrumentation tests (requires device or managed device)\n.\u002Fgradlew connectedDebugAndroidTest     # on connected device\n.\u002Fgradlew pixel6Api34DebugAndroidTest   # on managed device\n\n# Both together\n.\u002Fgradlew test connectedDebugAndroidTest\n\n# Test with coverage report (JaCoCo)\n.\u002Fgradlew testDebugUnitTest jacocoTestReport\n```\n","## 1. Project Scenario Assessment\n\nBefore starting development, assess the current project state:\n\n| Scenario | Characteristics | Approach |\n|----------|-----------------|----------|\n| **Empty Directory** | No files present | Full initialization required, including Gradle Wrapper |\n| **Has Gradle Wrapper** | `gradlew` and `gradle\u002Fwrapper\u002F` exist | Use `.\u002Fgradlew` directly for builds |\n| **Android Studio Project** | Complete project structure, may lack wrapper | Check wrapper, run `gradle wrapper` if needed |\n| **Incomplete Project** | Partial files present | Check missing files, complete configuration |\n\n**Key Principles**:\n- Before writing business logic, ensure `.\u002Fgradlew assembleDebug` succeeds\n- If `gradle.properties` is missing, create it first and configure AndroidX\n\n### 1.1 Required Files Checklist\n\n```\nMyApp\u002F\n├── gradle.properties          # Configure AndroidX and other settings\n├── settings.gradle.kts\n├── build.gradle.kts           # Root level\n├── gradle\u002Fwrapper\u002F\n│   └── gradle-wrapper.properties\n├── app\u002F\n│   ├── build.gradle.kts       # Module level\n│   └── src\u002Fmain\u002F\n│       ├── AndroidManifest.xml\n│       ├── java\u002Fcom\u002Fexample\u002Fmyapp\u002F\n│       │   └── MainActivity.kt\n│       └── res\u002F\n│           ├── values\u002F\n│           │   ├── strings.xml\n│           │   ├── colors.xml\n│           │   └── themes.xml\n│           └── mipmap-*\u002F       # App icons\n```\n\n---\n\n## 2. Project Configuration\n\n### 2.1 gradle.properties\n\n```properties\n# Required configuration\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n\n# Build optimization\norg.gradle.parallel=true\nkotlin.code.style=official\n\n# JVM memory settings (adjust based on project size)\n# Small projects: 2048m, Medium: 4096m, Large: 8192m+\n# org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8\n```\n\n> **Note**: If you encounter `OutOfMemoryError` during build, increase `-Xmx` value. Large projects with many dependencies may require 8GB or more.\n\n### 2.2 Dependency Declaration Standards\n\n```kotlin\ndependencies {\n    \u002F\u002F Use BOM to manage Compose versions\n    implementation(platform(\"androidx.compose:compose-bom:2024.02.00\"))\n    implementation(\"androidx.compose.ui:ui\")\n    implementation(\"androidx.compose.material3:material3\")\n    \n    \u002F\u002F Activity & ViewModel\n    implementation(\"androidx.activity:activity-compose:1.8.2\")\n    implementation(\"androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0\")\n}\n```\n\n### 2.3 Build Variants & Product Flavors\n\nProduct Flavors allow you to create different versions of your app (e.g., free\u002Fpaid, dev\u002Fstaging\u002Fprod).\n\n**Configuration in app\u002Fbuild.gradle.kts**:\n\n```kotlin\nandroid {\n    \u002F\u002F Define flavor dimensions\n    flavorDimensions += \"environment\"\n    \n    productFlavors {\n        create(\"dev\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".dev\"\n            versionNameSuffix = \"-dev\"\n            \n            \u002F\u002F Different config values per flavor\n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fdev-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            \n            \u002F\u002F Different resources\n            resValue(\"string\", \"app_name\", \"MyApp Dev\")\n        }\n        \n        create(\"staging\") {\n            dimension = \"environment\"\n            applicationIdSuffix = \".staging\"\n            versionNameSuffix = \"-staging\"\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fstaging-api.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"true\")\n            resValue(\"string\", \"app_name\", \"MyApp Staging\")\n        }\n        \n        create(\"prod\") {\n            dimension = \"environment\"\n            \u002F\u002F No suffix for production\n            \n            buildConfigField(\"String\", \"API_BASE_URL\", \"\\\"https:\u002F\u002Fapi.example.com\\\"\")\n            buildConfigField(\"Boolean\", \"ENABLE_LOGGING\", \"false\")\n            resValue(\"string\", \"app_name\", \"MyApp\")\n        }\n    }\n    \n    buildTypes {\n        debug {\n            isDebuggable = true\n            isMinifyEnabled = false\n        }\n        release {\n            isDebuggable = false\n            isMinifyEnabled = true\n            proguardFiles(getDefaultProguardFile(\"proguard-android-optimize.txt\"), \"proguard-rules.pro\")\n        }\n    }\n}\n```\n\n**Build Variant Naming**: `{flavor}{BuildType}` → e.g., `devDebug`, `prodRelease`\n\n**Gradle Build Commands**:\n\n```bash\n# List all available build variants\n.\u002Fgradlew tasks --group=\"build\"\n\n# Build specific variant (flavor + buildType)\n.\u002Fgradlew assembleDevDebug        # Dev flavor, Debug build\n.\u002Fgradlew assembleStagingDebug    # Staging flavor, Debug build\n.\u002Fgradlew assembleProdRelease     # Prod flavor, Release build\n\n# Build all variants of a specific flavor\n.\u002Fgradlew assembleDev             # All Dev variants (debug + release)\n.\u002Fgradlew assembleProd            # All Prod variants\n\n# Build all variants of a specific build type\n.\u002Fgradlew assembleDebug           # All flavors, Debug build\n.\u002Fgradlew assembleRelease         # All flavors, Release build\n\n# Install specific variant to device\n.\u002Fgradlew installDevDebug\n.\u002Fgradlew installProdRelease\n\n# Build and install in one command\n.\u002Fgradlew installDevDebug && adb shell am start -n com.example.myapp.dev\u002F.MainActivity\n```\n\n**Access BuildConfig in Code**:\n\n> **Note**: Starting from AGP 8.0, `BuildConfig` is no longer generated by default. You must explicitly enable it in your `build.gradle.kts`:\n> ```kotlin\n> android {\n>     buildFeatures {\n>         buildConfig = true\n>     }\n> }\n> ```\n\n```kotlin\n\u002F\u002F Use build config values in your code\nval apiUrl = BuildConfig.API_BASE_URL\nval isLoggingEnabled = BuildConfig.ENABLE_LOGGING\n\nif (BuildConfig.DEBUG) {\n    \u002F\u002F Debug-only code\n}\n```\n\n**Flavor-Specific Source Sets**:\n\n```\napp\u002Fsrc\u002F\n├── main\u002F           # Shared code for all flavors\n├── dev\u002F            # Dev-only code and resources\n│   ├── java\u002F\n│   └── res\u002F\n├── staging\u002F        # Staging-only code and resources\n├── prod\u002F           # Prod-only code and resources\n├── debug\u002F          # Debug build type code\n└── release\u002F        # Release build type code\n```\n\n**Multiple Flavor Dimensions** (e.g., environment + tier):\n\n```kotlin\nandroid {\n    flavorDimensions += listOf(\"environment\", \"tier\")\n    \n    productFlavors {\n        create(\"dev\") { dimension = \"environment\" }\n        create(\"prod\") { dimension = \"environment\" }\n        \n        create(\"free\") { dimension = \"tier\" }\n        create(\"paid\") { dimension = \"tier\" }\n    }\n}\n\u002F\u002F Results in: devFreeDebug, devPaidDebug, prodFreeRelease, etc.\n```\n\n---\n\n## 3. Kotlin Development Standards\n\n### 3.1 Naming Conventions\n\n| Type | Convention | Example |\n|------|------------|---------|\n| Class\u002FInterface | PascalCase | `UserRepository`, `MainActivity` |\n| Function\u002FVariable | camelCase | `getUserName()`, `isLoading` |\n| Constant | SCREAMING_SNAKE | `MAX_RETRY_COUNT` |\n| Package | lowercase | `com.example.myapp` |\n| Composable | PascalCase | `@Composable fun UserCard()` |\n\n### 3.2 Code Standards (Important)\n\n**Null Safety**:\n```kotlin\n\u002F\u002F ❌ Avoid: Non-null assertion !! (may crash)\nval name = user!!.name\n\n\u002F\u002F ✅ Recommended: Safe call + default value\nval name = user?.name ?: \"Unknown\"\n\n\u002F\u002F ✅ Recommended: let handling\nuser?.let { processUser(it) }\n```\n\n**Exception Handling**:\n```kotlin\n\u002F\u002F ❌ Avoid: Random try-catch in business layer swallowing exceptions\nfun loadData() {\n    try {\n        val data = api.fetch()\n    } catch (e: Exception) {\n        \u002F\u002F Swallowing exception, hard to debug\n    }\n}\n\n\u002F\u002F ✅ Recommended: Let exceptions propagate, handle at appropriate layer\nsuspend fun loadData(): Result\u003CData> {\n    return try {\n        Result.success(api.fetch())\n    } catch (e: Exception) {\n        Result.failure(e)  \u002F\u002F Wrap and return, let caller decide handling\n    }\n}\n\n\u002F\u002F ✅ Recommended: Unified handling in ViewModel\nviewModelScope.launch {\n    runCatching { repository.loadData() }\n        .onSuccess { _uiState.value = UiState.Success(it) }\n        .onFailure { _uiState.value = UiState.Error(it.message) }\n}\n```\n\n### 3.3 Threading & Coroutines (Critical)\n\n**Thread Selection Principles**:\n\n| Operation Type | Thread | Description |\n|----------------|--------|-------------|\n| UI Updates | `Dispatchers.Main` | Update View, State, LiveData |\n| Network Requests | `Dispatchers.IO` | HTTP calls, API requests |\n| File I\u002FO | `Dispatchers.IO` | Local storage, database operations |\n| Compute Intensive | `Dispatchers.Default` | JSON parsing, sorting, encryption |\n\n**Correct Usage**:\n```kotlin\n\u002F\u002F In ViewModel\nviewModelScope.launch {\n    \u002F\u002F Default Main thread, can update UI State\n    _uiState.value = UiState.Loading\n    \n    \u002F\u002F Switch to IO thread for network request\n    val result = withContext(Dispatchers.IO) {\n        repository.fetchData()\n    }\n    \n    \u002F\u002F Automatically returns to Main thread, update UI\n    _uiState.value = UiState.Success(result)\n}\n\n\u002F\u002F In Repository (suspend functions should be main-safe)\nsuspend fun fetchData(): Data = withContext(Dispatchers.IO) {\n    api.getData()\n}\n```\n\n**Common Mistakes**:\n```kotlin\n\u002F\u002F ❌ Wrong: Updating UI on IO thread\nviewModelScope.launch(Dispatchers.IO) {\n    val data = api.fetch()\n    _uiState.value = data  \u002F\u002F Crash or warning!\n}\n\n\u002F\u002F ❌ Wrong: Executing time-consuming operation on Main thread\nviewModelScope.launch {\n    val data = api.fetch()  \u002F\u002F Blocking main thread! ANR\n}\n\n\u002F\u002F ✅ Correct: Fetch on IO, update on Main\nviewModelScope.launch {\n    val data = withContext(Dispatchers.IO) { api.fetch() }\n    _uiState.value = data\n}\n```\n\n### 3.4 Visibility Rules\n\n```kotlin\n\u002F\u002F Default is public, declare explicitly when needed\nclass UserRepository {           \u002F\u002F public\n    private val cache = mutableMapOf\u003CString, User>()  \u002F\u002F Visible only within class\n    internal fun clearCache() {} \u002F\u002F Visible only within module\n}\n\n\u002F\u002F data class properties are public by default, be careful when used across modules\ndata class User(\n    val id: String,       \u002F\u002F public\n    val name: String\n)\n```\n\n### 3.5 Common Syntax Pitfalls\n\n```kotlin\n\u002F\u002F ❌ Wrong: Accessing uninitialized lateinit\nclass MyViewModel : ViewModel() {\n    lateinit var data: String\n    fun process() = data.length  \u002F\u002F May crash\n}\n\n\u002F\u002F ✅ Correct: Use nullable or default value\nclass MyViewModel : ViewModel() {\n    var data: String? = null\n    fun process() = data?.length ?: 0\n}\n\n\u002F\u002F ❌ Wrong: Using return in lambda\nlist.forEach { item ->\n    if (item.isEmpty()) return  \u002F\u002F Returns from outer function!\n}\n\n\u002F\u002F ✅ Correct: Use return@forEach\nlist.forEach { item ->\n    if (item.isEmpty()) return@forEach\n}\n```\n\n### 3.6 Server Response Data Class Fields Must Be Nullable\n\n```kotlin\n\u002F\u002F ❌ Wrong: Fields declared as non-null (server may not return them)\ndata class UserResponse(\n    val id: String = \"\",\n    val name: String = \"\",\n    val avatar: String = \"\"\n)\n\n\u002F\u002F ✅ Correct: All fields declared as nullable\ndata class UserResponse(\n    @SerializedName(\"id\")\n    val id: String? = null,\n    @SerializedName(\"name\")\n    val name: String? = null,\n    @SerializedName(\"avatar\")\n    val avatar: String? = null\n)\n```\n\n### 3.7 Lifecycle Resource Management\n\n```kotlin\n\u002F\u002F ❌ Wrong: Only adding Observer, not removing\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n    \u002F\u002F Memory leak!\n}\n\n\u002F\u002F ✅ Correct: Paired add and remove\nclass MyView : View {\n    override fun onAttachedToWindow() {\n        super.onAttachedToWindow()\n        activity?.lifecycle?.addObserver(this)\n    }\n\n    override fun onDetachedFromWindow() {\n        activity?.lifecycle?.removeObserver(this)\n        super.onDetachedFromWindow()\n    }\n}\n```\n\n### 3.8 Logging Level Usage\n\n```kotlin\nimport android.util.Log\n\n\u002F\u002F Info: Key checkpoints in normal flow\nLog.i(TAG, \"loadData: started, userId = $userId\")\n\n\u002F\u002F Warning: Abnormal but recoverable situations\nLog.w(TAG, \"loadData: cache miss, fallback to network\")\n\n\u002F\u002F Error: Failure\u002Ferror situations\nLog.e(TAG, \"loadData failed: ${error.message}\")\n```\n\n| Level | Use Case |\n|-------|----------|\n| `i` (Info) | Normal flow, method entry, key parameters |\n| `w` (Warning) | Recoverable exceptions, fallback handling, null returns |\n| `e` (Error) | Request failures, caught exceptions, unrecoverable errors |\n\n---\n\n## 4. Jetpack Compose Standards\n\n### 4.1 @Composable Context Rules\n\n```kotlin\n\u002F\u002F ❌ Wrong: Calling Composable from non-Composable function\nfun showError(message: String) {\n    Text(message)  \u002F\u002F Compile error!\n}\n\n\u002F\u002F ✅ Correct: Mark as @Composable\n@Composable\nfun ErrorMessage(message: String) {\n    Text(message)\n}\n\n\u002F\u002F ❌ Wrong: Using suspend outside LaunchedEffect\n@Composable\nfun MyScreen() {\n    val data = fetchData()  \u002F\u002F Error!\n}\n\n\u002F\u002F ✅ Correct: Use LaunchedEffect\n@Composable\nfun MyScreen() {\n    var data by remember { mutableStateOf\u003CData?>(null) }\n    LaunchedEffect(Unit) {\n        data = fetchData()\n    }\n}\n```\n\n### 4.2 State Management\n\n```kotlin\n\u002F\u002F Basic State\nvar count by remember { mutableStateOf(0) }\n\n\u002F\u002F Derived State (avoid redundant computation)\nval isEven by remember { derivedStateOf { count % 2 == 0 } }\n\n\u002F\u002F Persist across recomposition (e.g., scroll position)\nval scrollState = rememberScrollState()\n\n\u002F\u002F State in ViewModel\nclass MyViewModel : ViewModel() {\n    private val _uiState = MutableStateFlow(UiState())\n    val uiState: StateFlow\u003CUiState> = _uiState.asStateFlow()\n}\n```\n\n### 4.3 Common Compose Mistakes\n\n```kotlin\n\u002F\u002F ❌ Wrong: Creating objects in Composable (created on every recomposition)\n@Composable\nfun MyScreen() {\n    val viewModel = MyViewModel()  \u002F\u002F Wrong!\n}\n\n\u002F\u002F ✅ Correct: Use viewModel() or remember\n@Composable\nfun MyScreen(viewModel: MyViewModel = viewModel()) {\n    \u002F\u002F ...\n}\n```\n\n---\n\n## 5. Resources & Icons\n\n### 5.1 App Icon Requirements\n\nMust provide multi-resolution icons:\n\n| Directory | Size | Purpose |\n|-----------|------|---------|\n| mipmap-mdpi | 48x48 | Baseline |\n| mipmap-hdpi | 72x72 | 1.5x |\n| mipmap-xhdpi | 96x96 | 2x |\n| mipmap-xxhdpi | 144x144 | 3x |\n| mipmap-xxxhdpi | 192x192 | 4x |\n\nRecommended: Use Adaptive Icon (Android 8+):\n\n```xml\n\u003C!-- res\u002Fmipmap-anydpi-v26\u002Fic_launcher.xml -->\n\u003Cadaptive-icon>\n    \u003Cbackground android:drawable=\"@color\u002Fic_launcher_background\"\u002F>\n    \u003Cforeground android:drawable=\"@mipmap\u002Fic_launcher_foreground\"\u002F>\n\u003C\u002Fadaptive-icon>\n```\n\n### 5.2 Resource Naming Conventions\n\n| Type | Prefix | Example |\n|------|--------|---------|\n| Layout | layout_ | `layout_main.xml` |\n| Image | ic_, img_, bg_ | `ic_user.png` |\n| Color | color_ | `color_primary` |\n| String | - | `app_name`, `btn_submit` |\n\n### 5.3 Avoid Android Reserved Names (Important)\n\nVariable names, resource IDs, colors, icons, and XML elements **must not** use Android reserved words or system resource names. Using reserved names causes build errors or resource conflicts.\n\n**Common Reserved Names to Avoid**:\n\n| Category | Reserved Names (Do NOT Use) |\n|----------|----------------------------|\n| Colors | `background`, `foreground`, `transparent`, `white`, `black` |\n| Icons\u002FDrawables | `icon`, `logo`, `image`, `drawable` |\n| Views | `view`, `text`, `button`, `layout`, `container` |\n| Attributes | `id`, `name`, `type`, `style`, `theme`, `color` |\n| System | `app`, `android`, `content`, `data`, `action` |\n\n**Examples**:\n\n```xml\n\u003C!-- ❌ Wrong: Using reserved names -->\n\u003Ccolor name=\"background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon\">#000000\u003C\u002Fcolor>\n\n\u003C!-- ✅ Correct: Add prefix or specific naming -->\n\u003Ccolor name=\"app_background\">#FFFFFF\u003C\u002Fcolor>\n\u003Ccolor name=\"icon_primary\">#000000\u003C\u002Fcolor>\n```\n\n```kotlin\n\u002F\u002F ❌ Wrong: Variable names conflict with system\nval icon = R.drawable.my_icon\nval background = Color.White\n\n\u002F\u002F ✅ Correct: Use descriptive names\nval appIcon = R.drawable.my_icon\nval screenBackground = Color.White\n```\n\n```xml\n\u003C!-- ❌ Wrong: Drawable name conflicts -->\n\u003CImageView android:src=\"@drawable\u002Ficon\" \u002F>\n\n\u003C!-- ✅ Correct: Add prefix -->\n\u003CImageView android:src=\"@drawable\u002Fic_home\" \u002F>\n```\n\n---\n\n## 6. Build Error Diagnosis & Fixes\n\n### 6.1 Common Error Quick Reference\n\n| Error Keyword | Cause | Fix |\n|---------------|-------|-----|\n| `Unresolved reference` | Missing import or undefined | Check imports, verify dependencies |\n| `Type mismatch` | Type incompatibility | Check parameter types, add conversion |\n| `Cannot access` | Visibility issue | Check public\u002Fprivate\u002Finternal |\n| `@Composable invocations` | Composable context error | Ensure caller is also @Composable |\n| `Duplicate class` | Dependency conflict | Use `.\u002Fgradlew dependencies` to investigate |\n| `AAPT: error` | Resource file error | Check XML syntax and resource references |\n\n### 6.2 Fix Best Practices\n\n1. **Read the complete error message first**: Locate file and line number\n2. **Check recent changes**: Problems usually in latest modifications\n3. **Clean Build**: `.\u002Fgradlew clean assembleDebug`\n4. **Check dependency versions**: Version conflicts are common causes\n5. **Refresh dependencies if needed**: Clear cache and rebuild\n\n### 6.3 Debugging Commands\n\n```bash\n# Clean and build\n.\u002Fgradlew clean assembleDebug\n\n# View dependency tree (investigate conflicts)\n.\u002Fgradlew :app:dependencies\n\n# View detailed errors\n.\u002Fgradlew assembleDebug --stacktrace\n\n# Refresh dependencies\n.\u002Fgradlew --refresh-dependencies\n```\n\n---\n\n## 7. Material Design 3 Guidelines\n\nReview Android UI files for compliance with Material Design 3 Guidelines and Android best practices.\n\n### Design Philosophy\n\n#### M3 Core Principles\n\n| Principle | Description |\n|-----------|-------------|\n| **Personal** | Dynamic color based on user preferences and wallpaper |\n| **Adaptive** | Responsive across all screen sizes and form factors |\n| **Expressive** | Bold colors and typography with personality |\n| **Accessible** | Inclusive design for all users |\n\n#### M3 Expressive (Latest)\n\nThe latest evolution adds emotion-driven UX through:\n- Vibrant, dynamic colors\n- Intuitive motion physics\n- Adaptive components\n- Flexible typography\n- Contrasting shapes (35 new shape options)\n\n### App Style Selection\n\n**Critical Decision**: Match visual style to app category and target audience.\n\n| App Category | Visual Style | Key Characteristics |\n|--------------|--------------|---------------------|\n| Utility\u002FTool | Minimalist | Clean, efficient, neutral colors |\n| Finance\u002FBanking | Professional Trust | Conservative colors, security-focused |\n| Health\u002FWellness | Calm & Natural | Soft colors, organic shapes |\n| Kids (3-5) | Playful Simple | Bright colors, large targets (56dp+) |\n| Kids (6-12) | Fun & Engaging | Vibrant, gamified feedback |\n| Social\u002FEntertainment | Expressive | Brand-driven, gesture-rich |\n| Productivity | Clean & Focused | Minimal, high contrast |\n| E-commerce | Conversion-focused | Clear CTAs, scannable |\n\nSee [Design Style Guide](references\u002Fdesign-style-guide.md) for detailed style profiles.\n\n### Quick Reference: Key Specifications\n\n#### Color Contrast Requirements\n\n| Element | Minimum Ratio |\n|---------|---------------|\n| Body text | **4.5:1** |\n| Large text (18sp+) | **3:1** |\n| UI components | **3:1** |\n\n#### Touch Targets\n\n| Type | Size |\n|------|------|\n| Minimum | 48 × 48dp |\n| Recommended (primary actions) | 56 × 56dp |\n| Kids apps | 56dp+ |\n| Spacing between targets | 8dp minimum |\n\n#### 8dp Grid System\n\n| Token | Value | Usage |\n|-------|-------|-------|\n| xs | 4dp | Icon padding |\n| sm | 8dp | Tight spacing |\n| md | 16dp | Default padding |\n| lg | 24dp | Section spacing |\n| xl | 32dp | Large gaps |\n| xxl | 48dp | Screen margins |\n\n#### Typography Scale (Summary)\n\n| Category | Sizes |\n|----------|-------|\n| Display | 57sp, 45sp, 36sp |\n| Headline | 32sp, 28sp, 24sp |\n| Title | 22sp, 16sp, 14sp |\n| Body | 16sp, 14sp, 12sp |\n| Label | 14sp, 12sp, 11sp |\n\n#### Animation Duration\n\n| Type | Duration |\n|------|----------|\n| Micro (ripples) | 50-100ms |\n| Short (simple) | 100-200ms |\n| Medium (expand\u002Fcollapse) | 200-300ms |\n| Long (complex) | 300-500ms |\n\n#### Component Dimensions\n\n| Component | Height | Min Width |\n|-----------|--------|-----------|\n| Button | 40dp | 64dp |\n| FAB | 56dp | 56dp |\n| Text Field | 56dp | 280dp |\n| App Bar | 64dp | - |\n| Bottom Nav | 80dp | - |\n\n### Anti-Patterns (Must Avoid)\n\n#### UI Anti-Patterns\n- More than 5 bottom navigation items\n- Multiple FABs on same screen\n- Touch targets smaller than 48dp\n- Inconsistent spacing (non-8dp multiples)\n- Missing dark theme support\n- Text on colored backgrounds without contrast check\n\n#### Performance Anti-Patterns\n- Startup time > 2 seconds without progress indicator\n- Frame rate \u003C 60 FPS (> 16ms per frame)\n- Crash rate > 1.09% (Google Play threshold)\n- ANR rate > 0.47% (Google Play threshold)\n\n#### Accessibility Anti-Patterns\n- Missing contentDescription on interactive elements\n- Element type in labels (e.g., \"Save button\" instead of \"Save\")\n- Complex gestures in kids apps\n- Text-only buttons for non-readers\n\n### Review Checklist\n\n- [ ] 8dp spacing grid compliance\n- [ ] 48dp minimum touch targets\n- [ ] Proper typography scale usage\n- [ ] Color contrast compliance (4.5:1+ for text)\n- [ ] Dark theme support\n- [ ] contentDescription on all interactive elements\n- [ ] Startup \u003C 2 seconds or shows progress\n- [ ] Visual style matches app category\n\n### Design References\n\n| Topic | Reference |\n|-------|-----------|\n| Colors, Typography, Spacing, Shapes | [Visual Design](references\u002Fvisual-design.md) |\n| Animation & Transitions | [Motion System](references\u002Fmotion-system.md) |\n| Accessibility Guidelines | [Accessibility](references\u002Faccessibility.md) |\n| Large Screens & Foldables | [Adaptive Screens](references\u002Fadaptive-screens.md) |\n| Android Vitals & Performance | [Performance & Stability](references\u002Fperformance-stability.md) |\n| Privacy & Security | [Privacy & Security](references\u002Fprivacy-security.md) |\n| Audio, Video, Notifications | [Functional Requirements](references\u002Ffunctional-requirements.md) |\n| App Style by Category | [Design Style Guide](references\u002Fdesign-style-guide.md) |\n\n---\n\n## 8. Testing\n\n> **Note**: Only add test dependencies when the user explicitly asks for testing.\n\nA well-tested Android app uses layered testing: fast local unit tests for logic, instrumentation tests for UI and integration, and Gradle Managed Devices to run emulators reproducibly on any machine — including CI.\n\n### 8.1 Test Dependencies\n\nBefore adding test dependencies, inspect the project's existing versions to avoid conflicts:\n\n1. Check `gradle\u002Flibs.versions.toml` — if present, add test deps using the project's version catalog style\n2. Check existing `build.gradle.kts` for already-pinned dependency versions\n3. Match version families using the table below\n\n**Version Alignment Rules**:\n\n| Test Dependency                              | Must Align With                                  | How to Check                                                          |\n|----------------------------------------------|--------------------------------------------------|-----------------------------------------------------------------------|\n| `kotlinx-coroutines-test`                    | Project's `kotlinx-coroutines-core` version      | Search for `kotlinx-coroutines` in build files or version catalog     |\n| `compose-ui-test-junit4`                     | Project's Compose BOM or `compose-compiler`      | Search for `compose-bom` or `compose.compiler` in build files         |\n| `espresso-*`                                 | All Espresso artifacts must use the same version  | Search for `espresso` in build files                                  |\n| `androidx.test:runner`, `rules`, `ext:junit` | Should use compatible AndroidX Test versions      | Search for `androidx.test` in build files                             |\n| `mockk`                                      | Must support the project's Kotlin version         | Check `kotlin` version in root `build.gradle.kts` or version catalog |\n\n**Dependencies Reference** — add only the groups you need:\n\n```kotlin\ndependencies {\n    \u002F\u002F --- Local unit tests (src\u002Ftest\u002F) ---\n    testImplementation(\"junit:junit:\u003Cversion>\")                          \u002F\u002F 4.13.2+\n    testImplementation(\"org.robolectric:robolectric:\u003Cversion>\")          \u002F\u002F 4.16.1+\n    testImplementation(\"io.mockk:mockk:\u003Cversion>\")                      \u002F\u002F match Kotlin version\n    testImplementation(\"org.jetbrains.kotlinx:kotlinx-coroutines-test:\u003Cversion>\")  \u002F\u002F match coroutines-core\n    testImplementation(\"androidx.arch.core:core-testing:\u003Cversion>\")      \u002F\u002F InstantTaskExecutorRule for LiveData\n    testImplementation(\"app.cash.turbine:turbine:\u003Cversion>\")             \u002F\u002F Flow\u002FStateFlow testing\n\n    \u002F\u002F --- Instrumentation tests (src\u002FandroidTest\u002F) ---\n    androidTestImplementation(\"androidx.test.ext:junit:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:runner:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test:rules:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-core:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.espresso:espresso-contrib:\u003Cversion>\")   \u002F\u002F RecyclerView, Drawer\n    androidTestImplementation(\"androidx.test.espresso:espresso-intents:\u003Cversion>\")   \u002F\u002F Intent verification\n    androidTestImplementation(\"androidx.test.espresso:espresso-idling-resource:\u003Cversion>\")\n    androidTestImplementation(\"androidx.test.uiautomator:uiautomator:\u003Cversion>\")\n\n    \u002F\u002F --- Compose UI tests (only if project uses Compose) ---\n    androidTestImplementation(\"androidx.compose.ui:ui-test-junit4\")      \u002F\u002F version from Compose BOM\n    debugImplementation(\"androidx.compose.ui:ui-test-manifest\")          \u002F\u002F required for createComposeRule\n}\n```\n\n> **Note**: If the project uses a Compose BOM, `ui-test-junit4` and `ui-test-manifest` don't need explicit versions — the BOM manages them.\n\nEnable Robolectric resource support in the `android` block:\n\n```kotlin\nandroid {\n    testOptions {\n        unitTests.isIncludeAndroidResources = true  \u002F\u002F required for Robolectric\n    }\n}\n```\n\n### 8.2 Testing by Layer\n\n| Layer              | Location           | Runs On                 | Speed                | Use For                                          |\n|--------------------|--------------------|-------------------------|----------------------|--------------------------------------------------|\n| Unit (JUnit)       | `src\u002Ftest\u002F`        | JVM                     | ~ms                  | ViewModels, repos, mappers, validators           |\n| Unit + Robolectric | `src\u002Ftest\u002F`        | JVM + simulated Android | ~100ms               | Code needing Context, resources, SharedPrefs     |\n| Compose UI (local) | `src\u002Ftest\u002F`        | JVM + Robolectric       | ~100ms               | Composable rendering & interaction               |\n| Espresso           | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | View-based UI flows, Intents, DB integration     |\n| Compose UI (device)| `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | Full Compose UI flows with real rendering        |\n| UI Automator       | `src\u002FandroidTest\u002F` | Device\u002FEmulator         | ~seconds             | System dialogs, notifications, multi-app         |\n| Managed Device     | `src\u002FandroidTest\u002F` | Gradle-managed AVD      | ~minutes (first run) | CI, matrix testing across API levels             |\n\nSee [Testing](references\u002Ftesting.md) for detailed examples, code patterns, and Gradle Managed Device configuration.\n\n### 8.3 Testing Commands\n\n```bash\n# Local unit tests (fast, no emulator)\n.\u002Fgradlew test                          # all modules\n.\u002Fgradlew :app:testDebugUnitTest        # app module, debug variant\n\n# Single test class\n.\u002Fgradlew :app:testDebugUnitTest --tests \"com.example.myapp.CounterViewModelTest\"\n\n# Instrumentation tests (requires device or managed device)\n.\u002Fgradlew connectedDebugAndroidTest     # on connected device\n.\u002Fgradlew pixel6Api34DebugAndroidTest   # on managed device\n\n# Both together\n.\u002Fgradlew test connectedDebugAndroidTest\n\n# Test with coverage report (JaCoCo)\n.\u002Fgradlew testDebugUnitTest jacocoTestReport\n```\n",{"name":5,"license":15,"metadata":60,"description":7,"description_en":67,"description_zh":68},{"sources":61,"version":66,"category":43},[62,63,64,65],"Material Design 3 Guidelines (material.io)","Android Developer Documentation (developer.android.com)","Google Play Quality Guidelines","WCAG Accessibility Guidelines","1.0.0","Android native development guide (Material Design 3, Kotlin\u002FCompose)","Android 原生应用开发指南","main","469e430d8b1f61ccc1bf502e5448161944831c41","skills-marketplace\u002Fskills\u002Fandroid-native-dev",4,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy","https:\u002F\u002Fgithub.com\u002Fzhizhunbao","2026-04-01 01:41:45",{"source":8,"skillName":5,"commands":77,"prompt":87,"zipAvailable":88},[78,81,84],{"tool":79,"command":80},"npx","npx skills add zhizhunbao\u002Fworkbuddy --skill android-native-dev",{"tool":82,"command":83},"bunx","bunx skills add zhizhunbao\u002Fworkbuddy --skill android-native-dev",{"tool":85,"command":86},"pnpm","pnpm dlx skills add zhizhunbao\u002Fworkbuddy --skill android-native-dev","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002FSKILL.md",true,[90,96,100,104,108,112,116,120,124],{"path":91,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":94,"sourceHtmlUrl":95},"references\u002Faccessibility.md","REFERENCE","参考文档",5732,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Faccessibility.md",{"path":97,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fadaptive-screens.md",6098,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fadaptive-screens.md",{"path":101,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Fdesign-style-guide.md",10126,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fdesign-style-guide.md",{"path":105,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":106,"sourceHtmlUrl":107},"references\u002Ffunctional-requirements.md",6175,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Ffunctional-requirements.md",{"path":109,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":110,"sourceHtmlUrl":111},"references\u002Fmotion-system.md",5443,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fmotion-system.md",{"path":113,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":114,"sourceHtmlUrl":115},"references\u002Fperformance-stability.md",6334,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fperformance-stability.md",{"path":117,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":118,"sourceHtmlUrl":119},"references\u002Fprivacy-security.md",6667,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fprivacy-security.md",{"path":121,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":122,"sourceHtmlUrl":123},"references\u002Ftesting.md",17568,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Ftesting.md",{"path":125,"resourceType":92,"resourceTypeDesc":93,"sizeBytes":126,"sourceHtmlUrl":127},"references\u002Fvisual-design.md",7523,"https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fandroid-native-dev\u002Freferences\u002Fvisual-design.md",[129,158,184,212,244,270],{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":55},"01M6KBS51KPHYV6GXA7KEH7MMX","skill-scanner","Scan any agent skill for security risks before you install or use it. Powered by Tencent Zhuque Lab A.I.G (AI-Infra-Guard). 100% local static analysis — no file contents or credentials leave your device. Compatible with CodeBuddy, Cursor, Windsurf, Claude Code, OpenClaw and more. Triggers on: 这个 skill 安全吗, skill 安全扫描, 检查 skill 安全, audit skill, scan skill, check skill safety, analyze skill, inspect skill, verify skill, skill security, skill supply chain. Do NOT trigger for general agent usage, full system health checks, project debugging, or normal development.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fskill-scanner\u002FSKILL.md",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[139,140,141,142,143,144,145,146,147,148,149,150,42,151,152,153,154,155,156,157],"skill scanner","scanner","security scanner","debugging","code","analysis","credentials","vulnerability","analyze","only","windsurf","local","chain","skill audit","tencent","you","inspect","static","skill security",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":164,"publishedAt":55},"01M6KBRQP7C41T5SQ72SJXZWP6","shader-dev","Comprehensive GLSL shader techniques for creating stunning visual effects — ray marching, SDF modeling, fluid simulation, particle systems, procedural generation, lighting, post-processing, and more.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fshader-dev\u002FSKILL.md",[],[37,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183],"shader","shader dev","graphics","fluid","Ray","simulation","lighting","visual","generation","modeling","post","processing","GLSL","procedural","post-processing","more","techniques","for","effects",{"skillNo":185,"name":186,"nameZh":6,"description":187,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":188,"categories":189,"keywords":194,"publishedAt":55},"01M6KBRAQBPFT9HRKNPCC7EJZP","react-native-dev","React Native and Expo development guide covering components, styling, animations, navigation,\nstate management, forms, networking, performance optimization, testing, native capabilities,\nand engineering (project structure, deployment, SDK upgrades, CI\u002FCD).\nUse when: building React Native or Expo apps, implementing animations or native UI, managing\nstate, fetching data, writing tests, optimizing performance, deploying to App Store\u002FPlay Store,\nsetting up CI\u002FCD, upgrading Expo SDK, or configuring Tailwind\u002FNativeWind.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Freact-native-dev\u002FSKILL.md",[190,191],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":192,"categoryName":193,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[195,37,196,38,197,198,199,200,201,202,203,204,205,206,207,42,208,209,210,211],"react","react native","react native dev","testing","writing","performance","components","documentation","capabilities","ci","Tailwind","up","structure","app","apps","implementing","app store",{"skillNo":213,"name":214,"nameZh":6,"description":215,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":216,"categories":217,"keywords":224,"publishedAt":55},"01M6KBQM1S3B60WHYE0JN5ZFGB","pptx-generator","Generate, edit, and read PowerPoint presentations. Create from scratch with PptxGenJS (cover, TOC, content, section divider, summary slides), edit existing PPTX via XML workflows, or extract text with markitdown. Triggers: PPT, PPTX, PowerPoint, presentation, slide, deck, slides.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fpptx-generator\u002FSKILL.md",[218,221],{"categoryNo":219,"categoryName":220,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":222,"categoryName":223,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000034","行政与办公人员",[225,226,227,228,229,230,231,232,233,234,235,236,39,237,238,239,240,241,242,243],"pptx","generator","pptx generator","workflows","presentations","powerpoint","create","generate","slides","生成","text","演示","edit","toc","deck","triggers","io","presentation","cover",{"skillNo":245,"name":246,"nameZh":6,"description":247,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":248,"categories":249,"keywords":254,"publishedAt":55},"01M6KBP6H9EGBC7P4N0ZF2NPDZ","minimax-xlsx","Open, create, read, analyze, edit, or validate Excel\u002Fspreadsheet files (.xlsx, .xlsm, .csv, .tsv). Use when the user asks to create, build, modify, analyze, read, validate, or format any Excel spreadsheet, financial model, pivot table, or tabular data file. Covers: creating new xlsx from scratch, reading and analyzing existing files, editing existing xlsx with zero format loss, formula recalculation and validation, and applying professional financial formatting standards. Triggers on 'spreadsheet', 'Excel', '.xlsx', '.csv', 'pivot table', 'financial model', 'formula', or any request to produce tabular data in Excel format.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fminimax-xlsx\u002FSKILL.md",[250,253],{"categoryNo":251,"categoryName":252,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000004","电子表格",{"categoryNo":222,"categoryName":223,"taxonomyType":29,"taxonomyTypeDesc":30},[255,256,257,202,258,231,259,260,261,262,147,263,39,237,264,265,266,267,268,269],"xlsx","minimax","minimax xlsx","spreadsheets","analyzing","data","spreadsheet","open","model","files","formula","excel spreadsheets","professional","reading","request",{"skillNo":271,"name":272,"nameZh":6,"description":273,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":274,"categories":275,"keywords":281,"publishedAt":55},"01M6KBP08N725KPCCF3BWRV47Y","minimax-pdf","Use this skill when visual quality and design identity matter for a PDF. CREATE (generate from scratch): \"make a PDF\", \"generate a report\", \"write a proposal\", \"create a resume\", \"beautiful PDF\", \"professional document\", \"cover page\", \"polished PDF\", \"client-ready document\". FILL (complete form fields): \"fill in the form\", \"fill out this PDF\", \"complete the form fields\", \"write values into PDF\", \"what fields does this PDF have\". REFORMAT (apply design to an existing doc): \"reformat this document\", \"apply our style\", \"convert this Markdown\u002Ftext to PDF\", \"make this doc look good\", \"re-style this PDF\". This skill uses a token-based design system: color, typography, and spacing are derived from the document type and flow through every page. The output is print-ready. Prefer this skill when appearance matters, not just when any PDF output is needed.","https:\u002F\u002Fgithub.com\u002Fzhizhunbao\u002Fworkbuddy\u002Fblob\u002Fmain\u002Fskills-marketplace\u002Fskills\u002Fminimax-pdf\u002FSKILL.md",[276,279,280],{"categoryNo":277,"categoryName":278,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},[282,256,283,47,284,231,232,285,286,287,235,288,289,290,291,292,267,293,294,295],"PDF","minimax pdf","documents","flow","doc","markdown","write","good","ready","token","proposal","re","spacing","document-generation"]