Ek açıklamalar ile kod incelemesini iyileştirme

lint gibi kod inceleme araçlarını kullanarak ve kodunuzu iyileştirebilir, ancak inceleme araçları yalnızca çok fazla çıkarımda bulunabilir. Android kaynak kimlikleri Örneğin dizeleri, grafikleri, renkleri ve diğer kaynak türlerini tanımlamak için int kullanın. Böylece inceleme araçları, bir dize kaynağını ne zaman belirtmeniz gerektiğini bir renk belirtti. Bu durum, uygulamanızın yanlış oluşturulabileceği veya hiç çalışmayabileceği anlamına gelir. en azından kod incelemelerinden yararlanabilirsiniz.

Notlar, bunların tespit edilmesine yardımcı olmak için lint gibi kod inceleme araçlarına ipuçları sağlamanıza olanak tanır. problemleri çözebilir. Ek açıklamalar, değişkenlere eklediğiniz meta veri etiketleri olarak eklenir. parametrelerini ve döndürme değerlerini, yöntem döndürme değerlerini, iletilen parametreleri, yerel değişkenleri, birlikte çalışır. Kod inceleme araçlarıyla birlikte kullanıldığında, ek açıklamalar aşağıdakiler gibi sorunları tespit etmenize yardımcı olabilir: boş işaretçi istisnaları ve kaynak türü çakışmaları.

Android, Jetpack Ek Açıklama Kitaplığı. Kitaplığa androidx.annotation. paketinden yararlanın.

Not: Bir modülün ek açıklama işlemcisine bağımlılığı varsa Kotlin için kapt veya ksp bağımlılık yapılandırmasını kullanmalısınız veya Java'nın annotationProcessor bağımlılık yapılandırmasına desteklenmektedir.

Projenize ek açıklama ekleyin

Projenizde ek açıklamaları etkinleştirmek için androidx.annotation:annotation ekleyin bağımlılığınızı giderebilirsiniz. Eklediğiniz tüm notlar, bir kod çalıştırdığınızda kontrol edilir inceleme veya lint görev olabilir.

Jetpack Notlar kitaplığına bağımlılığı ekleme

Jetpack Ek Açıklamaları kitaplığının yayınlandığı tarih: Google'ın Maven deposu. Projenize Jetpack Ek Açıklamalar kitaplığını eklemek için aşağıdakileri dahil edin: satırı build.gradle veya dependencies blokunda build.gradle.kts dosyası:

Kotlin

dependencies {
    implementation("androidx.annotation:annotation:1.8.2")
}

Eski

dependencies {
    implementation 'androidx.annotation:annotation:1.8.2'
}
Ardından, görüntülenen araç çubuğunda veya senkronizasyon bildiriminde Şimdi Senkronize Et'i tıklayın.

Kendi kitaplık modülünüzde ek açıklamalar kullanıyorsanız, ek açıklamalar annotations.zip dosyasındaki XML biçimindeki Android Arşivi (AAR) yapısı. androidx.annotation bağımlılığı, aşağı akış kullanıcıları için bağımlılık teşkil etmez seçin.

Not: Başka Jetpack kitaplıklarını kullanıyorsanız androidx.annotation bağımlılığını eklemeniz gerekmeyebilir. Çünkü diğer birçok Jetpack kitaplıkları, Ek Açıklama Kitaplığı'na bağlı olduğundan ek açıklamalar.

Jetpack deposuna eklenen ek açıklamaların tam listesi için Jetpack Ek Açıklama Kitaplığı bakın veya otomatik tamamlama özelliğini kullanarak import androidx.annotation. ifadesi.

Kod incelemeleri çalıştırma

Android Studio'dan ek açıklamaları doğrulama ve Analiz et'i > İnceleyin: tıklayın. Android Studio, kodunuzun gerektiği yerlerde olası sorunları işaretlemek için çakışma mesajları gösterir ve olası çözümler önermek için ek açıklamalarla çelişir.

Ayrıca, Komut satırını kullanarak lint görevi. Bu, işaretleme sorunlarını çözmek için bir sürekli entegrasyon sunucusuyla lint görevi boş değeri zorunlu kılmaz ek açıklamalar (aşağıdaki bölümde açıklanmıştır); bunu yalnızca Android Studio yapar. Daha fazla lint'i etkinleştirme ve çalıştırma hakkında bilgi daha fazla bilgi edinmek için Kodunuzu lint ile iyileştirme kontrol eder.

Ek açıklama çakışmaları uyarı oluştursa da bu uyarılar uygulamanızı engellemez bazı ipuçları vereceğim.

Boşluk ek açıklamaları

Nullness ek açıklamaları, Java kodunda değerlerin boş olup olamayacağını uygulamak açısından yararlı olabilir. Bunlar Kotlin kodunda daha az faydalıdır çünkü Kotlin, derleme zamanıdır.

@Nullable ve @NonNull ek açıklama belirli bir değişkenin, parametrenin veya döndürülen değerin boşluğunu kontrol etmek için kullanılır. @Nullable ek açıklama, boş olabilen bir değişkeni, parametreyi veya dönüş değerini belirtir. @NonNull, boş olamayacak bir değişkeni, parametreyi veya döndürülen değeri gösterir.

Örneğin, boş değer içeren bir yerel değişken bir yönteme parametre olarak aktarılırsa bu parametreye ekli @NonNull ek açıklamasıyla birlikte, kod oluşturulduğunda boş olmayan bir çakışmayı gösteren uyarı. Ayrıca, bir sonucun yöntem, sonucun boş olup olmadığı kontrol edilmeden @Nullable tarafından işaretlendi. bir nullluk uyarısıdır. Bir yöntemin döndürülen değerinde yalnızca @Nullable kullanın yöntemini kullanın.

Aşağıdaki örnekte, işlem sırasında boş değer gösterilmektedir. Kotlin örnek kodu, Oluşturulan bayt koduna otomatik olarak eklendiği için @NonNull ek açıklaması null olmayan bir tür belirtildiğinde. Java örneği, @NonNull ek açıklamasından yararlanıyor iletilen parametre değerlerinin doğruluğunu kontrol etmek için context ve attrs parametrelerinde boş değildir. Ayrıca onCreateView() yönteminin kendisinin null değer döndürmediği de kontrol edilir:

Kotlin

...
    /** Annotation not used because of the safe-call operator(?)**/
    override fun onCreateView(
            name: String?,
            context: Context,
            attrs: AttributeSet
    ): View? {
        ...
    }
...

Java

import androidx.annotation.NonNull;
...
    /** Add support for inflating the <fragment> tag. **/
    @NonNull
    @Override
    public View onCreateView(String name, @NonNull Context context,
      @NonNull AttributeSet attrs) {
      ...
      }
...

Boş değer atanabilirlik analizi

Android Studio, otomatik olarak çıkarımda bulunmak için boş değer atanabilirlik analizi çalıştırmayı destekler kullanabilirsiniz. Boş değer analizi taramaları aşağıdakileri tespit etmek için kodunuzdaki yöntem hiyerarşileri genelinde sözleşmeleri yapar:

  • Boş değer döndürebilen çağrı yöntemleri.
  • Null döndürmemesi gereken yöntemler.
  • Alanlar, yerel değişkenler ve parametreler gibi null.
  • Alanlar, yerel değişkenler ve parametreler gibi boş bir değer kullanabilirsiniz.

Ardından analiz, uygun boş ek açıklamaları otomatik olarak tespit edilen yerleri görebilirsiniz.

Android Studio'da boş değer atanabilirlik analizi çalıştırmak için Analiz et'i > Boşluğu Çıkar. Android Studio, Android @Nullable ve @NonNull ek açıklamalarını tespit etmiş olursunuz. Boş analiz çalıştırdıktan sonra, enjekte edilen ek açıklamalar.

Not: Boş değer ek açıklamaları eklerken otomatik tamamlama IntelliJ'i öner @Nullable ve Android boş ek açıklamaları yerine @NotNull ek açıklamaları ve ilgili kitaplığı otomatik olarak içe aktarabilir. Ancak Android Studio, lint kontrol aracı yalnızca Android null ek açıklamalarını arar. Doğrulama sırasında ek açıklamaları kullanmak istiyorsanız projenizde Android null ek açıklamalarının lint denetleyici, kod incelemesi sırasında sizi düzgün bir şekilde bilgilendirebilir.

Kaynak ek açıklamaları

Çekilebilir ve dize kaynakları gibi kaynaklara yapılan Android referansları tam sayı olarak geçirildiği için kaynak türlerini doğrulamak yararlı olabilir.

Bir parametrenin String gibi belirli bir kaynak türüne başvurmasını bekleyen kod beklenen referans türüne (int) iletilebilir, ancak gerçekte farklı bir referans türüne R.string kaynağı gibi.

Örneğin, @StringRes ek açıklamalarını bir kaynak parametresinin, aşağıda gösterildiği gibi bir R.string referansı içerip içermediğini kontrol edin:

Kotlin

abstract fun setTitle(@StringRes resId: Int)

Java

public abstract void setTitle(@StringRes int resId)

Kod incelemesi sırasında R.string referansı olursa ek açıklama bir uyarı oluşturur iletilemez.

@DrawableRes, @DimenRes, @ColorRes ve @InterpolatorRes gibi diğer kaynak türlerine yönelik ek açıklamalar aynı ek açıklama biçimi kullanılarak eklenir ve kod incelemesi sırasında çalıştırılır.

Parametreniz birden çok kaynak türünü desteklediğinden belirli bir kaynağa birden fazla kaynak türü ek açıklaması parametresinden sonra bir değer girin. @AnyRes hesabını kullan ifadesini ekleyin.R

Bunu belirtmek için @ColorRes kullanabilirsiniz, ancak parametresi bir renk kaynağı, bir renk tam sayısı (RRGGBB veya AARRGGBB biçimi) renk kaynağı olarak tanınmıyor. Bunun yerine, @ColorInt ek açıklamasını kullanarak değeri, parametrenin bir renk tam sayısı olması gerektiğini belirtir. Derleme araçları, test sırasında bir renk tam sayısı yerine android.R.color.black gibi bir renk kaynağı kimliği aktarır, ek açıklamalı yöntemlere geri dönelim.

İleti dizisi ek açıklamaları

İleti dizisi notları, bir yöntemin belirli bir thread. Aşağıdaki ileti dizisi ek açıklamalar desteklenir:

Derleme araçları, @MainThread ve @UiThread ek açıklamasını değiştirilebilir olarak sunar, böylece @UiThread ek açıklamasını çağırabilirsiniz. @MainThread yöntem ve bunun tersi de geçerlidir. Ancak kullanıcı arayüzü için Birden çok görünüme sahip sistem uygulamaları söz konusu olduğunda, iş parçacığının ana iş parçacığından farklı olması gerekir farklı ileti dizilerinde gösteriliyor. Bu nedenle, bir uygulamanın görünüm hiyerarşisiyle ilişkili yöntemlere açıklama eklemeniz gerekir. @UiThread ile yalnızca uygulamanın yaşam döngüsüyle ilişkili yöntemlere @MainThread.

Bir sınıftaki tüm yöntemler aynı ileti dizisi gereksinimini paylaşıyorsa tek bir ileti dizisi ekleyebilirsiniz ek açıklamasını da sınıfa ekleyin ve bu ek açıklama ile sınıftaki tüm yöntemlerin aynı türden ileti dizisi.

İleti dizisi ek açıklamalarının yaygın bir kullanımı, @WorkerThread yalnızca uygun bir arka plan ileti dizisinden çağrılır.

Değer kısıtlaması ek açıklamaları

@IntRange, @FloatRange ve @Size ek açıklama geçirilen parametrelerin değerlerini doğrulayın. Hem @IntRange hem de @FloatRange en çok, kullanıcıların aralığı yanlış alabileceği parametrelere uygulandığında işe yarar.

@IntRange ek açıklaması, bir tamsayı veya uzun parametrenin değer, belirtilen aralıkta. Aşağıdaki örnekte alpha parametresi 0 ile 255 arasında bir tam sayı değeri içermelidir:

Kotlin

fun setAlpha(@IntRange(from = 0, to = 255) alpha: Int) { ... }

Java

public void setAlpha(@IntRange(from=0,to=255) int alpha) { ... }

@FloatRange ek açıklaması, bir kayan noktalı parametre mi yoksa çift parametre mi olduğunu kontrol eder değeri, belirtilen bir kayan nokta değerleri aralığında olmalıdır. Aşağıdaki örnekte, alpha parametresi 0,0 ile 1,0 arasında bir kayan noktalı değer içermelidir:

Kotlin

fun setAlpha(@FloatRange(from = 0.0, to = 1.0) alpha: Float) {...}

Java

public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {...}

@Size ek açıklaması, bir koleksiyonun boyutunu kontrol eder veya dizi veya dizenin uzunluğudur. @Size ek açıklaması, doğrulama için kullanılabilir şu nitelikleri sayabiliriz:

  • Minimum boyut, ör. @Size(min=2)
  • Maksimum boyut (ör. @Size(max=2))
  • Tam boyut (ör. @Size(2))
  • Boyutun katları olması gereken bir sayı (ör. @Size(multiple=2))

Örneğin, @Size(min=1) bir koleksiyonun boş olup olmadığını kontrol eder ve @Size(3) bir dizinin tam olarak üç değer içerdiğini doğrular.

Aşağıdaki örnekte, location dizisi en az bir öğe içermelidir:

Kotlin

fun getLocation(button: View, @Size(min=1) location: IntArray) {
    button.getLocationOnScreen(location)
}

Java

void getLocation(View button, @Size(min=1) int[] location) {
    button.getLocationOnScreen(location);
}

İzin ek açıklamaları

@RequiresPermission kullanın ek açıklamasına yer verir. Tek bir izni kontrol etmek için geçerli izinler listesinden anyOf özelliğini kullanın. Bir dizi allOf özelliğini kullanın. Aşağıdaki örnekte Yöntemi çağıran kişininsetWallpaper() permission.SET_WALLPAPERS izni:

Kotlin

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
@Throws(IOException::class)
abstract fun setWallpaper(bitmap: Bitmap)

Java

@RequiresPermission(Manifest.permission.SET_WALLPAPER)
public abstract void setWallpaper(Bitmap bitmap) throws IOException;

Aşağıdaki örnek, copyImageFile() yöntemini çağıran kişinin kullanılmasını gerektiriyor hem harici depolama alanına okuma erişimi hem de konuma okuma erişimi olması Kopyalanan resimdeki meta veri:

Kotlin

@RequiresPermission(allOf = [
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.ACCESS_MEDIA_LOCATION
])
fun copyImageFile(dest: String, source: String) {
    ...
}

Java

@RequiresPermission(allOf = {
    Manifest.permission.READ_EXTERNAL_STORAGE,
    Manifest.permission.ACCESS_MEDIA_LOCATION})
public static final void copyImageFile(String dest, String source) {
    //...
}

Amaçlarla ilgili izinler için intent işlem adı:

Kotlin

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
const val ACTION_REQUEST_DISCOVERABLE = "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE"

Java

@RequiresPermission(android.Manifest.permission.BLUETOOTH)
public static final String ACTION_REQUEST_DISCOVERABLE =
            "android.bluetooth.adapter.action.REQUEST_DISCOVERABLE";

Okuma ve yazma için ayrı izinlere ihtiyaç duyan içerik sağlayıcılardaki izinler erişimi için her izin koşulunu @RequiresPermission.Read içinde sarmalayın. veya @RequiresPermission.Write not:

Kotlin

@RequiresPermission.Read(RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(RequiresPermission(WRITE_HISTORY_BOOKMARKS))
val BOOKMARKS_URI = Uri.parse("content://browser/bookmarks")

Java

@RequiresPermission.Read(@RequiresPermission(READ_HISTORY_BOOKMARKS))
@RequiresPermission.Write(@RequiresPermission(WRITE_HISTORY_BOOKMARKS))
public static final Uri BOOKMARKS_URI = Uri.parse("content://browser/bookmarks");

Dolaylı izinler

Bir izin, yöntemin parametresine sağlanan belirli değere bağlı olduğunda @RequiresPermission parametresi, belirli izinleri listelemeden kullanır. Örneğin, startActivity(Intent) yöntemi, yönteme iletilen amaç üzerinde dolaylı izin kullanır:

Kotlin

abstract fun startActivity(@RequiresPermission intent: Intent, bundle: Bundle?)

Java

public abstract void startActivity(@RequiresPermission Intent intent, @Nullable Bundle)

Dolaylı izinleri kullandığınızda derleme araçları, bağımsız değişkeni herhangi bir @RequiresPermission ek açıklamasına sahip olmalıdır. Daha sonra parametrede bulunan tüm ek açıklamaları yöntemin kendisinde zorunlu kılın. startActivity(Intent) örneğinde, Intent sınıfındaki ek açıklamalarda uyarılara neden oluyor uygun olmayan bir amaç olduğunda, startActivity(Intent) öğesinin geçersiz kullanımlarında izinleri Şekil 1'de gösterildiği gibi yönteme aktarılır.

Şekil 1. Dolaylı bir uyarıdan oluşturulan izinleri ek açıklamasını startActivity(Intent) yönteminde kullanabilirsiniz.

Derleme araçları, startActivity(Intent) alanında ek açıklamadan uyarı oluşturur Intent sınıfındaki karşılık gelen intent işlemi adına ekleyin:

Kotlin

@RequiresPermission(Manifest.permission.CALL_PHONE)
const val ACTION_CALL = "android.intent.action.CALL"

Java

@RequiresPermission(Manifest.permission.CALL_PHONE)
public static final String ACTION_CALL = "android.intent.action.CALL";

Gerekirse, @RequiresPermission yerine kullanabilirsiniz. Not eklerken @RequiresPermission.Read veya @RequiresPermission.Write bir yöntemin parametresine benzer. Ancak @RequiresPermission, dolaylı izinler için okuma veya yazma izni ek açıklamalarıyla birlikte kullanılamaz.

Döndürme değeri ek açıklamaları

@CheckResult ek açıklamasını kullanarak bir yöntemin sonucunun veya döndürülen değerinin gerçekten kullanıldığını doğrular. Her ekip için geçersiz olmayan yöntem ile @CheckResult, sonuçlarını netleştirmek için yöntemlerdir.

Örneğin, yeni Java geliştiricileri genellikle yanlışlıkla <String>.trim(), orijinal dizedeki boşlukları kaldırır. Not/çizim ekleniyor @CheckResult flag'leri olan yöntem, <String>.trim() öğesini kullanıyor Bu yöntemde çağrı, yöntemin döndürülen değeriyle hiçbir şey yapmaz.

Aşağıdaki örnekte checkPermissions() yöntemin döndürülen değerinin her zaman bu geçerlidir. Ayrıca enforcePermission() geliştiriciye bunun yerine önerilecek bir yöntem olarak kullanabilirsiniz:

Kotlin

@CheckResult(suggest = "#enforcePermission(String,int,int,String)")
abstract fun checkPermission(permission: String, pid: Int, uid: Int): Int

Java

@CheckResult(suggest="#enforcePermission(String,int,int,String)")
public abstract int checkPermission(@NonNull String permission, int pid, int uid);

CallSuper ek açıklamaları

@CallSuper ek açıklamasını kullanarak bir geçersiz kılma yönteminin, yöntemin süper uygulamasını çağırdığını doğrulamalıdır.

Aşağıdakiler örneği, herhangi bir geçersiz kılma yöntemininonCreate() uygulamalar super.onCreate() çağrısı yapar:

Kotlin

@CallSuper
override fun onCreate(savedInstanceState: Bundle?) {
}

Java

@CallSuper
protected void onCreate(Bundle savedInstanceState) {
}

Typedef ek açıklamaları

Typedef ek açıklamaları, belirli bir parametrenin, değer veya değer döndürüp döndürmediğini kontrol eder. veya alan, belirli bir sabit değer grubuna referans verir. Ayrıca kod tamamlamanın otomatik olarak izin verilen sabit değerleri sunun.

@IntDef ve @StringDef tamsayı ve dize kümelerinden oluşan numaralandırılmış ek açıklamalar oluşturarak diğer bulunur.

Typedef ek açıklamaları, yeni numaralandırılmış ek açıklama türünü bildirmek için @interface kullanır. @IntDef ve @StringDef ek açıklamalarıyla birlikte @Retention, yeni ek açıklamaya ek açıklama ekleyin ve numaralandırılmış tür. @Retention(RetentionPolicy.SOURCE) ek açıklaması, derleyiciye .class dosyasında saklamaması için bir uyarı oluşturun.

Aşağıdaki örnekte, bir değerin olarak tanımlar:

Kotlin

import androidx.annotation.IntDef
//...
// Define the list of accepted constants and declare the NavigationMode annotation.
@Retention(AnnotationRetention.SOURCE)
@IntDef(NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS)
annotation class NavigationMode

// Declare the constants.
const val NAVIGATION_MODE_STANDARD = 0
const val NAVIGATION_MODE_LIST = 1
const val NAVIGATION_MODE_TABS = 2

abstract class ActionBar {

    // Decorate the target methods with the annotation.
    // Attach the annotation.
    @get:NavigationMode
    @setparam:NavigationMode
    abstract var navigationMode: Int

}

Java

import androidx.annotation.IntDef;
//...
public abstract class ActionBar {
    //...
    // Define the list of accepted constants and declare the NavigationMode annotation.
    @Retention(RetentionPolicy.SOURCE)
    @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
    public @interface NavigationMode {}

    // Declare the constants.
    public static final int NAVIGATION_MODE_STANDARD = 0;
    public static final int NAVIGATION_MODE_LIST = 1;
    public static final int NAVIGATION_MODE_TABS = 2;

    // Decorate the target methods with the annotation.
    @NavigationMode
    public abstract int getNavigationMode();

    // Attach the annotation.
    public abstract void setNavigationMode(@NavigationMode int mode);
}

Bu kodu derlediğinizde, mode parametresi uyumlu değilse bir uyarı oluşturulur. tanımlanan sabit değerlerden birine referans verin (NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST veya NAVIGATION_MODE_TABS).

@IntDef ve @IntRange işaretlerini birleştirerek Tam sayı, belirli bir sabit sayı veya aralık içindeki bir değer olabilir.

Sabit değerleri işaretlerle birleştirmeyi etkinleştir

Kullanıcılar izin verilen sabit değerleri bir işaretle (| gibi) birleştirebiliyorsa &, ^ vb.) temel alarak bir ek açıklama flag özelliğini kullanabilirsiniz.

Aşağıdaki örnek, geçerli bir listeyle DisplayOptions ek açıklaması oluşturur DISPLAY_ sabitleri:

Kotlin

import androidx.annotation.IntDef
...

@IntDef(flag = true, value = [
    DISPLAY_USE_LOGO,
    DISPLAY_SHOW_HOME,
    DISPLAY_HOME_AS_UP,
    DISPLAY_SHOW_TITLE,
    DISPLAY_SHOW_CUSTOM
])
@Retention(AnnotationRetention.SOURCE)
annotation class DisplayOptions
...

Java

import androidx.annotation.IntDef;
...

@IntDef(flag=true, value={
        DISPLAY_USE_LOGO,
        DISPLAY_SHOW_HOME,
        DISPLAY_HOME_AS_UP,
        DISPLAY_SHOW_TITLE,
        DISPLAY_SHOW_CUSTOM
})
@Retention(RetentionPolicy.SOURCE)
public @interface DisplayOptions {}

...

Bir ek açıklama bayrağıyla kod derlediğinizde, veya döndürülen değer geçerli bir kalıptan yararlanmıyor.

Ek açıklamayı koru

@Keep ek açıklama, kod kullanıldığında ek açıklamalı bir sınıfın veya yöntemin kaldırılmamasını sağlar. derleme sırasında küçültülür. Bu ek açıklama, genelde derleyicinin şunları yapmasını önlemek için yansıma yoluyla erişilen yöntem ve sınıflara eklenir olarak değerlendirilecektir.

Dikkat: Ek açıklama eklediğiniz sınıflar ve yöntemler @Keep kullanmak, hiç kapatmasanız bile her zaman uygulamanızın APK'sında bu sınıflara ve yöntemlere uygulamanızın mantığına uygun olarak referansta bulunmalısınız.

Uygulamanızın boyutunu küçük tutmak için her @Keep ek açıklaması için ekleyebilirsiniz. Proje yöneticisi olarak ek açıklamalı bir sınıfa veya yönteme erişmek için ProGuard kurallarınızda sınıfı belirten -if koşulu düşünme egzersizi yapmaya karar veriyor.

Kodunuzu küçültme ve hangi kodun kaldırılmayacağını belirtme hakkında daha fazla bilgi için Uygulamanızı küçültme, kodunu karartma ve optimize etme konusuna bakın.

Kod görünürlüğüyle ilgili ek açıklamalar

Kodun belirli bölümlerinin görünürlüğünü belirtmek için aşağıdaki ek açıklamaları kullanın: yöntemler, sınıflar, alanlar veya paketler.

Kodu test için görünür yap

İlgili içeriği oluşturmak için kullanılan @VisibleForTesting. ek açıklama, ek açıklama eklenen bir yöntemin, dönüşüm işlemini yerine getirmek için yöntem test edilebilir. Bu ek açıklama, şunları yapmanızı sağlayan isteğe bağlı bir otherwise bağımsız değişkenine sahiptir: yöntemin görünür hale getirilmesine gerek olmadığı sürece ne kadar görünür olacağını belirlemek kullanmaya karar verebilir. Lint, istenen görünürlüğü sağlamak için otherwise bağımsız değişkenini kullanır.

Aşağıdaki örnekte myMethod() normal olarak private değerine sahiptir, ancak Testler için package-private. VisibleForTesting.PRIVATE ile Bu yöntem bağlam (ör. farklı bir derleme biriminden), private erişiminin izin verdiği bağlam.

Kotlin

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun myMethod() {
    ...
}

Java

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
void myMethod() { ... }

Ayrıca şunu da belirtebilirsiniz: @VisibleForTesting(otherwise = VisibleForTesting.NONE) bir yöntemin yalnızca test amaçlı olduğunu gösterir. Bu form, @RestrictTo(TESTS) Her ikisi de aynı lint kontrolünü gerçekleştirir.

API'leri kısıtlama

@RestrictTo ek açıklama, ek açıklamalı API'ye (paket, sınıf veya yöntem) erişimin sınırlı olduğunu gösterir. şu şekilde:

Alt sınıflar

İçerikleri kısıtlamak için @RestrictTo(RestrictTo.Scope.SUBCLASSES) ek açıklama formunu kullanın Yalnızca alt sınıflara API erişimi.

Yalnızca ek açıklamalı sınıfı genişleten sınıflar bu API'ye erişebilir. Java protected değiştiricisi erişime izin verdiği için yeterince kısıtlayıcı değil alakası olmayan sınıflardan geliyor. Ayrıca, bir listeden ayrılmak istediğiniz public yöntemini kullanarak daha fazla esneklik sağlayabilirsiniz. Çünkü daha önce protected ve geçersiz kılınan public yöntemi. Ancak bir bu, sınıfın yalnızca sınıf içindeki veya alt sınıflardaki kullanımlara yönelik olduğuna işaret eder.

Kütüphaneler

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX) ek açıklama formunu kullanarak API erişimini yalnızca kitaplıklarınızla sınırlayın.

Ek açıklamalı API'ye yalnızca kitaplık kodunuz erişebilir. Bu, yalnızca kodunuzu düzenlemenize değil, istediğiniz paket hiyerarşisini kolayca yükleyebilirsiniz. koda ekleyebilirsiniz. Bu seçenek Jetpack'te zaten mevcuttur çok fazla uygulama kodunun bulunduğu kitaplıklar da vardır. Ancak, diğer Jetpack kitaplıklarında paylaşmak için public olması gerekir.

Test

Diğer kullanıcıların sızdırılmasını önlemek için @RestrictTo(RestrictTo.Scope.TESTS) ek açıklama formunu kullanın geliştiricilerin test API'lerinize erişmesini önler.

Ek açıklamalı API'ye yalnızca test kodu erişebilir. Bu, diğer geliştiricilerin API'leri yalnızca test amaçlı geliştirme için kullanmanızı önler.