2016-03-24 3 views
6

Недавно я проанализировал отчеты о сбоях формируют мое приложение и нашел несколько трассировки стека, который указывает на okhttpAndroid | Получить версию OkHTTP библиотеки во время выполнения

Мое приложение не зависит от okhttp явно.

AFAIK okhttp версия зависит от версии ОС Android, и okhttp библиотеки самой размещена на устройстве

Чтобы помочь в устранении неполадок, я решил войти okhttp версии библиотеки, и похожа, что я нашел несколько полезных классов для этого

  1. com.squareup.okhttp.internal.Version
  2. okhttp3.internal.Version

Просто чтобы убедиться, что я не ошибаюсь, я принял com.android.okhttp.internal.http.HttpURLConnectionImpl форму класса стека, трассировку и попытался Class.forName это - успех

Кроме того, я заметил, что com.squareup.okhttp превращается в com.android.okhttp выглядит как при построении времени, поэтому я попытался полностью такие варианты

  1. Class.forName("com.android.okhttp.internal.Version") ->java.lang.ClassNotFoundException
  2. Class.forName("com.squareup.okhttp.internal.Version") ->java.lang.ClassNotFoundException
  3. Class.forName("okhttp3.internal.Version") ->java.lang.ClassNotFoundException
  4. Class.forName("com.android.okhttp.internal.http.HttpURLConnectionImpl") -> Успех

Может кто-нибудь объяснить, почему? Что я пропустил?

Update

Я вытащил okhttp.jar из моего устройства adb pull /system/framework/okhttp.jar но содержит MANIFEST.MF только

+0

В аварии отчеты вы знаете версию вашего приложения, и если у вас есть по крайней мере, некоторый простой контроль версий на месте, вы должны знать, какую версию okhttp предлагает эта версия вашего приложения. – laalto

+0

Мое приложение не зависит от 'okhttp' явно – CAMOBAP

ответ

1

от 4.хй Google использует okhttp часть squareup

/** 
* This implementation uses HttpEngine to send requests and receive responses. This class may use 
* multiple HttpEngines to follow redirects, authentication retries, etc. to retrieve the final 
* response body. 
* 
* <h3>What does 'connected' mean?</h3> This class inherits a {@code connected} field from the 
* superclass. That field is <strong>not</strong> used to indicate whether this URLConnection is 
* currently connected. Instead, it indicates whether a connection has ever been attempted. Once a 
* connection has been attempted, certain properties (request header fields, request method, etc.) 
* are immutable. 
*/ 
public class HttpURLConnectionImpl extends HttpURLConnection { 


    private String defaultUserAgent() { 
    String agent = System.getProperty("http.agent"); 
    return agent != null ? Util.toHumanReadableAscii(agent) : Version.userAgent(); 
    } 

https://github.com/square/okhttp/blob/master/okhttp-urlconnection/src/main/java/okhttp3/internal/huc/HttpURLConnectionImpl.java

http://square.github.io/okhttp/

все зависит от устройства - какая версия пользуется, потому что апи развивается, и можно использовать отблески, но и нужно знать, что поле ОС на конкретном API

см https://github.com/square/okhttp/blob/master/CHANGELOG.md

сравнить д версии iffrent Использование API: https://android.googlesource.com/platform/external/okhttp/

и можно попробовать в начале

System.getProperty("http.agent"); 

редактировать:

с помощью отражения

HttpURLConnection connection = (HttpURLConnection) new URL("http://google.com") 
     .openConnection(); 
Method method = connection.getClass().getDeclaredMethod("defaultUserAgent"); 
method.setAccessible(true); 
String okEngineVersion = (String) method.invoke(connection, new Object[]{}); 

же как

String okEngineVersion = System.getProperty("http.agent"); 

и если и хотят заморачиваться:

  • каждый класс обрабатывается таким же образом -> в равных (управление версиями - и не может проверить только волшебный второстепенную основной номер - версия Java компилятор из класса)
  • манифест/система/структура/okhttp.jar не содержит версии свойств

если и хотите okhttp.internal.Version класс затем:

File file = new File("/system/framework/okhttp.jar"); 

// using javaxt-core lib   
Jar jar = new Jar(file); 
jar.getVersion(); 

// load dex 
DexFile dexfile = DexFile.loadDex(file.getAbsolutePath(), 
        File.createTempFile("opt", "dex", _context.getCacheDir()).getPath(), 0); 

Enumeration<String> dexEntries = dexfile.entries(); 
ClassLoader systemClassLoader = DexClassLoader.getSystemClassLoader(); 

while (dexEntries.hasMoreElements()) { 
    String className = dexEntries.nextElement(); 
    Class<?> aClass = systemClassLoader.loadClass(className); 
} 

вывода: Если вы хотите, чтобы избежать краха приложения от поставки изменений библиотеки собственной версии библиотеки и загрузок классов на лета или скомпилировать с APK

+0

Как насчет решения для' okhttp 2.x'? И почему я не могу получить доступ к 'okhttp3.internal.Version' напрямую? – CAMOBAP

+0

@CAMOBAP - см. Мое редактирование – ceph3us

+0

спасибо за обновление, но мне нужна версия, а не 'User-Agent'. Согласно коду, я знаю, что 'Version.userAgent' содержит фактическую версию библиотеки,' HttpURLConnectionImpl.defaultUserAgent' не – CAMOBAP

Смежные вопросы