Cache
Panorama técnico de tudo que o InkShelf guarda em disco fora do banco Room, por que existe cada cache, e como ele sabe quando um dado guardado não serve mais.
O que é cacheado
| Cache | Onde | Por quê |
|---|---|---|
| Miniaturas de capa | cache/covers/{fileId}.jpg | Evita reabrir e decodificar o arquivo de origem toda vez que uma capa precisa ser exibida — ver Sistema de Capas |
| Arquivo de arquivo compactado reaproveitável | cache/reader_archives/{fileId}.{ext} | Uma cópia local do CBZ/CBR/PDF de origem, para não reabrir a URI do SAF a cada página virada |
| Índice de páginas do arquivo | cache/reader_archives/{fileId}.index (companheiro do arquivo acima) | Lista já resolvida de entradas de página em ordem natural, para não reler o índice do arquivo compactado inteiro a cada abertura |
| Páginas extraídas | cache/pages/{fileId}/ | Páginas individuais já decodificadas, quando aplicável ao formato |
| Livro EPUB extraído | cache/epub_books/ | HTML dos capítulos e imagens já descompactados do EPUB de origem |
| Paginação de capítulo EPUB | Tabela chapter_pagination_cache (Room, não é arquivo em disco) | Contagem de páginas por capítulo, sob uma combinação de zoom/viewport — ver Modelo de Dados |
Validação por impressão digital, não por tempo
O arquivo compactado reaproveitável e seu índice de páginas não expiram por tempo — eles são validados por uma "impressão digital" do arquivo de origem, calculada a partir de metadados do próprio SAF (data de última modificação + tamanho, concatenados). Antes de reaproveitar um arquivo em cache, o app recalcula essa impressão digital do arquivo original e compara com a que foi salva no momento do cache; se não baterem — porque o arquivo original foi substituído ou modificado fora do app —, o cache é descartado e reconstruído do zero. Isso evita tanto reprocessamento desnecessário (arquivo não mudou, reaproveita) quanto dados obsoletos (arquivo mudou, detecta e invalida).
As capas seguem uma lógica mais simples: permanecem em cache indefinidamente até serem explicitamente invalidadas (ação "atualizar capa", limpeza manual, ou remoção do arquivo da biblioteca).
Limite de tamanho e remoção automática
Um limite configurável de armazenamento (ver Armazenamento) aciona remoção automática por LRU — os arquivos cujo carimbo de modificação mais recente (aproximação de "última vez lido") é mais antigo são removidos primeiro — mas essa política atua só sobre o cache do leitor (páginas + arquivos reaproveitáveis), não sobre capas nem sobre o banco de dados. O cálculo do orçamento disponível para o leitor desconta o espaço ocupado pelo que não pode ser removido automaticamente, para que o limite configurado pelo usuário reflita o consumo total real do app, não só a fração removível.
Limpeza ligada ao ciclo de vida da biblioteca
Além do limite de tamanho, todo cache (capas, páginas, arquivos reaproveitáveis, EPUBs extraídos) é podado sempre que a biblioteca é sincronizada: arquivos que saíram da biblioteca — apagados, movidos pra fora, ou porque a pasta raiz foi removida — têm seu cache correspondente apagado nessa mesma passada, sem esperar o limite de tamanho ser atingido. Ver Scanner.