diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 195558cad..3f64a7f51 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -13,41 +13,50 @@ allprojects { lockAllConfigurations() } } + +val projectDependencyEdges = allprojects.flatMap { project -> + project.configurations.flatMap { configuration -> + configuration.dependencies.withType().map { dependency -> + Triple(project.path, configuration.name, dependency.path) + } + } +} + tasks.register("verifyArchitecture") { doLast { - rootProject.allprojects.forEach { project -> - project.configurations.forEach { configuration -> - configuration.dependencies.withType().forEach { dependency -> - val target = dependency.path - when { - project.path.startsWith(":core") && (target.startsWith(":feature") || target.startsWith(":apps")) -> error("Forbidden dependency: ${project.path} -> $target") - project.path.startsWith(":processing") && (target.startsWith(":feature") || target.startsWith(":apps")) -> error("Forbidden dependency: ${project.path} -> $target") - project.path.startsWith(":feature") && target.startsWith(":feature") && target != project.path -> error("Feature-to-feature dependency: ${project.path} -> $target") - } - } + projectDependencyEdges.forEach { (projectPath, _, target) -> + when { + projectPath.startsWith(":core") && (target.startsWith(":feature") || target.startsWith(":apps")) -> error("Forbidden dependency: $projectPath -> $target") + projectPath.startsWith(":processing") && (target.startsWith(":feature") || target.startsWith(":apps")) -> error("Forbidden dependency: $projectPath -> $target") + projectPath.startsWith(":feature") && target.startsWith(":feature") && target != projectPath -> error("Feature-to-feature dependency: $projectPath -> $target") } } } } + +val manifestFiles = fileTree(rootDir) { include("**/src/main/AndroidManifest.xml") }.files.toList() +val manifestContents = manifestFiles.associateWith { it.readText() } +val gradlePolicyFiles = fileTree(rootDir) { + include("**/*.gradle.kts") + include("**/*.toml") + exclude("build.gradle.kts") +}.files.toList() +val gradlePolicyContents = gradlePolicyFiles.associateWith { it.readText() } + tasks.register("verifyAndroidPrivacy") { doLast { - fileTree(rootDir) { include("**/src/main/AndroidManifest.xml") }.forEach { manifest -> - val text = manifest.readText() + manifestContents.forEach { (manifest, text) -> check(!text.contains("android.permission.INTERNET")) { "INTERNET permission found in $manifest" } check(!text.contains("MANAGE_EXTERNAL_STORAGE")) { "Broad storage permission found in $manifest" } check(!text.contains("READ_EXTERNAL_STORAGE")) { "Legacy storage permission found in $manifest" } check(!text.contains("WRITE_EXTERNAL_STORAGE")) { "Legacy storage permission found in $manifest" } } - val appManifest = file("apps/documents/src/main/AndroidManifest.xml").readText() + val appManifest = manifestContents.getValue(file("apps/documents/src/main/AndroidManifest.xml")) check(appManifest.contains("android:allowBackup=\"false\"")) { "Document backup must be disabled" } check(appManifest.contains("androidx.core.content.FileProvider")) { "Secure FileProvider is required" } check(appManifest.contains("android:exported=\"false\"")) { "FileProvider must not be exported" } - fileTree(rootDir) { - include("**/*.gradle.kts") - include("**/*.toml") - exclude("build.gradle.kts") - }.forEach { file -> - check(!file.readText().contains("jitpack.io")) { "JitPack found in $file" } + gradlePolicyContents.forEach { (file, text) -> + check(!text.contains("jitpack.io")) { "JitPack found in $file" } } } } diff --git a/android/gradle.properties b/android/gradle.properties index d298e4b1f..9b9e735f6 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,6 +1,5 @@ org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8 org.gradle.caching=true -org.gradle.configuration-cache=true android.useAndroidX=true android.nonTransitiveRClass=true kotlin.code.style=official diff --git a/android/gradle/verification-metadata.xml b/android/gradle/verification-metadata.xml index cbb7a20ec..81323a207 100644 --- a/android/gradle/verification-metadata.xml +++ b/android/gradle/verification-metadata.xml @@ -1072,6 +1072,9 @@ + + + @@ -3294,6 +3297,11 @@ + + + + +