Skip to content

Commit 1d32eeb

Browse files
authored
Merge pull request #16 from Coding-Meet/release/v1.4.0
Release/v1.4.0
2 parents c8c6c23 + dd3a991 commit 1d32eeb

102 files changed

Lines changed: 1602 additions & 1112 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎README.md‎

Lines changed: 78 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<p align="center">
22
<picture>
3-
<source media="(prefers-color-scheme: dark)" srcset="screenshot/dark_mode_logo_background_transparent.svg" />
4-
<img alt="DevAnalyzer" src="screenshot/light_mode_logo_background_transparent.svg" width="200" />
3+
<source media="(prefers-color-scheme: dark)" srcset="docs/screenshot/dark_mode_logo_background_transparent.svg" />
4+
<img alt="DevAnalyzer" src="docs/screenshot/light_mode_logo_background_transparent.svg" width="200" />
55
</picture>
66
</p>
77

@@ -21,121 +21,131 @@ DevAnalyzer is a cross-platform desktop application built with Compose Multiplat
2121

2222
## Overview
2323

24-
* **Project Analyzer**: Analyze modules, Gradle configurations, plugins, dependencies, and project metadata in a single view.
25-
* **Clean Build**: Scan projects for build folders across all modules and safely delete them to reclaim space.
26-
* **Workspace Analyzer**: Scan multiple workspaces to detect actively used Android SDKs, NDKs, CMake versions, and Gradle wrappers, highlighting what can be safely removed.
27-
* **Storage Analyzer**: View storage consumed by Android SDKs, Gradle caches, IDE caches, Kotlin/Native, and AVDs.
28-
* **Settings**: Configure custom toolchain paths and manage privacy options.
24+
- **Project Analyzer**: Analyze modules, Gradle configurations, plugins, dependencies, and project metadata in a single view.
25+
- **Clean Build**: Scan projects for build folders across all modules and safely delete them to reclaim space.
26+
- **Workspace Analyzer**: Scan multiple workspaces to detect actively used Android SDKs, NDKs, CMake versions, and Gradle wrappers, highlighting what can be safely removed.
27+
- **Storage Analyzer**: View storage consumed by Android SDKs, Gradle caches, IDE caches, Kotlin/Native, and AVDs.
28+
- **Settings**: Configure custom toolchain paths and manage privacy options.
2929

3030
---
3131

3232
## Features
3333

3434
### Project Analyzer
35-
* Analyze Gradle modules, plugins, and dependencies.
36-
* List applied plugins and Version Catalog libraries.
37-
* Browse Gradle build files and project configuration scripts directly inside the app.
38-
* Inspect project metadata including:
39-
* Kotlin Version
40-
* Android Gradle Plugin (AGP)
41-
* Gradle Version
42-
* Compile, Target, and Min SDKs
43-
* NDK and CMake versions
35+
36+
- Analyze Gradle modules, plugins, and dependencies.
37+
- List applied plugins and Version Catalog libraries.
38+
- Browse Gradle build files and project configuration scripts directly inside the app.
39+
- Inspect project metadata including:
40+
- Kotlin Version
41+
- Android Gradle Plugin (AGP)
42+
- Gradle Version
43+
- Compile, Target, and Min SDKs
44+
- NDK and CMake versions
4445

4546
### Clean Build
46-
* Scan Android Studio projects for module build folders.
47-
* Display expandable project and module layout.
48-
* Compute folder sizes in real-time.
49-
* Perform batch deletion of selected build folders with a safety confirmation dialog.
50-
* View space recovery summaries after cleaning.
47+
48+
- Scan Android Studio projects for module build folders.
49+
- Display expandable project and module layout.
50+
- Compute folder sizes in real-time.
51+
- Perform batch deletion of selected build folders with a safety confirmation dialog.
52+
- View space recovery summaries after cleaning.
5153

5254
### Workspace Analyzer
53-
* Analyze multiple workspace directories simultaneously.
54-
* Cross-reference installed SDK tools, NDKs, CMake versions, and Gradle caches against all projects.
55-
* Automatically protect active versions referenced by existing projects.
56-
* Detect unused resources:
57-
* Android SDK Platforms
58-
* SDK Build Tools
59-
* SDK Sources
60-
* NDK & CMake Versions
61-
* Gradle Wrapper Caches
62-
* Kotlin/Native Prebuilts
55+
56+
- Analyze multiple workspace directories simultaneously.
57+
- Cross-reference installed SDK tools, NDKs, CMake versions, and Gradle caches against all projects.
58+
- Automatically protect active versions referenced by existing projects.
59+
- Detect unused resources:
60+
- Android SDK Platforms
61+
- SDK Build Tools
62+
- SDK Sources
63+
- NDK & CMake Versions
64+
- Gradle Wrapper Caches
65+
- Kotlin/Native Prebuilts
6366

6467
### Storage Analyzer
65-
* View storage allocations across:
66-
* Android SDK
67-
* Gradle Caches
68-
* Kotlin/Native
69-
* JDK
70-
* Android Virtual Devices (AVD)
71-
* IDE Caches and configuration folders
72-
* Track real-time scan progress with elapsed timers.
73-
* Support custom, non-standard JDK and IDE locations.
68+
69+
- View storage allocations across:
70+
- Android SDK
71+
- Gradle Caches
72+
- Kotlin/Native
73+
- JDK
74+
- Android Virtual Devices (AVD)
75+
- IDE Caches and configuration folders
76+
- Track real-time scan progress with elapsed timers.
77+
- Support custom, non-standard JDK and IDE locations.
7478

7579
### Settings
76-
* Custom paths configuration (SDK, Gradle Home, Kotlin Native, JDK, Android Studio, IntelliJ).
77-
* Automatic path validation with quick-reset options.
78-
* Toggle local crash logging, crash reporting, and usage analytics.
80+
81+
- Custom paths configuration (SDK, Gradle Home, Kotlin Native, JDK, Android Studio, IntelliJ).
82+
- Automatic path validation with one-click reset options.
83+
- Toggle local crash logging, crash reporting, and usage analytics.
7984

8085
---
8186

8287
## Privacy & Analytics
8388

8489
Privacy is a core design principle of DevAnalyzer:
85-
* **Local Processing**: All analysis runs locally. Your code, project names, and file paths are never uploaded.
86-
* **Optional Analytics**: You can opt in or out of anonymous analytics at any time.
87-
* **Zero PII**: No email addresses, personal details, or sensitive metadata are tracked.
88-
* **SDK Configuration**: We configure the analytics client to keep all metrics completely anonymous. Since we never call identification methods, all users remain completely anonymous.
90+
91+
- **Local Processing**: All analysis runs locally. Your code, project names, and file paths are never uploaded.
92+
- **Optional Analytics**: You can opt in or out of anonymous analytics at any time.
93+
- **Zero PII**: No email addresses, personal details, or sensitive metadata are tracked.
94+
- **SDK Configuration**: Analytics are configured to remain completely anonymous.
8995

9096
---
9197

9298
## Feedback & Updates
9399

94-
* **In-App Feedback**: Rate the app, suggest features, and report issues using the built-in feedback dialog.
95-
* **Update Verification**: Silently checks for new GitHub releases on startup and displays release notes inside the app.
100+
- **In-App Feedback**: Rate the app, suggest features, and report issues using the built-in feedback dialog.
101+
- **Update Verification**: Silently checks for new GitHub releases on startup and displays release notes inside the app.
96102

97103
---
98104

99105
## Tech Stack
100106

101-
| Category | Libraries & Tools |
102-
|---|---|
103-
| **Framework** | Compose Multiplatform |
104-
| **Language** | Kotlin 2.x (Multiplatform) |
105-
| **Design System** | Material 3 with Adaptive Navigation Suite |
106-
| **Dependency Injection** | Koin |
107-
| **Network** | Ktor |
108-
| **Navigation** | Jetpack Navigation for Compose |
109-
| **Image Loading** | Coil3 |
110-
| **Local Storage** | DataStore (Core + Preferences) |
111-
| **File Handling** | FileKit |
112-
| **Semantic Versioning** | SemVer |
113-
| **Analytics** | PostHog JVM (Anonymous Analytics) |
114-
| **Crash Reporting** | Sentry JVM (Optional) |
107+
| Category | Libraries & Tools |
108+
| ------------------------ |-------------------------------------------|
109+
| **Framework** | Compose Multiplatform |
110+
| **Language** | Kotlin 2.x (Multiplatform) |
111+
| **Design System** | Material 3 with Adaptive Navigation Suite |
112+
| **Dependency Injection** | Koin |
113+
| **Network** | Ktor |
114+
| **Navigation** | Jetpack Navigation 2 |
115+
| **Image Loading** | Coil3 |
116+
| **Local Storage** | DataStore (Core + Preferences) |
117+
| **File Handling** | FileKit |
118+
| **Semantic Versioning** | SemVer |
119+
| **Analytics** | PostHog JVM (Anonymous Analytics) |
120+
| **Crash Reporting** | Sentry JVM (Optional) |
115121

116122
---
117123

118124
## How to Run
119125

120126
### Run from Source
127+
121128
If you want to build and run the app from source:
122129

123130
**macOS / Linux**
131+
124132
```shell
125133
./gradlew :composeApp:run
126134
```
127135

128136
**Windows**
137+
129138
```shell
130139
.\gradlew.bat :composeApp:run
131140
```
132141

133142
### Installation Packages
134-
Download the latest binaries from the [Releases](https://github.com/Coding-Meet/DevAnalyzer/releases) page.
135143

136-
* **Windows**: Download the `.msi` installer.
137-
* **macOS**: Download the `.dmg` file. (If blocked by security settings, go to **System Settings → Privacy & Security → Allow Anyway** to run).
138-
* **Linux**: Install the `.deb` package using:
144+
Download the latest release from the [Releases](https://github.com/Coding-Meet/DevAnalyzer/releases) page.
145+
146+
- **Windows**: Download the `.msi` installer.
147+
- **macOS**: Download the `.dmg` file. (If blocked by security settings, go to **System Settings → Privacy & Security → Allow Anyway** to run).
148+
- **Linux**: Install the `.deb` package using:
139149
```shell
140150
sudo dpkg -i devanalyzer_1.0.0-1_amd64.deb
141151
```
@@ -150,4 +160,4 @@ If this project helped you, please give it a star! ⭐
150160
<img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" width="160">
151161
</a>
152162

153-
Your support is greatly appreciated.
163+
Your support is greatly appreciated.

‎build.gradle.kts‎

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
plugins {
2-
// Kotlin plugins - For multiplatform and serialization
3-
alias(libs.plugins.kotlinMultiplatform) apply false // Kotlin Multiplatform plugin
4-
alias(libs.plugins.kotlinSerialization) apply false // Kotlinx Serialization plugin
5-
6-
// Compose plugins - For UI framework
7-
alias(libs.plugins.composeMultiplatform) apply false // Compose Multiplatform plugin
8-
alias(libs.plugins.composeCompiler) apply false // Compose Compiler plugin
9-
alias(libs.plugins.composeHotReload) apply false // Hot reload for development
2+
// this is necessary to avoid the plugins to be loaded multiple times
3+
// in each subproject's classloader
4+
alias(libs.plugins.kotlinMultiplatform) apply false
5+
alias(libs.plugins.kotlinSerialization) apply false
6+
alias(libs.plugins.composeMultiplatform) apply false
7+
alias(libs.plugins.composeCompiler) apply false
8+
alias(libs.plugins.composeHotReload) apply false
109
}

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/datastore/AppPreferenceManager.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class AppPreferenceManager(private val dataStore: DataStore<Preferences>) {
2929
val DARK_MODE_KEY = booleanPreferencesKey("dark_mode")
3030
val ONBOARDING_DONE_KEY = booleanPreferencesKey("onboarding_done")
3131
val WINDOW_WIDTH_KEY = floatPreferencesKey("window_width")
32-
val WINDOW_HEIGHT_KEY = floatPreferencesKey("window_height")
32+
val WINDOW_HEIGHT_KEY = floatPreferencesKey("window_height")
3333
val WINDOW_POSITION_X_KEY = floatPreferencesKey("window_position_x")
3434
val WINDOW_POSITION_Y_KEY = floatPreferencesKey("window_position_y")
3535
val CRASH_REPORTING_ENABLED = booleanPreferencesKey("crash_reporting_enabled")

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/models/updater/GitHubRelease.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.meet.dev.analyzer.data.models.updater
22

3-
import kotlinx.serialization.Serializable
43
import kotlinx.serialization.SerialName
4+
import kotlinx.serialization.Serializable
55

66
@Serializable
77
data class GitHubRelease(

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/cleanbuild/CleanBuildRepositoryImpl.kt‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import com.meet.dev.analyzer.utility.platform.FolderFileUtils.formatSize
1010
import kotlinx.coroutines.Dispatchers
1111
import kotlinx.coroutines.withContext
1212
import java.io.File
13-
import kotlin.random.Random
1413

1514
class CleanBuildRepositoryImpl : CleanBuildRepository {
1615

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/feedback/FeedbackRepositoryImpl.kt‎

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,36 @@ class FeedbackRepositoryImpl(
1313
private val appConfig: DesktopConfig,
1414
) : FeedbackRepository {
1515

16-
override suspend fun submitFeedback(feedback: FeedbackData): Result<Unit> = withContext(Dispatchers.IO) {
17-
val client = HttpClient(CIO)
18-
try {
19-
val response = client.submitForm(
20-
url = appConfig.feedbackUrl,
21-
formParameters = Parameters.build {
22-
append("entry.1761072179", feedback.rating.toString())
23-
append("entry.1087708121", feedback.name)
24-
append("entry.1559444738", feedback.likesAndImprovements)
25-
26-
feedback.mostUsedFeatures.forEach { feature ->
27-
append("entry.1144468351", feature)
16+
override suspend fun submitFeedback(feedback: FeedbackData): Result<Unit> =
17+
withContext(Dispatchers.IO) {
18+
val client = HttpClient(CIO)
19+
try {
20+
val response = client.submitForm(
21+
url = appConfig.feedbackUrl,
22+
formParameters = Parameters.build {
23+
append("entry.1761072179", feedback.rating.toString())
24+
append("entry.1087708121", feedback.name)
25+
append("entry.1559444738", feedback.likesAndImprovements)
26+
27+
feedback.mostUsedFeatures.forEach { feature ->
28+
append("entry.1144468351", feature)
29+
}
30+
31+
append("entry.929779127", feedback.futureFeatures)
32+
append("entry.1500692418", feedback.systemInfo)
33+
append("entry.1169610342", feedback.email)
2834
}
29-
30-
append("entry.929779127", feedback.futureFeatures)
31-
append("entry.1500692418", feedback.systemInfo)
32-
append("entry.1169610342", feedback.email)
35+
)
36+
37+
if (response.status.value in 200..299) {
38+
Result.success(Unit)
39+
} else {
40+
Result.failure(Exception("HTTP Error: ${response.status.value}"))
3341
}
34-
)
35-
36-
if (response.status.value in 200..299) {
37-
Result.success(Unit)
38-
} else {
39-
Result.failure(Exception("HTTP Error: ${response.status.value}"))
42+
} catch (e: Exception) {
43+
Result.failure(e)
44+
} finally {
45+
client.close()
4046
}
41-
} catch (e: Exception) {
42-
Result.failure(e)
43-
} finally {
44-
client.close()
4547
}
46-
}
4748
}

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/project/ProjectAnalyzerRepositoryImpl.kt‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.meet.dev.analyzer.data.repository.project
22

3-
import com.meet.dev.analyzer.data.datastore.PathPreferenceManger
43
import com.meet.dev.analyzer.data.models.project.ProjectInfo
54
import com.meet.dev.analyzer.data.repository.project.helpers.DependencyAnalyzer
65
import com.meet.dev.analyzer.data.repository.project.helpers.PluginAnalyzer

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/project/helpers/DependencyAnalyzer.kt‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
package com.meet.dev.analyzer.data.repository.project.helpers
22

3-
import com.meet.dev.analyzer.data.models.project.*
3+
import com.meet.dev.analyzer.data.models.project.Dependency
4+
import com.meet.dev.analyzer.data.models.project.ModuleBuildFileInfo
5+
import com.meet.dev.analyzer.data.models.project.Plugin
6+
import com.meet.dev.analyzer.data.models.project.VersionCatalog
47
import com.meet.dev.analyzer.data.models.storage.GradleLibraryInfo
58
import com.meet.dev.analyzer.data.models.storage.GradleModulesInfo
69
import com.meet.dev.analyzer.utility.crash_report.AppLogger
710
import com.meet.dev.analyzer.utility.crash_report.AppLogger.tagName
811

912
class DependencyAnalyzer {
1013
private val tag = tagName(javaClass = javaClass)
11-
14+
1215
fun addDependencyEachModule(
1316
moduleBuildFileInfos: List<ModuleBuildFileInfo>,
1417
plugins: List<Plugin>,

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/project/helpers/PluginAnalyzer.kt‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.meet.dev.analyzer.data.repository.project.helpers
22

3-
import com.meet.dev.analyzer.data.models.project.*
3+
import com.meet.dev.analyzer.data.models.project.ModuleBuildFileInfo
4+
import com.meet.dev.analyzer.data.models.project.Plugin
5+
import com.meet.dev.analyzer.data.models.project.VersionCatalog
46
import com.meet.dev.analyzer.data.models.storage.GradleLibraryInfo
57
import com.meet.dev.analyzer.data.models.storage.GradleModulesInfo
68
import com.meet.dev.analyzer.utility.crash_report.AppLogger

‎composeApp/src/jvmMain/kotlin/com/meet/dev/analyzer/data/repository/project/helpers/ProjectFileScanner.kt‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
package com.meet.dev.analyzer.data.repository.project.helpers
22

3-
import com.meet.dev.analyzer.data.models.project.*
3+
import com.meet.dev.analyzer.data.models.project.BuildFileType
4+
import com.meet.dev.analyzer.data.models.project.FileType
5+
import com.meet.dev.analyzer.data.models.project.GradleWrapperPropertiesFileInfo
6+
import com.meet.dev.analyzer.data.models.project.ModuleBuildFileInfo
7+
import com.meet.dev.analyzer.data.models.project.ProjectFileInfo
8+
import com.meet.dev.analyzer.data.models.project.PropertiesFileInfo
9+
import com.meet.dev.analyzer.data.models.project.PropertiesFileType
10+
import com.meet.dev.analyzer.data.models.project.SettingsGradleFileInfo
11+
import com.meet.dev.analyzer.data.models.project.SettingsGradleFileType
12+
import com.meet.dev.analyzer.data.models.project.VersionCatalogFileInfo
413
import com.meet.dev.analyzer.utility.crash_report.AppLogger
514
import com.meet.dev.analyzer.utility.crash_report.AppLogger.tagName
615
import com.meet.dev.analyzer.utility.platform.FolderFileUtils

0 commit comments

Comments
 (0)