美文网首页Android笔记
静态代码lint常见报错处理

静态代码lint常见报错处理

作者: 草帽小子J | 来源:发表于2018-11-23 17:31 被阅读0次

    有疑问可参看lint处理
    官方相关
    最近一周做了一些关于Android静态代码检测的东西,对于一些常见的lint警告做了记录,其实对于常见的lint警告我们得处理步骤可以分为如下:

    • 查看lint报错的错误类型
    • 追踪到代码处,确定是否代码自身问题
    • 分析该类错误影响范围
    • 确定解决方式(规范代码、添加注解、添加规则)
    规范代码

    一般是由于开发者在开发时,不细心造成误写等,或者是某些API过时,需要进行手动修改。

    添加注解

    对于某些特殊需求,可以通过加注解来避免lint报错,以下给出常见的添加注解的地方

    java源代码
    @SuppressLint("xxxx") // xxxx代表某种lint检测类型
    public void test(){
    }
    
    xml

    首先添加命名空间

    namespace xmlns:tools="http://schemas.android.com/tools"
    

    然后在报错地方添加

        <!--xxxx代表某种lint检测类型,或者可以是直接all,禁止掉所有检测类型-->
    tools:ignore="xxxx"
    

    添加规则(lint.xml文件)

    对于某些大规模类型的,或者是知道自己必须这么干时,就可以添加规则来规避某种类型的所有lint报错或者是指定路径,亦或者是通过正则指定。
    添加规则格式为:
    规避一种类型

     <!--xxxx代表某种lint检测类型-->
     <issue id="xxxx" severity="ignore"/>
    

    指定路径

     <!--xxxx代表某种lint检测类型-->
     <!--****代表指定路径或者是文件-->
     <!--####通过正则来指定相关文件或者属性等-->
    <issue id="xxxx">
            <ignore path="****"/>
            <ignore regexp="####"/>
    </issue>
    

    改变lint检测类型

     <!--xxxx代表某种lint检测类型-->
     <!--severity有不同种程度的类型  Fatal、Error 、Warning 、Information 、Ignore-->
    <issue id="xxxx" severity="ignore"/>
    

    接下来记录下我见到和处理的一些报错类型

    1. Missing commit() on SharedPreference editor

    缺少commit()方法调用,添加即可;但是你或许会遇到下面这个问题,它依然会lint检测报错:

    public void test(){
            SharedPreferencesUtils.apply(dataStore.edit() .putString(xxx, xxx));
    }
    .
    .
    .
    public static void apply(SharedPreferences.Editor editor) {
            editor.apply();
    }
    

    如果是这样的话,建议到指定方法调用处添加注解

    @SuppressLint(“CommitPrefEdits")

    2. Use apply() on SharedPreferences

    建议使用apply()替换commit(),对于两个方法的区别,建议看看这里

    3. Mismatched Styleable/Custom View Name

    建议在自定义View的时候,尽量保证View名称与<declare-styleable 的name一致,
    若有特殊需求需要对指定进行添加注解.

    @SuppressLint(“CustomViewStyleable")
    若存在特殊需求,则更建议在lint.xml中添加规则:
    <issue id="CustomViewStyleable" severity="ignore"/>

    4. Duplicate ids across layouts combined with include tags

    在布局中,通过<include>进来的layout,存在和父布局中相同id的view,修改建议,修改布局中id命名.

    5. Using android.media.ExifInterface

    Avoid using android.media.ExifInterface;use android.support.media.ExifInterface from the support library instead.
    使用support包相关替换

    6. Hardcoded reference to /sdcard

    Do not hardcode "/data/"; use Context.getFilesDir().getPath() instead
    lint 给出的修改建议是使用Context.getFilesDir().getPath() 替换直接通过路径拼接,但是根据场景可以自变吧;若不想通过这种方式可以直接忽略,添加注解
    类似错误场景:

    public class DbCopyHelper {
    public static final String DB_PATH = "/data/data/" + BuildConfig.APPLICATION_ID + "/databases/";
    public static void copy(Context context, String dbName, boolean force) throws Exception {
            File dir = new File(DB_PATH);
    

    @SuppressLint(“ SdCardPath")
    若存在特殊需求,则更建议在lint.xml中添加规则:
    <issue id="SdCardPath" severity="ignore"/>

    7. Attribute unused on older versions

    建议添加规则

    <!--xxxx代表某个属性-->
    <issue id="UnusedAttribute">
            <ignore regexp=".*xxxxx.*"/>
    </issue>
    

    8. Appcompat Custom Widgets

    This custom view should extend android.support.v7.widget.AppCompatTextView instead
    建议:

    添加规则
    <issue id="AppCompatCustomView" severity="ignore"/>
    或者是添加注解
    @SuppressLint(“AppCompatCustomView”)
    

    9. Restricted API

    xxx can only be called from within the same library group
    方法只能在同一个library group中调用
    添加注解:

    @SuppressLint(“RestrictedApi”)
    或者是规则

    10. Invalid format string

    在进行字符串格式化处理的时候,需要注意formatted=“false” 的影响
    直接添加:

    <!--忽略string的format-->
    <issue id="StringFormatInvalid" severity="ignore"/>
    

    对于formatted=“false”的理解,在进行string.xml编写的时候,注意内容的占位符号,如果大于等于2个占位符的时候,建议使用formatted=“false”,或者使用正则方式%n$m。

    11. Insecure HostnameVerifier

    HostnameVerifier hnv = new HostnameVerifier() {
              @Override
              public boolean verify(String hostname, SSLSession session) {                    
                  return true;
              }
    };
    
    

    场景是直接均返回true,被认为是不安全的操作,若知道自己在干什么,可以直接添加注解

    @SuppressLint("AllowAllHostnameVerifier")

    或者添加规则

    <!--忽略业务中总是返回true-->
    <issue id="BadHostnameVerifier" severity="ignore"/>
    

    12. Insecure TLS/SSL trust manager

    @Override
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws 
           CertificateException {
     
    }
    
    

    建议添加规则

     <!--忽略信任X509TrustManager带来的危险-->
     <issue id="TrustAllX509TrustManager" severity="ignore"/>
    

    13. Obsolete layout params

    Invalid layout param in a LinearLayout: layout_centerInParent
    建议开发中,对布局的使用注意可用性,在参考代码的时候,注意删除修改后不可用的属性

    14. Static Field Leaks

    注意在书写单例的时候,避免使用局部context.均转换为全局上下文

    15. Node can be replaced by a TextView with compound drawables

    这个警告的产生,主要是在一个线性布局中存在一个textView和一个ImageView,认为一个textView可以实现类似的功能,而不用添加多余的嵌套和View;
    但是对于特定的需求,不能保证能实现想要的效果,因此建议添加规则忽略:

    <!--忽略对linearlayout(包含TextView和ImageView)使用的误报-->
    <issue id="UseCompoundDrawables" severity="ignore"/>
    

    16. View Holder Candidates

    Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling
    建议使用ViewHolder

    17. Missing baselineAligned attribute

    缺少baselineAligned这个属性,建议看看这里,这个警告可以根据需求自行添加属性与否,或者是添加规则和注解:

    <!--忽略建议 Set android:baselineAligned="false"-->
    <issue id="DisableBaselineAlignment" severity="ignore"/>
    

    18. Inefficient layout weight

    在使用layout weight属性的时候,应保持相应属性为0dp;或者是在copy代码的时候忘记删除layout_weight代码导致lint检测报错

    19. Nested layout weights

    在布局进行嵌套使用时,父布局与子布局都使用了android:layout_weight,根据需求进行修改;

    20. Useless parent layout

    警告有未使用的父布局,或者是无用的父布局。
    根据实际需求进行忽略或者是删除相应布局

    21. Unused namespace

    命名空间重复添加,或者是删除对应属性后,命名空间未删除,删除.

    22. Hyphen can be replaced with dash

    Replace "-" with an "en dash" character (–, –)
    为了符合人性化的开发,建议直接添加规则忽略

    23. H Ellipsis string can be replaced with ellipsis character

    处理同上

    24. Duplicated icons under different names

    存在不同命名的同文件的icons
    目前的处理是添加规则忽略

    25. Missing accessibility label

    对EditTextView的使用,建议添加一个它的标签View
    根据需要进行忽略 或者添加android:labelfor

    26. Keyboard inaccessible widget

    一个控件(比如图片),如果没有定义focusable(可聚焦的),却定义了是clickable(可点击的),那么是不能通过键盘访问的。所以,需要添加一个focusable=“true”;相当于指定可获取焦点.

    27. Usage of showAsAction=always

    建议使用"ifRoom"替换"always"
    根据需求进行修改或者忽略

    28. Missing inputType

    This text field does not specify an inputType
    建议为EditText指定inputType属性

    29. Overdraw: Painting regions more than once

    Possible overdraw: Root element paints background @color/actionbar_color with a theme that also paints a background (inferred theme is @style/ActionTheme_NoTitle)
    存在过度绘制的可能性
    但是这个报警有点牵强,所以还是先添加规则给过滤吧

    30. Hardware Id Usage

    获取设备相关信息,可以查看官方API,使用其替换方法

    31. Incompatible Gradle Versions

    不兼容依赖版本库,可通过打依赖树,进行查找

    贴出常见的lint issueid和秒速,以供对照

    "ContentDescription": Image without contentDescription
    "AddJavascriptInterface": addJavascriptInterface Called
    "ShortAlarm": Short or Frequent Alarm
    "AllCaps": Combining textAllCaps and markup
    "AllowAllHostnameVerifier": Insecure HostnameVerifier
    "AlwaysShowAction": Usage of showAsAction=always
    "InvalidUsesTagAttribute": Invalid name attribute for uses element.
    "MissingIntentFilterForMediaSearch": Missing intent-filter with action
          android.media.action.MEDIA_PLAY_FROM_SEARCH
    "MissingMediaBrowserServiceIntentFilter": Missing intent-filter with action
          android.media.browse.MediaBrowserService.
    "MissingOnPlayFromSearch": Missing onPlayFromSearch.
    "ImpliedTouchscreenHardware": Hardware feature touchscreen not explicitly
          marked as optional
    "MissingTvBanner": TV Missing Banner
    "MissingLeanbackLauncher": Missing Leanback Launcher Intent Filter.
    "MissingLeanbackSupport": Missing Leanback Support.
    "PermissionImpliesUnsupportedHardware": Permission Implies Unsupported
          Hardware
    "UnsupportedTvHardware": Unsupported TV Hardware Feature
    "SupportAnnotationUsage": Incorrect support annotation usage
    "ShiftFlags": Dangerous Flag Constant Declaration
    "LocalSuppress": @SuppressLint on invalid element
    "SwitchIntDef": Missing @IntDef in Switch
    "UniqueConstants": Overlapping Enumeration Constants
    "InlinedApi": Using inlined constants on older versions
    "Override": Method conflicts with new inherited method
    "ObsoleteSdkInt": Obsolete SDK_INT Version Check
    "NewApi": Calling new methods on older versions
    "UnusedAttribute": Attribute unused on older versions
    "AppCompatMethod": Using Wrong AppCompat Method
    "AppCompatCustomView": Appcompat Custom Widgets
    "AppCompatResource": Menu namespace
    "GoogleAppIndexingApiWarning": Missing support for Firebase App Indexing Api
    "GoogleAppIndexingWarning": Missing support for Firebase App Indexing
    "AppLinksAutoVerifyError": App Links Auto Verification Failure
    "AppLinksAutoVerifyWarning": Potential App Links Auto Verification Failure
    "AppLinkUrlError": URL not supported by app for Firebase App Indexing
    "TestAppLink": Unmatched URLs
    "InconsistentArrays": Inconsistencies in array element counts
    "Assert": Assertions
    "BadHostnameVerifier": Insecure HostnameVerifier
    "BatteryLife": Battery Life Issues
    "BackButton": Back button
    "ButtonCase": Cancel/OK dialog button capitalization
    "ButtonOrder": Button order
    "ButtonStyle": Button should be borderless
    "ByteOrderMark": Byte order mark inside files
    "MissingSuperCall": Missing Super Call
    "AdapterViewChildren": AdapterViews cannot have children in XML
    "ScrollViewCount": ScrollViews can have only one child
    "PermissionImpliesUnsupportedChromeOsHardware": Permission Implies Unsupported
          Chrome OS Hardware
    "UnsupportedChromeOsHardware": Unsupported Chrome OS Hardware Feature
    "GetInstance": Cipher.getInstance with ECB
    "CommitTransaction": Missing commit() calls
    "Recycle": Missing recycle() calls
    "CommitPrefEdits": Missing commit() on SharedPreference editor
    "ApplySharedPref": Use apply() on SharedPreferences
    "ClickableViewAccessibility": Accessibility in Custom Views
    "EasterEgg": Code contains easter egg
    "StopShip": Code contains STOPSHIP marker
    "MissingConstraints": Missing Constraints in ConstraintLayout
    "VulnerableCordovaVersion": Vulnerable Cordova Version
    "CustomViewStyleable": Mismatched Styleable/Custom View Name
    "CutPasteId": Likely cut & paste mistakes
    "SimpleDateFormat": Implied locale in date format
    "SetTextI18n": TextView Internationalization
    "Deprecated": Using deprecated resources
    "MissingPrefix": Missing Android XML namespace
    "MangledCRLF": Mangled file line endings
    "DuplicateIncludedIds": Duplicate ids across layouts combined with include
          tags
    "DuplicateIds": Duplicate ids within a single layout
    "DuplicateDefinition": Duplicate definitions of resources
    "ReferenceType": Incorrect reference types
    "StringEscaping": Invalid string escapes
    "UnpackedNativeCode": Missing android:extractNativeLibs=false
    "UnsafeDynamicallyLoadedCode": load used to dynamically load code
    "UnsafeNativeCodeLocation": Native code outside library directory
    "EllipsizeMaxLines": Combining Ellipsize and Maxlines
    "ExifInterface": Using android.media.ExifInterface
    "ExtraText": Extraneous text in resource files
    "FieldGetter": Using getter instead of field
    "InvalidAnalyticsName": Invalid Analytics Name
    "MissingFirebaseInstanceTokenRefresh": Missing Firebase Instance ID Token
          Refresh
    "FontValidationError": Validation of font files
    "FontValidationWarning": Validation of font files
    "FullBackupContent": Valid Full Backup Content File
    "ValidFragment": Fragment not instantiatable
    "GetContentDescriptionOverride": Overriding getContentDescription() on a View
    "PackageManagerGetSignatures": Potential Multiple Certificate Exploit
    "AccidentalOctal": Accidental Octal
    "UseOfBundledGooglePlayServices": Use of bundled version of Google Play
          services
    "GradleCompatible": Incompatible Gradle Versions
    "GradleDependency": Obsolete Gradle Dependency
    "GradleDeprecated": Deprecated Gradle Construct
    "DevModeObsolete": Dev Mode Obsolete
    "DuplicatePlatformClasses": Duplicate Platform Classes
    "GradleGetter": Gradle Implicit Getter Call
    "GradlePluginVersion": Incompatible Android Gradle Plugin
    "HighAppVersionCode": VersionCode too high
    "GradleIdeError": Gradle IDE Support Issues
    "GradlePath": Gradle Path Issues
    "GradleDynamicVersion": Gradle Dynamic Version
    "NotInterpolated": Incorrect Interpolation
    "StringShouldBeInt": String should be int
    "NewerVersionAvailable": Newer Library Versions Available
    "MinSdkTooLow": API Version Too Low
    "GridLayout": GridLayout validation
    "HandlerLeak": Handler reference leaks
    "HardcodedDebugMode": Hardcoded value of android:debuggable in the manifest
    "HardcodedText": Hardcoded text
    "HardwareIds": Hardware Id Usage
    "IconDuplicatesConfig": Identical bitmaps across various configurations
    "IconDuplicates": Duplicated icons under different names
    "GifUsage": Using .gif format for bitmaps is discouraged
    "IconColors": Icon colors do not follow the recommended visual style
    "IconDensities": Icon densities validation
    "IconDipSize": Icon density-independent size validation
    "IconExpectedSize": Icon has incorrect size
    "IconExtension": Icon format does not match the file extension
    "IconLauncherShape": The launcher icon shape should use a distinct silhouette
    "IconLocation": Image defined in density-independent drawable folder
    "IconMissingDensityFolder": Missing density folder
    "IconMixedNinePatch": Clashing PNG and 9-PNG files
    "IconNoDpi": Icon appears in both -nodpi and dpi folders
    "IconXmlAndPng": Icon is specified both as .xml file and as a bitmap
    "ConvertToWebp": Convert to WebP
    "WebpUnsupported": WebP Unsupported
    "IncludeLayoutParam": Ignored layout params on include
    "DisableBaselineAlignment": Missing baselineAligned attribute
    "InefficientWeight": Inefficient layout weight
    "NestedWeights": Nested layout weights
    "Orientation": Missing explicit orientation
    "Suspicious0dp": Suspicious 0dp dimension
    "InstantApps": Instant App Issues
    "DuplicateDivider": Unnecessary Divider Copy
    "TrustAllX509TrustManager": Insecure TLS/SSL trust manager
    "InvalidImeActionId": Invalid imeActionId declaration
    "InvalidPackage": Package not included in Android
    "DrawAllocation": Memory allocations within drawing code
    "UseSparseArrays": HashMap can be replaced with SparseArray
    "UseValueOf": Should use valueOf instead of new
    "JavascriptInterface": Missing @JavascriptInterface on methods
    "JobSchedulerService": JobScheduler problems
    "KeyboardInaccessibleWidget": Keyboard inaccessible widget
    "LabelFor": Missing labelFor attribute
    "InconsistentLayout": Inconsistent Layouts
    "InflateParams": Layout Inflation without a Parent
    "StaticFieldLeak": Static Field Leaks
    "DefaultLocale": Implied default locale in case conversion
    "LocaleFolder": Wrong locale name
    "GetLocales": Locale crash
    "InvalidResourceFolder": Invalid Resource Folder
    "WrongRegion": Suspicious Language/Region Combination
    "UseAlpha2": Using 3-letter Codes
    "LogConditional": Unconditional Logging Calls
    "LongLogTag": Too Long Log Tags
    "LogTagMismatch": Mismatched Log Tags
    "AllowBackup": AllowBackup/FullBackupContent Problems
    "MissingApplicationIcon": Missing application icon
    "DeviceAdmin": Malformed Device Admin
    "DuplicateActivity": Activity registered more than once
    "DuplicateUsesFeature": Feature declared more than once
    "GradleOverrides": Value overridden by Gradle build script
    "IllegalResourceRef": Name and version must be integer or string, not
          resource
    "MipmapIcons": Use Mipmap Launcher Icons
    "MockLocation": Using mock location provider in production
    "MultipleUsesSdk": Multiple <uses-sdk> elements in the manifest
    "ManifestOrder": Incorrect order of elements in manifest
    "MissingVersion": Missing application name/version
    "OldTargetApi": Target SDK attribute is not targeting latest version
    "UniquePermission": Permission names are not unique
    "UsesMinSdkAttributes": Minimum SDK and target SDK attributes not defined
    "WearableBindListener": Usage of Android Wear BIND_LISTENER is deprecated
    "WrongManifestParent": Wrong manifest parent
    "InvalidPermission": Invalid Permission Attribute
    "ManifestResource": Manifest Resource References
    "ManifestTypo": Typos in manifest tags
    "FloatMath": Using FloatMath instead of Math
    "MergeMarker": Code contains merge marker
    "MergeRootFrame": FrameLayout can be replaced with <merge> tag
    "IncompatibleMediaBrowserServiceCompatVersion": Obsolete version of
          MediaBrowserServiceCompat
    "InnerclassSeparator": Inner classes should use $ rather than .
    "Instantiatable": Registered class is not instantiatable
    "MissingRegistered": Missing registered class
    "MissingId": Fragments should specify an id or tag
    "LibraryCustomView": Custom views in libraries should use res-auto-namespace
    "ResAuto": Hardcoded Package in Namespace
    "NamespaceTypo": Misspelled namespace declaration
    "UnusedNamespace": Unused namespace
    "NegativeMargin": Negative Margins
    "NestedScrolling": Nested scrolling widgets
    "NetworkSecurityConfig": Valid Network Security Config File
    "MissingBackupPin": Missing Backup Pin
    "PinSetExpiry": Validate <pin-set> expiration attribute
    "NfcTechWhitespace": Whitespace in NFC tech lists
    "UnlocalizedSms": SMS phone number missing country code
    "ObjectAnimatorBinding": Incorrect ObjectAnimator Property
    "AnimatorKeep": Missing @Keep for Animated Properties
    "ObsoleteLayoutParam": Obsolete layout params
    "OnClick": onClick method does not exist
    "Overdraw": Overdraw: Painting regions more than once
    "DalvikOverride": Method considered overridden by Dalvik
    "OverrideAbstract": Not overriding abstract methods on older platforms
    "ParcelCreator": Missing Parcelable CREATOR field
    "UnusedQuantity": Unused quantity translations
    "MissingQuantity": Missing quantity translation
    "ImpliedQuantity": Implied Quantities
    "ExportedPreferenceActivity": PreferenceActivity should not be exported
    "PrivateApi": Using Private APIs
    "PackagedPrivateKey": Packaged private key
    "PrivateResource": Using private resources
    "ProguardSplit": Proguard.cfg file contains generic Android rules
    "Proguard": Using obsolete ProGuard configuration
    "PropertyEscape": Incorrect property escapes
    "UsingHttp": Using HTTP instead of HTTPS
    "SpUsage": Using dp instead of sp for text sizes
    "InOrMmUsage": Using mm or in dimensions
    "PxUsage": Using 'px' dimension
    "SmallSp": Text size is too small
    "ParcelClassLoader": Default Parcel Class Loader
    "PendingBindings": Missing Pending Bindings
    "RecyclerView": RecyclerView Problems
    "Registered": Class is not registered in the manifest
    "RelativeOverlap": Overlapping items in RelativeLayout
    "RequiredSize": Missing layout_width or layout_height attributes
    "AaptCrash": Potential AAPT crash
    "ResourceCycle": Cycle in resource definitions
    "ResourceName": Resource with Wrong Prefix
    "ValidRestrictions": Invalid Restrictions Descriptor
    "RtlCompat": Right-to-left text compatibility issues
    "RtlEnabled": Using RTL attributes without enabling RTL support
    "RtlSymmetry": Padding and margin symmetry
    "RtlHardcoded": Using left/right instead of start/end attributes
    "ScrollViewSize": ScrollView size validation
    "SdCardPath": Hardcoded reference to /sdcard
    "SecureRandom": Using a fixed seed with SecureRandom
    "TrulyRandom": Weak RNG
    "ExportedContentProvider": Content provider does not require permission
    "ExportedReceiver": Receiver does not require permission
    "ExportedService": Exported service does not require permission
    "SetWorldReadable": File.setReadable() used to make file world-readable
    "SetWorldWritable": File.setWritable() used to make file world-writable
    "GrantAllUris": Content provider shares everything
    "WorldReadableFiles": openFileOutput() or similar call passing
          MODE_WORLD_READABLE
    "WorldWriteableFiles": openFileOutput() or similar call passing
          MODE_WORLD_WRITEABLE
    "ServiceCast": Wrong system service casts
    "WifiManagerLeak": WifiManager Leak
    "WifiManagerPotentialLeak": WifiManager Potential Leak
    "SetJavaScriptEnabled": Using setJavaScriptEnabled
    "SignatureOrSystemPermissions": signatureOrSystem permissions declared
    "SQLiteString": Using STRING instead of TEXT
    "SSLCertificateSocketFactoryCreateSocket": Insecure call to
          SSLCertificateSocketFactory.createSocket()
    "SSLCertificateSocketFactoryGetInsecure": Call to
          SSLCertificateSocketFactory.getInsecure()
    "StateListReachable": Unreachable state in a <selector>
    "AuthLeak": Code might contain an auth leak
    "StringFormatCount": Formatting argument types incomplete or inconsistent
    "StringFormatMatches": "String.format string doesn't match the XML format
          string"
    "StringFormatInvalid": Invalid format string
    "PluralsCandidate": Potential Plurals
    "UseCheckPermission": Using the result of check permission calls
    "CheckResult": Ignoring results
    "ResourceAsColor": Should pass resolved color instead of resource id
    "MissingPermission": Missing Permissions
    "Range": Outside Range
    "ResourceType": Wrong Resource Type
    "RestrictedApi": Restricted API
    "WrongThread": Wrong Thread
    "WrongConstant": Incorrect constant
    "VisibleForTests": Visible Only For Tests
    "ProtectedPermissions": Using system app permission
    "TextFields": Missing inputType or hint
    "TextViewEdits": TextView should probably be an EditText instead
    "SelectableText": Dynamic text should probably be selectable
    "MenuTitle": Missing menu title
    "ShowToast": Toast created but not shown
    "TooDeepLayout": Layout hierarchy is too deep
    "TooManyViews": Layout has too many views
    "ExtraTranslation": Extra translation
    "MissingTranslation": Incomplete translation
    "Typos": Spelling error
    "TypographyDashes": Hyphen can be replaced with dash
    "TypographyEllipsis": Ellipsis string can be replaced with ellipsis character
    "TypographyFractions": Fraction string can be replaced with fraction
          character
    "TypographyOther": Other typographical problems
    "TypographyQuotes": Straight quotes can be replaced with curvy quotes
    "UnsafeProtectedBroadcastReceiver": Unsafe Protected BroadcastReceiver
    "UnprotectedSMSBroadcastReceiver": Unprotected SMS BroadcastReceiver
    "UnusedResources": Unused resources
    "UnusedIds": Unused id
    "UseCompoundDrawables": Node can be replaced by a TextView with compound
          drawables
    "UselessLeaf": Useless leaf layout
    "UselessParent": Useless parent layout
    "EnforceUTF8": Encoding used in resource files is not UTF-8
    "VectorRaster": Vector Image Generation
    "VectorDrawableCompat": Using VectorDrawableCompat
    "VectorPath": Long vector paths
    "InvalidVectorPath": Invalid vector paths
    "ViewConstructor": Missing View constructors for XML inflation
    "ViewHolder": View Holder Candidates
    "ViewTag": Tagged object leaks
    "WrongViewCast": Mismatched view type
    "FindViewByIdCast": Add Explicit Cast
    "Wakelock": Incorrect WakeLock usage
    "WakelockTimeout": Using wakeLock without timeout
    "InvalidWearFeatureAttribute": Invalid attribute for Wear uses-feature
    "WearStandaloneAppFlag": Invalid or missing Wear standalone app flag
    "WebViewLayout": WebViews in wrap_content parents
    "WrongCall": Using wrong draw/layout method
    "WrongCase": Wrong case for view tag
    "InvalidId": Invalid ID declaration
    "NotSibling": RelativeLayout Invalid Constraints
    "UnknownId": Reference to an unknown id
    "UnknownIdInLayout": Reference to an id that is not in the current layout
    "SuspiciousImport": import android.R statement
    "WrongFolder": Resource file in the wrong res folder
    "WrongThreadInterprocedural": Wrong Thread (Interprocedural)
    

    总结

    还有遇到一些简单代码规范的问题,平时注意,就能规避,比如常见的宽高,写成了sp、xp;总之就是sp、xp、dp使用混乱等一些规范问题,或者是内存泄漏风险.

    相关文章

      网友评论

        本文标题:静态代码lint常见报错处理

        本文链接:https://www.haomeiwen.com/subject/sozdqqtx.html