Александр Горбач


программирование, админство

Как различить тестовую и продовскую сборку для android-приложения

без комментариев

Во время тестовых сборок, инструментального тестирования и прочих подобных задач от приложения требуется дополнительные возможности в части сообщения своего внутреннего состояния или быстрой смены различных параметров (к примеру переключение между тестовым и продовским сервером). Этот функционал, естественно, не должен попадать в релиз приложения. Т.е. нам нужно каким-либо образом убирать или отключать куски кода в приложении.

Убирать куски кода мы можем с помощью gradle. Или же в код вставить проверку на то, в каком режиме работает приложение. Собственно сборка может быть или отладочной или промышленной. И подписываются они каждая своим ключом, таким образом задача сводится к тривиальной — определить каким ключом подписан apk-файл приложения.

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;}

Хотя я предпочитаю использовать более простой вариант. При сборке приложения компилятор так же указывает в каком режиме собрано приложение и проверить мы это можем вот таким образом:

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

Ну и затем на основании вычисленного флага уже можно легко управлять поведением приложения, прятать/показывать кнопки и отладочные окна.

Автор Sash(k)a

Май 19th, 2014 at 1:51 пп

Опубликовано в Без рубрики

Тэги ,

Оставьте комментарий

Яндекс.Метрика