Как различить тестовую и продовскую сборку для android-приложения
Во время тестовых сборок, инструментального тестирования и прочих подобных задач от приложения требуется дополнительные возможности в части сообщения своего внутреннего состояния или быстрой смены различных параметров (к примеру переключение между тестовым и продовским сервером). Этот функционал, естественно, не должен попадать в релиз приложения. Т.е. нам нужно каким-либо образом убирать или отключать куски кода в приложении.
Убирать куски кода мы можем с помощью gradle. Или же в код вставить проверку на то, в каком режиме работает приложение. Собственно сборка может быть или отладочной или промышленной. И подписываются они каждая своим ключом, таким образом задача сводится к тривиальной — определить каким ключом подписан apk-файл приложения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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;} |
Хотя я предпочитаю использовать более простой вариант. При сборке приложения компилятор так же указывает в каком режиме собрано приложение и проверить мы это можем вот таким образом:
1 |
boolean isDebuggable = ( 0 != ( getActivity().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE ) ); |
Ну и затем на основании вычисленного флага уже можно легко управлять поведением приложения, прятать/показывать кнопки и отладочные окна.