@Hide, Android kaynak kodunda ne anlama geliyor?


120

İçin Activitykaynak kodu , çizgi 3898 (tabanına yakın):

/**
 * @hide
 */
public final boolean isResumed() {
    return mResumed;
}

Ne anlama @hidegeliyor?

public class ChildActivity extends Activity { ... }Kullanamayacağımı / göremeyeceğimi buldum Activity.isResumed(). Bu normal mi? Nasıl erişebilirim?

Yanıtlar:


182

Android, SDK aracılığıyla erişilemeyen iki tür API'ye sahiptir.

İlki pakette bulunur com.android.internal. İkinci API türü, @hide Javadoc özniteliğiyle işaretlenmiş sınıflar ve yöntemler koleksiyonudur .

Google, Android 9'dan (API seviyesi 28) başlayarak, SDK olmayan arayüzlerin kullanımına yönelik olarak doğrudan, yansıtma yoluyla veya JNI aracılığıyla yeni kısıtlamalar getirmektedir . Bu kısıtlamalar, bir uygulama SDK olmayan bir arayüze başvurduğunda veya yansıma veya JNI kullanarak işleyicisini elde etmeye çalıştığında uygulanır.

Ancak API seviyesi 28'den önce, gizli yöntemlere Java yansıması yoluyla hala erişilebilir. @hideBöylece niteliği, Javadoc (ayrıca droiddoc) sadece bir parçasıdır @hidesadece basit yöntemi / sınıf / alan API docs dışındadır demektir.

Örneğin, içindeki checkUidPermission()yöntem şunları ActivityManager.javakullanır @hide:

/** @hide */
public static int checkUidPermission(String permission, int uid) {
    try {
        return AppGlobals.getPackageManager()
                .checkUidPermission(permission, uid);
    } catch (RemoteException e) {
        // Should never happen, but if it does... deny!
        Slog.e(TAG, "PackageManager is dead?!?", e);
    }
    return PackageManager.PERMISSION_DENIED;
}

Ancak buna yansıma yoluyla diyebiliriz:

Class c;
c = Class.forName("android.app.ActivityManager");
Method m = c.getMethod("checkUidPermission", new Class[] {String.class, int.class});
Object o = m.invoke(null, new Object[]{"android.permission.READ_CONTACTS", 10010});

1
merhaba @StarPinkER gizli veya dahili api kullanarak veya yansıtma yoluyla "android.permission.CHANGE_COMPONENT_ENABLED_STATE" permissio verebilir miyim?
Hardik

1
Önce bu yanıtı kontrol edin . Bu izin bir imza / sistem iznidir. Çoğu durumda, sistem uygulamaları olmadığı sürece bu izni alamazsınız. Bu, uygulamanızı kabul etmek veya uygulamanızı bir sistem uygulaması yapmak ve imzalamak için Android Kaynağını değiştirmeniz gerektiği anlamına gelir. Ancak, kendi Android Sisteminizi oluşturmadığınız sürece bunu yapamazsınız. Yansıma, "gizlemeyi" kaldırabilir ancak Android Güvenlik Sisteminin mantığını değiştiremez. Bunu yapabilirsek, bir Android Cihaza nasıl kolayca saldırabileceğimizi hayal edebilirsiniz. @Hardik
StarPinkER

2
Cevap için teşekkürler ama sanırım cevapta iki sorun var, yanılıyorsam düzelt. Onu "android.app.ActivityManager" ve "m.invoke (c," gibi görünüyor "m.invoke (null," statik yöntemler için ve "m. invoke (o, ", burada o, dinamik yöntemler için c türünün bir nesnesidir. Lehçe
gramerim

3
Yalnızca yansıma ile ilgili bir not: Bu yöntemler / alanlar resmi SDK'nın bir parçası olmadığından, gelecekteki herhangi bir Android revizyonunda yer alacağının garantisi yoktur.
sstn

2
Ek açıklama yöntemi yalnızca belgelerden kaldırıyorsa, neden hala kodda kullanamıyorum?
Javier Delgado

25
  1. @hideçeşitli nedenlerle görünür olması gereken, ancak yayınlanan API'nin parçası olmayan şeyler için kullanılır . API'yi kaynaktan otomatik olarak çıkardığında belgelere dahil edilmeyeceklerdir.

  2. Haklısın, onu geçersiz kılamazsın. Bu normaldir, olarak işaretlendiği için tasarım gereğidir final. Bunu kullanabilmelisiniz , ancak bir editör bunu, ile işaretlendiği için kullandığı intellisense'deki seçeneklerden biri olarak size göstermeyebilir @hideve aşağıdaki 3. maddeye dikkat etmelisiniz.

  3. Sen gerektiğini değil o API bir parçası değil ve istedikleri zaman geliştiriciler kaldırabilirsiniz beri hiç kullanıyorum. Hatta sadistçe eğilimli olsalardı, üzerinde çalıştığı cihazı tuğla haline getiren bir işlevle değiştirmeye eğilimli olsalardı (belki de katı bir yasal anlamda olmasa da) hakları dahilinde olacaklardı.


Oh evet ... finalelbette geçersiz kılamam. Üzgünüm bu benim hatam: x
midnite

publicGeliştirme aşamasında tüm sınıflarda olduğunu mu söylüyorsunuz ? Ama gibi davranır privateya da /*package*/bizim gibi kullanıcılara?
midnite

Hmm ... Bu sadece bir yorum. anlamlarını anlıyorum. Ancak bu davranışı kod düzeyinde ne ve nerede zorlayacaksınız?
midnite

1
Neden halka açık, gerçekten yorum yapamam. Belki kod uygulama Activitybirçok sınıfa yayılmıştır ve hepsinin bu üyeye erişmesi gerekir. Alt çizgi vardır o ise kendi riski altında kullanabilirsiniz anlam API parçası olmayan kamu fakat.
paxdiablo

1
@midnite, Eclipse şüphesiz intellisense şeyler ile entegre olan kendi Java derleyicisine sahiptir. Bunu Java SDK ile derlerseniz, gayet iyi derlenmesini öneririm. Elbette bunu
önermiyorum

4

@hideEk açıklama bu arayüz ortak API parçası değildir ve kodunuzda kullanılmamalıdır anlamına gelir. Yöntemler yalnızca AOSP'nin dahili kullanımı içindir.

Google aslında sdk olmayan arayüzlerin kullanımını kısıtlamaya başladı . Bu, ile işaretlenmiş arayüzleri içerir@hide

Yöntemler dört liste halinde sınıflandırılmıştır:

  • beyaz liste: SDK
  • açık gri liste: SDK olmayan yöntemler / hala erişilebilir olan alanlar.
  • Koyu grilistelemek:
    • Hedef SDK'sı API seviyesi 28'in altında olan uygulamalar için: koyu gri liste arayüzünün her kullanımına izin verilir.
    • Hedef SDK'sı API seviyesi 28 veya daha yüksek olan uygulamalar için: kara listeyle aynı davranış
  • kara liste: hedef SDK'dan bağımsız olarak kısıtlanır. Platform, arayüz yokmuş gibi davranacaktır. Örneğin, uygulama onu kullanmaya çalıştığında NoSuchMethodError / NoSuchFieldException atacak ve uygulama belirli bir sınıfın alan / yöntem listesini bilmek istediğinde bunu dahil etmeyecektir.

Listeler şu adreste bulunabilir: https://android.googlesource.com/platform/prebuilts/runtime/+/master/appcompat

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.