You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Proto DataStore时如何导入Proto定义?导入枚举遇错求助

解决Proto DataStore枚举导入失败的问题

问题根源

你的枚举文件位于spc/main/proto目录,而导入它的location_preferences.proto在src/main/proto目录。Protobuf编译器默认仅识别src/main/proto作为源目录,无法跨目录找到枚举文件;同时Protobuf禁止在导入路径中使用.或..这类相对路径标识,这就是报错的核心原因。

修复步骤

1. 配置Gradle的Proto源目录

在模块级build.gradle.kts(或build.gradle)中,将spc/main/proto添加为额外的Proto源目录,让编译器能识别该目录下的.proto文件:

Kotlin DSL配置示例:

plugins {
    id("com.android.application")
    id("kotlin-android")
    id("com.google.protobuf")
}

android {
    // 保留原有Android配置
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.25.3" // 使用项目匹配的版本
    }
    generateProtoTasks {
        all().forEach { task ->
            task.builtins {
                register("java") {
                    option("lite")
                }
            }
        }
    }
    // 添加额外Proto源目录
    sourceSets {
        main {
            proto {
                srcDir("spc/main/proto")
            }
        }
    }
}

Groovy DSL配置示例:

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'com.google.protobuf'
}

android {
    // 保留原有Android配置
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.25.3' // 使用项目匹配的版本
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                java {
                    option 'lite'
                }
            }
        }
    }
    // 添加额外Proto源目录
    sourceSets {
        main {
            proto {
                srcDir 'spc/main/proto'
            }
        }
    }
}

2. 修正导入语句

配置完源目录后,直接使用枚举文件的根路径导入即可(无需相对路径):

import "battery_saver_mode_enum.proto";

如果枚举文件在子目录中,比如spc/main/proto/enums/battery_saver_mode_enum.proto,则导入路径改为import "enums/battery_saver_mode_enum.proto"

3. 规范字段命名(可选)

你的LocationPreferences消息中字段名与枚举名重复,虽不影响编译,但不符合Protobuf命名规范,建议修改为:

message LocationPreferences {
  bool isLocationSharingEnabled = 1;
  BatterySaverMode battery_saver_mode = 2; // 改为小写下划线命名
}

4. 同步Gradle并重新编译

点击Android Studio右上角的「Sync Project with Gradle Files」按钮,同步完成后重新编译项目,导入错误即可消除。

额外说明

  • 无需移动任何.proto文件,保持现有目录结构即可,只要在Gradle中配置好所有Proto源目录,编译器就能正确识别跨目录文件。
  • 确保两个.proto文件的java_package一致(你的代码已满足),避免生成的Java类出现包路径不一致的问题。

内容的提问来源于stack exchange,提问作者FreePhoenix888

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 10:50:47