2016-03-16 14 views
6

Çalıştığım yayınlanmamış bir Android kitaplığı üçüncü parti ağ kitaplığı içeriyor - OkHttp bu durumda.Bağımlılık oluşturma - kendi bağımlılıklarına erişimi kaldırma

Bu kitaplığı bağımlılık olarak kullanan projeler de artık bu ağ kitaplığı ile nesne oluşturabilir.

Kitaplığım içinde bulunan ağ kitaplığına erişimi sınırlayabilir veya devre dışı bırakabilir miyim?

+0

Son hedefiniz nedir?Kütüphane kullanıcılarının kütüphaneniz aracılığıyla OkHttp'ye erişmelerini kısıtlasanız bile, yine de derleme bağımlılığı olarak OkHttp'yi ekleyebilir ve kullanabilirler. Peki tam olarak ne elde etmeye çalışıyorsun? – RaGe

+0

Android kütüphanenizi aar olarak mı paketliyorsunuz? OkHttp'i aar'ınızla mı paketliyorsunuz? ya da pom.xml'de tanımlanan geçiş bağımlılığı mı? – RaGe

+0

@RaGe İnsanların zaten bir derleme bağımlılığı olarak OkHttp'ye sahip olmalarını veya eklemeyi düşünebileceklerini umuyorum. Ayrıca, OkHttp'nin farklı bir sürümünü ekleyerek/kullanacak olma ihtimali de var. Bu yüzden, kütüphanemdeki sürümü kullanmasını istemiyorum. Kütüphanem paketlenmiş, ancak bintray paketleri paketliyor ve insanlar onu bir bağımlılık olarak kullanıyorlar. OkHttp kütüphanemde gizli bir bağımlılık var – CQM

cevap

1

kodunuzu o ClassNotFound başarısız olur veya kod lib ile paketlendikten sonra MethodNotFound

kimse kullanamaz Bunun
dependencies { 
    compile('com.squareup.okhttp3:okhttp:3.2.0') { 
     transitive = false 
    } 
} 

Kısa var onların uygulamanın içinden eksik kod vurur ancak eğer bağımlılık transitive yapabilir kim onu lib'inizden kullanmak istiyor.

Bu, sorunu istediğiniz gibi çözmeyecektir ancak okhttp sınıflarını yeniden adlandırmak için proguard kullanabilirsiniz. Senin lib'inin kullanıcıları hala okhttp sınıflarını arayabilirler ama onlar bir şey gibi bir şeyle yeniden adlandırılırdı, b, c, ...

+0

Bana geçiş özelliği hakkında daha fazla bilgi verir misiniz? Bunun ne gibi bir sınırlama getirdiğinden emin değilim, bu yüzden kütüphanem OkHttp3'i ağır bir şekilde kullanıyor, eğer kitaplığımı da içeriyorsa hala OkHttp3 yöntemleriyle çalışacak mı? İkinci olarak, eğer OkHttp3'i de kullanacakları için kullanacaklarsa, bu herhangi bir çatışmayı önleyecek mi? – CQM

+0

Bu bana istediğim sonucu vermemekte, bağımlılığımı kullanan bir proje var ve OkHttp'yi notla ekleme, yine de hala OkHttp yöntemlerine erişimi var. sınıfları adlandırmak ProGuard hakkında o ulaşılmaz – CQM

+0

Eklendi yorumunu yapmak için bir yol olup olmadığını merak ediyorum, ama onlar lib ile paketlenir kez gerçekten değil paketini değiştirme sınıfları – JBirdVegas

1

Yapmak istediğiniz şey bağımlılığı shade. İşte bir blog yayınında bir açıklama yaklaşık shading dependencies in Gradle var:

Shade için bir kütüphane sözü kitaplığın içeriği dosyalarını almaktır, kendi kavanoza koydu ve onların package.This ambalaj farklıdır değiştirmek hangi kitaplık dosyalarını, farklı bir pakete yerleştirmeden, kendi kavanozunuza gönderir. fatjar terimi, bağımlılıkları paketlendikçe veya bunlara gölgelendirildiklerinde, uygulama olarak bilinen kavanozlara başvurmak için yaygın olarak kullanılır.

Daha küçük kitaplıklar için kolay bir işlemdir. Görüntü alabilirim OkHttp gibi büyük bir kütüphane için zor olabilir. Dosyaları projenize kopyalayıp paketi değiştirerek manuel olarak yapabilirsiniz. Otomatik olarak yapacak some scripts da vardır. Genellikle Jar Jar Links kullanırlar.

+0

erişimini engeller senin lib önleyemez Bu sınıflara erişimi engelliyor mu? Onları belirsiz ve dolayısıyla kullanılmayacak hale getirir, ancak yine de bu kavanoz kullanılarak bir uygulama tarafından kullanılabilir. – RaGe

1

Normalde böyle bağımlılıkları yok varsayılan edilebilir: senin kavanoza derlenmiş

compile rootProject.ext.okhttp 

sadece kaynaklarıdır. Yani OkHttp sınıfları senin lib'inde olmayacak.

Bende aynı durum var. Maven'i kurmak ve yüklemek için kürek kullanırım. Sen niyeti paketinde kesin borç sürümü olması ve sadece bir modül olarak ve OkHttp pakete gibi bazı şeyleri değiştirmek için proje dahil etmek gerek gizli edilecek Yani eğer here

kontrol edebilirsiniz çakışmalardan ve ayrıca kamuya açık okhttp üyelerine erişimden kaçının. OkHttp Okio'yu kullanıyor, böylece özelleştirmeyi de isteyebilirsiniz.

Gölgeli sınıfın bu tür gölgeleme + gizleme işlevselliğinin çerçeve bağımlılıkları için yararlı olabileceğini unutmayın (çalışma zamanında tüm borçları garantilemekle birlikte), ancak lib'larınızın boyutunu artırmaktadır ve uygulamaların kullanımı için en iyi seçenek olmayacaktır. lib'iniz, paketlemede gerekli olan şeylerin, yine de, paketteki gerekli borçları sağladığından emin olun.

+0

Yani, OkHttp'i klonlamaya ihtiyacım var, bunu bir Jar'a dönüştürüp, kavanozu projeme kopyaladım. Ve bu benim bağımlılığımı kullanan kişilerin OkHttp işlevlerine erişmesini engelliyor mu? – CQM

+0

sadece bir modül olarak projenize dahil etmelisiniz ve çatışmalardan kaçınmak için OkHttp paketi gibi bazı şeyleri değiştirmek ve aynı zamanda kamuya açık okhttp üyelerine erişim. OkHttp Okio'yu kullanıyor, böylece özelleştirmeyi de isteyebilirsiniz. Ama neden bunu gerçekten yapmak istiyorsun? Bu sadece lib'inizin boyutunu artıracak başka bir avantaj görmüyorum. – djodjo

+0

yorumları yanıta taşıdı – djodjo

İlgili konular