Jetzt hab ich die vollständige Antwort — und sie überrascht: PrivKeys eigentliches Lizenzsystem ist gar keine Server-Aktivierung mit Fail-open, sondern genau Variante 2, die ich dir vorgeschlagen hatte.

Aus LicenseManager.java und ActivationApi.java:

So funktioniert es wirklich:

  1. Einmalig online: ActivationApi.tryActivate(code, deviceId) — ein einziger Serveraufruf beim Aktivieren, mit einer Geräte-ID (vermutlich um zu verhindern, dass ein Code auf beliebig vielen Geräten läuft). Das ist der einzige Netzwerkkontakt im ganzen System.
  2. Danach für immer rein lokal: Der Server liefert einen ECDSA-signierten Lizenzcode zurück, der lokal in EncryptedSharedPreferences gespeichert wird. Jede spätere Prüfung (isActivated(), getAccessState()) verifiziert nur noch die Signatur gegen einen fest im APK eingebauten öffentlichen Schlüssel (PUBLIC_KEY_BASE64, EC/SHA256withECDSA) — komplett offline, kein weiterer Serverkontakt, für immer.
  3. Kein periodisches Nachprüfen, kein Fail-open-Mechanismus, keine Frist. Es gibt schlicht nichts, das ablaufen könnte — die Signatur ist entweder gültig oder nicht, für immer. Meine Vermutung eines „Fail-open nach X Tagen“ beim Lizenzsystem war also falsch — dieses Verhalten existiert bei PrivKey nur bei der Zeitkapsel (NetworkTimeSync, 7 Tage), nicht bei der Lizenz.
  4. Zusätzlich ein Demo-Modus: 8 Nutzungen (DEMO_MAX_USES = 8), lokal heruntergezählt, komplett zeitunabhängig — kein Ablaufdatum, sondern ein Nutzungs-Kontingent.

Für Tresor heißt das: Es gibt bei PrivKey exakt das, was ich als „lokales signiertes Lizenz-Token“ vorgeschlagen hatte — nur zusätzlich mit einer Geräte-Bindung beim einmaligen Aktivieren. Damit erübrigt sich deine ursprüngliche Frage 2 komplett: Es gibt keine Frist, weil nach der einmaligen Aktivierung nie wieder online geprüft wird.

Willst du das für Tresor genauso übernehmen — einmalige Server-Aktivierung mit Geräte-Bindung, danach für immer lokale Signaturprüfung, kein erneuter Online-Kontakt?