Here you can find the source of isDebuggable(Context ctx)
public static boolean isDebuggable(Context ctx)
//package com.java2s; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; import java.io.ByteArrayInputStream; import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import javax.security.auth.x500.X500Principal; public class Main { public static boolean isDebuggable(Context ctx) { boolean debuggable = false; X500Principal DEBUG_DN = new X500Principal( "CN=Android Debug,O=Android,C=US"); try {// www . ja v a 2 s . c om 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 (PackageManager.NameNotFoundException e) { //debuggable variable will remain false } catch (CertificateException e) { //debuggable variable will remain false } return debuggable; } }