Есть ли способ определить, подписано ли приложение Android для производства или отладки во время выполнения? - PullRequest
4 голосов
/ 13 декабря 2011

Есть ли способ определить, подписано ли приложение Android для производства или отладки во время выполнения?

Ответы [ 4 ]

7 голосов
/ 13 декабря 2011
private static Boolean isDebugBuild = null;
    protected boolean isDebugBuild() {
        if(isDebugBuild == null) {
            PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo(getPackageName(), 0);
                isSignedWithDebugKey = (pi.applicationInfo.flags &
                    ApplicationInfo.FLAG_DEBUGGABLE) != 0;
            }
            catch(NameNotFoundException nnfe) {
                nnfe.printStackTrace();
                isDebugBuild = false;
            }
        }

        return isDebugBuild;
    }

Поскольку ADT 8 , если вы специально не добавляете debuggable = "true" в манифест, для отладочных сборок будет установлено значение true, а для экспортированных / подписанных сборок будет установлено значение false.

Похоже, что это может быть более надежный метод (если только вы не устанавливаете отладочную версию вручную), чтобы определить, является ли это отладкой по сравнению с версией выпуска, но не определенно, был ли сертификат отладочным сертификатом - это был твой вопрос, поэтому мой ответ может быть неуместен для тебя.

5 голосов
/ 13 декабря 2011

Да, но не на 100% надежно.Сертификат по умолчанию (автоматически сгенерированный) имеет DN 'CN = Android Debug, O = Android, C = US', как описано здесь .Если вы проверите DN и он соответствует значению по умолчанию, это, скорее всего, сертификат отладки.Ничто не мешает людям создавать собственный сертификат отладки или использовать тот же сертификат для производства и отладки.

Сертификат подписи можно получить с помощью PackageManager.Что-то вроде:

PackageManager pm = context.getPackageManager();
Signature sig = packageManager.getPackageInfo(getPackageName(), 
   PackageManager.GET_SIGNATURES).signatures[0];
CertificateFactory cf = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) cf.generateCertificate(
    new ByteArrayInputStream(sig.toByteArray()));
String dn = cert.getIssuerDN().getName();
2 голосов
/ 06 декабря 2013

Мы используем гораздо более простой способ:

if (BuildConfig.DEBUG) {
    // we're in debug mode
} else {
    // we're in production mode
}
0 голосов
/ 04 января 2012

Пост android-автоматически-выбирать-отладка-релиз-карты-api-ключ Имеет другое решение на основе компоновщика пакетов. По сути, вы сравниваете с хэш-кодом фактического подписи. Хорошо работает для меня автоматически сортировка ключа карты

...