Ich möchte die neuen Lizenz (LVL) Sachen mit Android Marketplace verwenden, aber ich habe ein Performance-Problem mit dem Lager AESObfuscator. Der Konstruktor benötigt mehrere Sekunden, um auf einem Gerät ausgeführt zu werden (pure Agonie im Emulator). Da dieser Code ausgeführt werden muss, um auch nach zwischengespeicherten Lizenzantworten zu suchen, wird die Überprüfung der Lizenz beim Start stark beeinträchtigt.Irgendwo um schreckliche SecretKeyFactory Leistung mit LVL und AESObfuscator?
die LVL Beispiel-App Rennen, hier ist mein Barbar-Stil Profilierung AESObfuscator Konstruktor:
public AESObfuscator(byte[] salt, String applicationId, String deviceId) {
Log.w("AESObfuscator", "constructor starting");
try {
Log.w("AESObfuscator", "1");
SecretKeyFactory factory = SecretKeyFactory.getInstance(KEYGEN_ALGORITHM);
Log.w("AESObfuscator", "2");
KeySpec keySpec =
new PBEKeySpec((applicationId + deviceId).toCharArray(), salt, 1024, 256);
Log.w("AESObfuscator", "3");
SecretKey tmp = factory.generateSecret(keySpec);
Log.w("AESObfuscator", "4");
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");
Log.w("AESObfuscator", "5");
mEncryptor = Cipher.getInstance(CIPHER_ALGORITHM);
Log.w("AESObfuscator", "6");
mEncryptor.init(Cipher.ENCRYPT_MODE, secret, new IvParameterSpec(IV));
Log.w("AESObfuscator", "7");
mDecryptor = Cipher.getInstance(CIPHER_ALGORITHM);
Log.w("AESObfuscator", "8");
mDecryptor.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(IV));
} catch (GeneralSecurityException e) {
// This can't happen on a compatible Android device.
throw new RuntimeException("Invalid environment", e);
}
Log.w("AESObfuscator", "constructor done");
}
Die Ausgabe auf einem Nexus One:
09-28 09:29:02.799: INFO/System.out(12377): debugger has settled (1396)
09-28 09:29:02.988: WARN/AESObfuscator(12377): constructor starting
09-28 09:29:02.988: WARN/AESObfuscator(12377): 1
09-28 09:29:02.999: WARN/AESObfuscator(12377): 2
09-28 09:29:02.999: WARN/AESObfuscator(12377): 3
09-28 09:29:09.369: WARN/AESObfuscator(12377): 4
09-28 09:29:09.369: WARN/AESObfuscator(12377): 5
09-28 09:29:10.389: WARN/AESObfuscator(12377): 6
09-28 09:29:10.398: WARN/AESObfuscator(12377): 7
09-28 09:29:10.398: WARN/AESObfuscator(12377): 8
09-28 09:29:10.409: WARN/AESObfuscator(12377): constructor done
09-28 09:29:10.409: WARN/ActivityManager(83): Launch timeout has expired, giving up wake lock!
09-28 09:29:10.458: INFO/LicenseChecker(12377): Binding to licensing service.
7 Sekunden Dreschen (ca. 20 in Emulator , Äh). Ich kann es auf einer AsyncTask ausspielen, aber es tut nicht viel Gutes, da die App nicht wirklich laufen kann, bis ich die Lizenz validiert habe. Alles, was ich bekomme, ist ein hübscher, sieben Sekunden langer Fortschrittsbalken, während der Benutzer darauf wartet, dass ich die Lizenz überprüfe.
Irgendwelche Ideen? Roll meinen eigenen Obfuscator mit etwas einfacherem als AES, um meine eigenen Lizenzantworten zu cachen?
Ist das nicht nur meine Antwort oben? –