LintとAnnotationsを使ってコードの品質を向上させます.

9433 ワード

Lintを使ってコードをチェックします.
Android Studioでlintを使用します.
Android Studioでは、あなたがbuildアプリを利用すると、LintとIDE検査が自動的に実行されます.
File>Settings>Editor>Inspectionsメニューを使って検査設定画面を開くことができます.
Android Studioを使用して、build.gradleファイルにlintOptions属性を追加できます.Lintの検査に関する設定ができます.以下は例示コードです.
android {
    lintOptions {
       // set to true to turn off analysis progress reporting by lint
       quiet true
       // if true, stop the gradle build if errors are found
       abortOnError false
       // if true, only report errors
       ignoreWarnings true
       }
       ...
    }
指定されたディレクトリで右クリックし、Analyze > Inspect Codeを右クリックして手動のLintコードチェックができます.
命令行をlintで走る
プロジェクトディレクトリのすべてのファイルをチェック:
lint [flags] 
次のコマンドを使用して、myprojectディレクトリのすべてのファイルとサブファイルをスキャンできます.パラメータMissingPrefixは、Androidの名前付きプレフィックスのみをスキャンするXML属性を表している.
lint --check MissingPrefix myproject 
使用方法とパラメータをコマンドで確認します.
lint --help
lintを設定
Android Studioにlintを配置する
Lintのwarningsとerrorsの結果が見られます.
  • エディタからヒントテキストが表示されます.Lintは黄色が高くて、問題のあるコードがあるか、赤いアンダーラインを使って深刻な問題を示します.
  • 手動Analyze > Inspect Codeの後、検査結果ウィンドウにあります.
  • デフォルトのLintチェックを設定します.
  • プロジェクトを開けて、File>Other Settings>Default Settingsを選択して、Editor>Inspectionsを選択します.
  • はProfileオプションの中で、Default or Project Defaultを選択してグローバルスコープかそれともprojectスコープかを選択します.
  • は、ウィンドウで設定します.
  • 手動で実行するLintチェックを設定します.
  • プロジェクトを開けて、テストするディレクトリを選択してください.Analyze > Inspect Code.
  • を使用します.
  • チェック範囲ポップアップボックスの中から、scopeとprofileをチェックすることを選択します.scopeはどのファイルを指定しますか?分析したいです.profileはあなたが実行したいLint checksを指定します.
  • プロファイルを使用するlint.xml
    Lintの検査属性は、lint.xmlを使用して指定できます.このファイルを手動で作成すると、プロジェクトのルートディレクトリに入れます.Android Studioで属性を確認すると、lint.xmlは自動的にprojectルートディレクトリの下に作成されます.
    lint.xml構造は、父によって構成され、各は、Lintによって定義された唯一のID属性を指定する.
    
    
        
        
    
        
        
            
            
        
    
        
        
            
        
    
        
        
    
    
    JavaとXMLソースファイルにlintチェックを設定します.
    javaとXMLソースファイルでLintチェックを無効にすることができます.
  • は、javaファイルにを注釈して、Java classまたは方法をLint検査しなくてもいいです.
  • 「NewAppli」問題のチェックをオフにします.@SuppressLint「PaserErrror」の問題チェックをオフにします.@SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main);、Javaファイルのすべてのチェックをオフにします.
  • XMLファイルに@SuppressLint("ParserError") public class FeedProvider extends ContentProvider {属性を使用してXMLファイル作成エリアのLintチェックを禁止します.親コントロールのignore属性は、布団コントロールで継承されます.「UniusedResource」の問題チェックをオフにします.
        
        
            
        
    
    複数の問題チェックをオフにします.
    tools:ignore="NewApi,StringFormatInvalid"
    
    すべての問題チェックをオフにします.
    tools:ignore="all"
    
  • .
    Annotationsを使ってコードをチェックします.
    Annotationsはコードチェックツールにヒントを与えて、微妙なコード問題のチェックを助けることができます.Annotationsは、メタデータとして変数、パラメータ、方法の入力パラメータ、戻り値などに追加されます.コードチェックツールを使用すると、アンノテーティングスは空のポインタ異常やリソースファイルタイプの衝突などの問題のチェックを助けることができます.
    基本的なコメントを追加します.
    コードにコメントを使用するには、Support-Annotationsライブラリを追加する必要があります.
  • は、Android Studioによって
  • を追加することができる.
  • またはgradle.xmlに直接
  • を追加します.
    dependencies {
        compile 'com.android.support:support-annotations:23.3.0'
    } 
    
    Nullness Annotationsを追加します.@SuppressLint("all") and tools:ignore annotationsは、変数、パラメータ、または戻り値のnull状況を確認することができる.@Nullableを使用して、着信パラメータが空でないことを確認する.
    import android.support.annotation.NonNull;
    ...
    
        /** Add support for inflating the  tag. */
        @NonNull
        @Override
        public View onCreateView(String name, @NonNull Context context,
          @NonNull AttributeSet attrs) {
          ...
          }
    ...
    
    Nullability Analysis
    Android Studioはnullability分析によってコードの中で動的な推論とnullness annotationsを挿入することをサポートします.空性分析のために、方法ツリーを貫くいくつかの約束に基づいてスキャンを行います.
  • 方法は、空
  • に戻ります.
  • 方法は、空に戻すことができません.
  • 変数は、ローカル変数やパラメータなどの空です.
  • 変数は、ローカル変数やパラメータなどの空です.
  • この解析が完了すると、検査されたところに、適したnull annotationsが動的に追加されます.
    Android Studioでnullabilityのチェックを行い、@NonNullを選択します.Android Studioは@Nullable and@nonNull annotationsを挿入します.検査が必要な位置です.空のポインター分析が完了したら、注入されたアンノテーティングスを確認したほうがいいです.
    Resource Annotationsを追加します.
    Resource Annotationsは、入力されたパラメータが指定されたリソースタイプ@NonNull Analyze > Infer Nullity @StringRes @DrawableRes @DimenRes 142 142であるかどうかを検証する.
    import android.support.annotation.StringRes;
    ...
        public abstract void setTitle(@StringRes int resId);
        ...
    
    Thread Annotationsを追加します.
    Thread annotationsは、方法が指定されたスレッドで呼び出されているかどうかを確認します.以下の4つのタイプがあります.@ColorRes @InterpolatorRes @UiThread @MainThread 142.@WorkerThread and the @BinderThreadは交換可能である.
    Value Contront Annotationsを追加します.@MainThread@UiThread@IntRangeは、渡されたパラメータ値を検証する.@FloatRangeは、指定された整形範囲内にあるかどうかを検証する.例では、アルファパラメータは0~255の間に含まれています.
    public void setAlpha(@IntRange(from=0,to=255) int alpha) { … }
    
    @Sizeは、指定された浮動小数点型の範囲内にあるかどうかを検査する.例えば、アルファパラメータが0.0 to 1.0の間にあることを確認します.
    public void setAlpha(@FloatRange(from=0.0, to=1.0) float alpha) {...}
    
    @IntRangeは、コンテナまたは配列の長さを検証する.例えば、@FloatRangeを使用して、一つの容器が空でないことを確認し、@Sizeを使用して、容器が二つの値しかないと判断した.例えば、location配列の知識を決定するためには、要素が含まれています.
    int[] location = new int[3];
    button.getLocationOnScreen(@Size(min=1) location);
    
    Permission Annotationsを追加します.
    @RequiresPermission検査方法の使用者権限.@Size(min=1)属性は、1つを満たすことを確認するために使用され、@Size(2)属性は、すべてのatributeを満たすことを確認するために使用される.
    set Wallpaper方法はpermission.SET_が必要です.WALLPAPERS権限.
    @RequiresPermission(Manifest.permission.SET_WALLPAPER)
    public abstract void setWallpaper(Bitmap bitmap) throws IOException;
    
    @RequiresPermission(allOf = {
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE})
    public static final void copyFile(String dest, String source) {
        ...
    }
    
    CheckResults Annotationsを追加します.
    @CheckResultsチェック方法インターフェースまたは戻り値が本当に使われましたか?以下の例では、check Permissions方法による戻り値の決定に使用されました.使用していない場合は、enforcePermission方法で代替することを提案します.
    @CheckResult(suggest="#enforcePermission(String,int,int,String)")
    public abstract int checkPermission(@NonNull String permission, int pid, int uid);
    
    CallSuper Annotationsを追加します.anyOfを使用して上書きをチェックする方法は、親の実装方法を呼び出す必要があります.例として、onCreateを上書きする方法はsuper.onCreateを呼び出す必要があります.
     @CallSuper
    protected void onCreate(Bundle savedInstanceState) {
    }
    
    Emmerated Annotationsを作成します.allOfおよび@CallSuperを使用して注釈を作成することができ、インテグとストリングタイプのセットを作成して、他の変数の参照タイプを検証することができる.
    import android.support.annotation.IntDef;
    ...
    public abstract class ActionBar {
        ...
        //Define the list of accepted constants
        @IntDef({NAVIGATION_MODE_STANDARD, NAVIGATION_MODE_LIST, NAVIGATION_MODE_TABS})
    
        //Tell the compiler not to store annotation data in the .class file
        @Retention(RetentionPolicy.SOURCE)
    
        //Declare the NavigationMode annotation
        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);
    
    コードを翻訳する時、もしmodeタイプが定義中の(NAVIGATIONS_MODE_STANDARD、NAVIGATIONS_MODE_LIST、or NAVIGATIONS_MODE_TABS)でないと警告が発生します.@IntDefを使用して、パラメータまたは戻り値が指定されたフォーマットにあるかどうかを確認することができる.
    import android.support.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 {}
    
    ...
    
    参考文献
    Improve Your Code with Lint Improve Code Inspection with Annotations support-annotationsコードの質を向上させる-ツール編