静态代码lint常见报错处理

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

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

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

添加注解

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

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

首先添加命名空间

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

然后在报错地方添加

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

添加规则(lint.xml文件)

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

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

指定路径

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

改变lint检测类型

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

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

1. Missing commit() on SharedPreference editor

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

1
2
3
4
5
6
7
8
9
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中添加规则:

4. Duplicate ids across layouts combined with include tags

在布局中,通过进来的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() 替换直接通过路径拼接,但是根据场景可以自变吧;若不想通过这种方式可以直接忽略,添加注解
类似错误场景:

1
2
3
4
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中添加规则:

7. Attribute unused on older versions

建议添加规则

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

8. Appcompat Custom Widgets

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

1
2
3
4
添加规则
<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” 的影响
直接添加:

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

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

11. Insecure HostnameVerifier

1
2
3
4
5
6
HostnameVerifier hnv = new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
};

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

@SuppressLint(“AllowAllHostnameVerifier”)

或者添加规则

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

12. Insecure TLS/SSL trust manager

1
2
3
4
5
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws
CertificateException {

}

建议添加规则

1
2
<!--忽略信任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;
但是对于特定的需求,不能保证能实现想要的效果,因此建议添加规则忽略:

1
2
<!--忽略对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这个属性,建议看看这里,这个警告可以根据需求自行添加属性与否,或者是添加规则和注解:

1
2
<!--忽略建议 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和秒速,以供对照

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
"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使用混乱等一些规范问题,或者是内存泄漏风险.

坚持原创技术分享,您的支持将鼓励我继续创作!