104 lines
3.7 KiB
Markdown
104 lines
3.7 KiB
Markdown
|
|
# LibCore ExtensionData Fix - v1.7.0
|
|||
|
|
|
|||
|
|
## Проблема
|
|||
|
|
В оригинальном Hiddify v1.7.0 при запуске на Linux возникали ошибки:
|
|||
|
|
- **100 попыток инициализации БД**: `Failed attempt 0-99 to initialize the database: stat data/extensionData.db: no such file or directory`
|
|||
|
|
- **Критическая ошибка**: `failed to select enabled extensions: failed to open database extensionData`
|
|||
|
|
- **Диалог с ошибкой**: "Непредвиденная ошибка" при каждом запуске
|
|||
|
|
|
|||
|
|
## Причина
|
|||
|
|
Libcore пыталась инициализировать LevelDB для системы расширений 100 раз с задержкой, что приводило к:
|
|||
|
|
1. Спаму в логах (100+ строк ошибок)
|
|||
|
|
2. Блокировке подключения с `ConnectionFailure.unexpected`
|
|||
|
|
3. Негативному UX (диалог с ошибкой)
|
|||
|
|
|
|||
|
|
## Решение
|
|||
|
|
Изменены файлы в libcore:
|
|||
|
|
|
|||
|
|
### 1. `libcore/v2/db/hiddify_db.go`
|
|||
|
|
```go
|
|||
|
|
// Было: 100 попыток с retry logic
|
|||
|
|
func getDB(name string, readOnly bool) tmdb.DB {
|
|||
|
|
const retryAttempts = 100
|
|||
|
|
for i := 0; i < retryAttempts; i++ {
|
|||
|
|
db, err := tmdb.NewGoLevelDBWithOpts(...)
|
|||
|
|
if err == nil { return db }
|
|||
|
|
log.Printf("Failed attempt %d...", i, err)
|
|||
|
|
time.Sleep(retryDelay)
|
|||
|
|
}
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Стало: одна попытка, тихий возврат nil
|
|||
|
|
func getDB(name string, readOnly bool) tmdb.DB {
|
|||
|
|
db, err := tmdb.NewGoLevelDBWithOpts(name, "./data", &opt.Options{ReadOnly: readOnly})
|
|||
|
|
if err != nil {
|
|||
|
|
// Extension database is optional, skip silently
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
return db
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. `libcore/extension/interface.go`
|
|||
|
|
```go
|
|||
|
|
// Было: возврат ошибки при недоступности БД
|
|||
|
|
func (s *extensionService) Start() error {
|
|||
|
|
extdata, err := table.All()
|
|||
|
|
if err != nil {
|
|||
|
|
return fmt.Errorf("failed to select enabled extensions: %w", err)
|
|||
|
|
}
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Стало: пропуск при недоступности БД
|
|||
|
|
func (s *extensionService) Start() error {
|
|||
|
|
extdata, err := table.All()
|
|||
|
|
if err != nil {
|
|||
|
|
// Extensions are optional, skip if database not available
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Сборка
|
|||
|
|
```bash
|
|||
|
|
# 1. Собрать libcore из исходников
|
|||
|
|
cd ~/dorod/hiddify-umbrix-v1.7.0
|
|||
|
|
CHANNEL=prod make build-linux-libs
|
|||
|
|
|
|||
|
|
# 2. Пересобрать Flutter приложение
|
|||
|
|
flutter build linux --release
|
|||
|
|
|
|||
|
|
# 3. Запустить
|
|||
|
|
./build/linux/x64/release/bundle/umbrix
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Результат
|
|||
|
|
✅ **Нет спама в логах** - extensionData инициализируется тихо
|
|||
|
|
✅ **Нет диалога с ошибкой** - приложение запускается чисто
|
|||
|
|
✅ **Работают все функции** - профили, подключение, прокси
|
|||
|
|
✅ **49MB libcore** - полная сборка с gvisor, quic, wireguard, ech, utls, clash_api, grpc
|
|||
|
|
|
|||
|
|
## Тестирование
|
|||
|
|
- ✅ Профили добавляются (parse() FFI функция работает)
|
|||
|
|
- ✅ Подключение успешное (vless, vmess, trojan)
|
|||
|
|
- ✅ 6 серверов из подписки распарсены
|
|||
|
|
- ✅ Логи чистые (только стандартные bootstrap сообщения)
|
|||
|
|
|
|||
|
|
## Git
|
|||
|
|
```bash
|
|||
|
|
# Коммиты
|
|||
|
|
7fee347 - chore: update libcore to v1.7.0 with extensionData fix
|
|||
|
|
8b6f4d6 - Fix extensionData database errors - make optional (libcore)
|
|||
|
|
|
|||
|
|
# Тег
|
|||
|
|
v1.7.0-libcore-fixed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Ссылки
|
|||
|
|
- GitHub issue оригинала: https://github.com/hiddify/hiddify-app/issues/1538
|
|||
|
|
- LibCore версия: v1.7.0 (кастомная сборка из исходников)
|
|||
|
|
- Платформа: Linux x86_64, Ubuntu 24.04, Flutter 3.24.0
|