2016-03-24 20 views
6

de OkHTTP Kütüphane sürümünü edinin Son zamanlarda kilitlenme raporları Uygulamamı oluşturacak analiz ve uygulamam açıkça okhttp bağlı değildir okhttpAndroid | zamanında

işaret birkaç yığın izleri buldu.

AFAIK okhttp sürümü Android işletim sistemi sürümüne bağlıdır, ve tek başına okhttp kütüphane Ben okhttp kitaplığı sürümü log karar giderme yardımcı olmak için cihazın

yerleştirilir ve bu

için birçok yararlı sınıfları bulundu benziyor
  1. com.squareup.okhttp.internal.Version
  2. okhttp3.internal.Version

Sadece ben com.android.okhttp.internal.http.HttpURLConnectionImpl sınıf formu yığın-iz sürdü ve Class.forName çalıştı hata yapmadı emin olmak için o - başarı Ayrıca

Ben com.squareup.okhttp derleme sırasında benziyor com.android.okhttp dönüştürülmüş fark, bu yüzden tamamen Denedim böyle varyantlar

  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") -> başarı

kimse neden açıklayabilir misiniz? Ne kaçırdım?

Güncelleme

Cihazımdan adb pull /system/framework/okhttp.jar dan okhttp.jar çekti ama MANIFEST.MF 4'ten sadece

+0

raporlarını anında kütüphane değişiklikleri tesliminden itibaren kütüphane ve yük sınıfları kendi versiyonunu uygulamanın çökmesine önlemek veya apk'de ile derlemek istiyorsanız ve varsayarak Eğer var En azından bazı basit sürüm kontrolü yerinde, uygulamanızın hangi sürümünün okhttp ile gönderildiğini bilmelisiniz. – laalto

+0

Uygulamam açıkça "okhttp" ye bağlı değil. – CAMOBAP

cevap

1

içerir.squareup ait xx google okhttp kullanıyor bölüm

/** 
* 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/

herşey cihaza göre değişir - Ne os version u api gelişmektedir çünkü u yansımaları kullanabilirsiniz ama u hangi alanda bilmesine gerek kullanarak

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

d karşılaştırmak için belirli API olduğunu görmek iffrent API sürümleri kullanın:

yoluyla yansımaları

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[]{}); 

aynı

String okEngineVersion = System.getProperty("http.agent"); 
olarak: https://android.googlesource.com/platform/external/okhttp/

u

System.getProperty("http.agent"); 

düzenlemek başında deneyebilirsiniz 10 ve u rahatsız istiyorsanız:

  • her sınıf tedavi edilir aynı şekilde -> eşittir olarak (hayır sürüm - u sadece sihirli minör majör numarası kontrol edebilirsiniz - sınıfından java derleyicisi sürümünü) ait
  • manifestosunu/sistem/çerçeve/okhttp.jar versiyon özelliklerini içermiyor

u sonra okhttp.internal.Version sınıfını istiyorsanız:

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

Sonuç: Eğer uygulamanızın sürümünü biliyorum

kazasında
+0

Peki ya oktttp 2.x' için? Ve neden doğrudan okhttp3.internal.Version''a erişemiyorum? – CAMOBAP

+0

@CAMOBAP - benim düzenleme – ceph3us

+0

benim için bkz. Güncelleme için teşekkürler, ama 'Kullanıcı-Aracı' değil, sürümüne ihtiyacım var. Bunu biliyorum kodu göre 'Version.userAgent'' gerçek kütüphane sürümünü içeren HttpURLConnectionImpl.defaultUserAgent' değil – CAMOBAP

İlgili konular