Comment vérifier si APK est signé ou "debug"?

autant que je sache, dans android" Release build " est signé APK. Comment le vérifier à partir du code ou est-ce que Eclipse a une sorte de définition secrète?

j'en ai besoin pour déboguer la saisie des éléments ListView à partir des données du service web (non, logcat n'est pas une option).

mes pensées:

  • Application android:debuggable , mais pour une raison qui ne semble pas fiable.
  • ID de périphérique codant dur N'est pas une bonne idée, parce que j'utilise le même périphérique pour tester les APK signés.
  • utilisant un drapeau manuel quelque part dans le code? Plausible, mais je vais oublier de changer à un moment donné, et tous les programmeurs sont paresseux.
112
demandé sur Cristian 2011-08-17 02:07:01

9 réponses

il y a une façon différente de vérifier si l'application est construite en utilisant le certificat de débogage ou de publication, mais la façon suivante me semble la meilleure.

selon les informations dans la documentation Android Signing Your Application , debug key contain following subject distinguished name:" CN=Android Debug,O=Android,C=US ". Nous pouvons utiliser cette information pour tester si le paquet est signé avec la clé de débogage sans clé de débogage hardcoding. signature dans notre code.

:

import android.content.pm.Signature;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

vous pouvez implémenter une méthode isDebuggable de cette façon:

private static final X500Principal DEBUG_DN = new X500Principal("CN=Android Debug,O=Android,C=US");
private boolean isDebuggable(Context ctx)
{
    boolean debuggable = false;

    try
    {
        PackageInfo pinfo = ctx.getPackageManager().getPackageInfo(ctx.getPackageName(),PackageManager.GET_SIGNATURES);
        Signature signatures[] = pinfo.signatures;

        CertificateFactory cf = CertificateFactory.getInstance("X.509");

        for ( int i = 0; i < signatures.length;i++)
        {   
            ByteArrayInputStream stream = new ByteArrayInputStream(signatures[i].toByteArray());
            X509Certificate cert = (X509Certificate) cf.generateCertificate(stream);       
            debuggable = cert.getSubjectX500Principal().equals(DEBUG_DN);
            if (debuggable)
                break;
        }
    }
    catch (NameNotFoundException e)
    {
        //debuggable variable will remain false
    }
    catch (CertificateException e)
    {
        //debuggable variable will remain false
    }
    return debuggable;
}
74
répondu Omar Rehman 2013-06-01 07:38:09

pour vérifier le drapeau débuggable, vous pouvez utiliser ce code:

boolean isDebuggable =  ( 0 != ( getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) );

pour plus d'informations, veuillez consulter sécuriser les Applications LVL Android .

Sinon, si vous utilisez Gradle correctement, vous pouvez vérifier si BuildConfig.DEBUG est vrai ou faux.

131
répondu Blundell 2014-06-22 12:33:53

, a Répondu par Mark Murphy

la solution la plus simple et la meilleure à long terme , est d'utiliser BuildConfig.DEBUG . Il s'agit d'une valeur boolean qui sera true pour une construction de débogage, false sinon:

if (BuildConfig.DEBUG) {
  // do something for a debug build
}
123
répondu Xar E Ahmer 2015-10-01 10:17:33

peut-être en retard, mais iosched utilise BuildConfig.DEBUG

20
répondu urSus 2013-11-25 15:02:15

si vous voulez vérifier un APK de façon statique, vous pouvez utiliser

aapt dump badging /path/to/apk | grep -c application-debuggable

cette sortie 0 si la APK n'est pas déboguable et 1 si elle l'est.

15
répondu Heath Borders 2014-06-30 15:59:08

ajoutez D'abord ceci à votre construction.gradle file, ce qui permettra également d'exécuter côte à côte des compilations debug et release:

buildTypes {
    debug {
        applicationIdSuffix ".debug"
    }
}

ajouter cette méthode:

public static boolean isDebug(Context context) {
    String pName = context.getPackageName();
    if (pName != null && pName.endsWith(".debug")) {
        return true;
    } else {
        return false;
    }
}
9
répondu Meanman 2015-02-28 14:53:58

debug est signé ainsi, juste avec une clé différente. Il est généré automatiquement par Eclipse, et son certificat est valide pour un an seulement. Quel est le problème avec android:debuggable ? Vous pouvez obtenir cette valeur à partir du code en utilisant PackageManager .

4
répondu Nikolay Elenkov 2011-08-17 01:40:25

une autre option qui vaut la peine d'être mentionnée. Si vous avez besoin d'exécuter du code seulement lorsque le débogueur est attaché, utilisez ce code:

if (Debug.isDebuggerConnected() || Debug.waitingForDebugger()) { //code to be executed }

2
répondu Igor Gorjanc 2014-09-30 12:02:01

résolu par android:debuggable . C'était un bug dans la lecture de l'élément où dans certains cas, le drapeau de débogage sur l'élément n'était pas stocké dans l'enregistrement if (m.debug && !App.isDebuggable(getContext())) toujours évalué à false . Mon mauvais.

0
répondu Im0rtality 2011-08-17 07:42:52