blob: ef3578e9a85dbe8a35b7d97d3344c61ae76fa73c [file] [log] [blame]
/*
* Copyright (C, 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License",;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tools.lint.checks
import com.android.tools.lint.client.api.IssueRegistry
import com.android.tools.lint.client.api.LintClient.Companion.isStudio
import com.android.tools.lint.client.api.Vendor
import com.android.tools.lint.detector.api.CURRENT_API
import com.android.tools.lint.detector.api.Issue
import com.android.tools.lint.detector.api.Scope
import com.google.common.annotations.VisibleForTesting
import java.util.Collections.unmodifiableList
import java.util.EnumSet
/**
* Registry which provides a list of checks to be performed on an
* Android project.
*/
open class BuiltinIssueRegistry : IssueRegistry() {
override val vendor: Vendor = AOSP_VENDOR
companion object {
/**
* Reset the registry such that it recomputes its available
* issues.
*
* NOTE: This is only intended for testing purposes.
*/
@VisibleForTesting
@JvmStatic
fun reset() {
IssueRegistry.reset()
}
private val builtinIssues: List<Issue> = unmodifiableList(
listOf(
AccessibilityDetector.ISSUE,
ActionsXmlDetector.ISSUE,
AddJavascriptInterfaceDetector.ISSUE,
AlarmDetector.ISSUE,
AllCapsDetector.ISSUE,
AllowAllHostnameVerifierDetector.ISSUE,
AlwaysShowActionDetector.ISSUE,
AndroidAutoDetector.INVALID_USES_TAG_ISSUE,
AndroidAutoDetector.MISSING_INTENT_FILTER_FOR_MEDIA_SEARCH,
AndroidAutoDetector.MISSING_MEDIA_BROWSER_SERVICE_ACTION_ISSUE,
AndroidAutoDetector.MISSING_ON_PLAY_FROM_SEARCH,
AndroidTvDetector.IMPLIED_TOUCHSCREEN_HARDWARE,
AndroidTvDetector.MISSING_BANNER,
AndroidTvDetector.MISSING_LEANBACK_LAUNCHER,
AndroidTvDetector.MISSING_LEANBACK_SUPPORT,
AndroidTvDetector.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE,
AndroidTvDetector.UNSUPPORTED_TV_HARDWARE,
AnnotationDetector.ANNOTATION_USAGE,
AnnotationDetector.FLAG_STYLE,
AnnotationDetector.INSIDE_METHOD,
AnnotationDetector.SWITCH_TYPE_DEF,
AnnotationDetector.UNIQUE,
ApiDetector.INLINED,
ApiDetector.OBSOLETE_SDK,
ApiDetector.OVERRIDE,
ApiDetector.UNSUPPORTED,
ApiDetector.UNUSED,
AppCompatCallDetector.ISSUE,
AppCompatCustomViewDetector.ISSUE,
AppCompatResourceDetector.ISSUE,
AppLinksAutoVerifyDetector.ISSUE,
AppLinksValidDetector.TEST_URL,
AppLinksValidDetector.VALIDATION,
ArraySizeDetector.INCONSISTENT,
AssertDetector.EXPENSIVE,
AutofillDetector.ISSUE,
BadHostnameVerifierDetector.ISSUE,
BatteryDetector.ISSUE,
BottomAppBarDetector.ISSUE,
ButtonDetector.BACK_BUTTON,
ButtonDetector.CASE,
ButtonDetector.ORDER,
ButtonDetector.STYLE,
ByteOrderMarkDetector.BOM,
C2dmDetector.ISSUE,
CallSuperDetector.ISSUE,
CanvasSizeDetector.ISSUE,
CheckResultDetector.CHECK_PERMISSION,
CheckResultDetector.CHECK_RESULT,
ChildCountDetector.ADAPTER_VIEW_ISSUE,
ChildCountDetector.SCROLLVIEW_ISSUE,
ChromeOsDetector.NON_RESIZEABLE_ACTIVITY,
ChromeOsDetector.PERMISSION_IMPLIES_UNSUPPORTED_HARDWARE,
ChromeOsDetector.SETTING_ORIENTATION_ON_ACTIVITY,
ChromeOsDetector.UNSUPPORTED_CHROME_OS_HARDWARE,
ChromeOsSourceDetector.UNSUPPORTED_CAMERA_FEATURE,
ChromeOsSourceDetector.UNSUPPORTED_LOCKED_ORIENTATION,
CipherGetInstanceDetector.DEPRECATED_PROVIDER,
CipherGetInstanceDetector.ISSUE,
CleanupDetector.APPLY_SHARED_PREF,
CleanupDetector.COMMIT_FRAGMENT,
CleanupDetector.RECYCLE_RESOURCE,
CleanupDetector.SHARED_PREF,
ClickableViewAccessibilityDetector.ISSUE,
CommentDetector.EASTER_EGG,
CommentDetector.STOP_SHIP,
ConstraintLayoutDetector.ISSUE,
CordovaVersionDetector.ISSUE,
CustomViewDetector.ISSUE,
CutPasteDetector.ISSUE,
DataBindingDetector.ESCAPE_XML,
DateFormatDetector.DATE_FORMAT,
DateFormatDetector.WEEK_YEAR,
DeletedProviderDetector.ISSUE,
DeprecationDetector.ISSUE,
DiffUtilDetector.ISSUE,
DosLineEndingDetector.ISSUE,
DuplicateIdDetector.CROSS_LAYOUT,
DuplicateIdDetector.WITHIN_LAYOUT,
DuplicateResourceDetector.ISSUE,
DuplicateResourceDetector.STRING_ESCAPING,
DuplicateResourceDetector.TYPE_MISMATCH,
EllipsizeMaxLinesDetector.ISSUE,
ExifInterfaceDetector.ISSUE,
ExportedReceiverDetector.ISSUE,
ExtraTextDetector.ISSUE,
FineLocationDetector.ISSUE,
FirebaseAnalyticsDetector.INVALID_NAME,
FirebaseMessagingDetector.MISSING_TOKEN_REFRESH,
FontDetector.FONT_VALIDATION,
FragmentDetector.ISSUE,
FullBackupContentDetector.ISSUE,
GetContentDescriptionOverrideDetector.ISSUE,
GetSignaturesDetector.ISSUE,
GradleDetector.ACCIDENTAL_OCTAL,
GradleDetector.AGP_DEPENDENCY,
GradleDetector.ANNOTATION_PROCESSOR_ON_COMPILE_PATH,
GradleDetector.BUNDLED_GMS,
GradleDetector.COMPATIBILITY,
GradleDetector.DATA_BINDING_WITHOUT_KAPT,
GradleDetector.DEPENDENCY,
GradleDetector.DEPRECATED,
GradleDetector.DEPRECATED_CONFIGURATION,
GradleDetector.DEPRECATED_LIBRARY,
GradleDetector.DEV_MODE_OBSOLETE,
GradleDetector.DUPLICATE_CLASSES,
GradleDetector.EXPIRED_TARGET_SDK_VERSION,
GradleDetector.EXPIRING_TARGET_SDK_VERSION,
GradleDetector.GRADLE_GETTER,
GradleDetector.GRADLE_PLUGIN_COMPATIBILITY,
GradleDetector.HIGH_APP_VERSION_CODE,
GradleDetector.IDE_SUPPORT,
GradleDetector.JAVA_PLUGIN_LANGUAGE_LEVEL,
GradleDetector.JCENTER_REPOSITORY_OBSOLETE,
GradleDetector.KTX_EXTENSION_AVAILABLE,
GradleDetector.LIFECYCLE_ANNOTATION_PROCESSOR_WITH_JAVA8,
GradleDetector.MIN_SDK_TOO_LOW,
GradleDetector.NOT_INTERPOLATED,
GradleDetector.PATH,
GradleDetector.PLUS,
GradleDetector.REMOTE_VERSION,
GradleDetector.RISKY_LIBRARY,
GradleDetector.STRING_INTEGER,
GridLayoutDetector.ISSUE,
HandlerDetector.ISSUE,
HardcodedDebugModeDetector.ISSUE,
HardcodedValuesDetector.ISSUE,
HardwareIdDetector.ISSUE,
HighSensorSamplingRateDetector.ISSUE,
IconDetector.DUPLICATES_CONFIGURATIONS,
IconDetector.DUPLICATES_NAMES,
IconDetector.GIF_USAGE,
IconDetector.ICON_COLORS,
IconDetector.ICON_DENSITIES,
IconDetector.ICON_DIP_SIZE,
IconDetector.ICON_EXPECTED_SIZE,
IconDetector.ICON_EXTENSION,
IconDetector.ICON_LAUNCHER_SHAPE,
IconDetector.ICON_LOCATION,
IconDetector.ICON_MISSING_FOLDER,
IconDetector.ICON_MIX_9PNG,
IconDetector.ICON_NODPI,
IconDetector.ICON_XML_AND_PNG,
IconDetector.NOTIFICATION_ICON_COMPATIBILITY,
IconDetector.WEBP_ELIGIBLE,
IconDetector.WEBP_UNSUPPORTED,
IgnoreWithoutReasonDetector.ISSUE,
IncludeDetector.ISSUE,
InefficientWeightDetector.BASELINE_WEIGHTS,
InefficientWeightDetector.INEFFICIENT_WEIGHT,
InefficientWeightDetector.NESTED_WEIGHTS,
InefficientWeightDetector.ORIENTATION,
InefficientWeightDetector.WRONG_0DP,
InstantAppDetector.ISSUE,
IntentDetector.ISSUE,
InteroperabilityDetector.KOTLIN_PROPERTY,
InteroperabilityDetector.LAMBDA_LAST,
InteroperabilityDetector.NO_HARD_KOTLIN_KEYWORDS,
InteroperabilityDetector.PLATFORM_NULLNESS,
InvalidImeActionIdDetector.ISSUE,
InvalidPackageDetector.ISSUE,
ItemDecoratorDetector.ISSUE,
IteratorDetector.ISSUE,
JavaPerformanceDetector.PAINT_ALLOC,
JavaPerformanceDetector.USE_SPARSE_ARRAY,
JavaPerformanceDetector.USE_VALUE_OF,
JavaScriptInterfaceDetector.ISSUE,
JobSchedulerDetector.ISSUE,
KeyboardNavigationDetector.ISSUE,
LabelForDetector.ISSUE,
LayoutConsistencyDetector.INCONSISTENT_IDS,
LayoutInflationDetector.ISSUE,
LeakDetector.ISSUE,
LeanbackWifiUsageDetector.ISSUE,
LintDetectorDetector.CHECK_URL,
LintDetectorDetector.DOLLAR_STRINGS,
LintDetectorDetector.ID,
LintDetectorDetector.PSI_COMPARE,
LintDetectorDetector.TEXT_FORMAT,
LintDetectorDetector.TRIM_INDENT,
LintDetectorDetector.UNEXPECTED_DOMAIN,
LintDetectorDetector.USE_KOTLIN,
LintDetectorDetector.USE_UAST,
LocaleDetector.FINAL_LOCALE,
LocaleDetector.STRING_LOCALE,
LocaleFolderDetector.DEPRECATED_CODE,
LocaleFolderDetector.GET_LOCALES,
LocaleFolderDetector.INVALID_FOLDER,
LocaleFolderDetector.USE_ALPHA_2,
LocaleFolderDetector.WRONG_REGION,
LogDetector.CONDITIONAL,
LogDetector.LONG_TAG,
LogDetector.WRONG_TAG,
ManifestDetector.ALLOW_BACKUP,
ManifestDetector.APP_INDEXING_SERVICE,
ManifestDetector.APPLICATION_ICON,
ManifestDetector.DEVICE_ADMIN,
ManifestDetector.DUPLICATE_ACTIVITY,
ManifestDetector.DUPLICATE_USES_FEATURE,
ManifestDetector.GRADLE_OVERRIDES,
ManifestDetector.ILLEGAL_REFERENCE,
ManifestDetector.MIPMAP,
ManifestDetector.MOCK_LOCATION,
ManifestDetector.MULTIPLE_USES_SDK,
ManifestDetector.ORDER,
ManifestDetector.SET_VERSION,
ManifestDetector.TARGET_NEWER,
ManifestDetector.UNIQUE_PERMISSION,
ManifestDetector.USES_SDK,
ManifestDetector.WEARABLE_BIND_LISTENER,
ManifestDetector.WRONG_PARENT,
ManifestPermissionAttributeDetector.ISSUE,
ManifestResourceDetector.ISSUE,
ManifestTypoDetector.ISSUE,
MediaBrowserServiceCompatVersionDetector.ISSUE,
MediaCapabilitiesDetector.ISSUE,
MergeMarkerDetector.ISSUE,
MergeRootFrameLayoutDetector.ISSUE,
MissingClassDetector.INNERCLASS,
MissingClassDetector.INSTANTIATABLE,
MissingClassDetector.MISSING,
MissingIdDetector.ISSUE,
MissingPrefixDetector.MISSING_NAMESPACE,
MotionLayoutDetector.INVALID_SCENE_FILE_REFERENCE,
MotionSceneDetector.MOTION_SCENE_FILE_VALIDATION_ERROR,
NamespaceDetector.CUSTOM_VIEW,
NamespaceDetector.REDUNDANT,
NamespaceDetector.RES_AUTO,
NamespaceDetector.TYPO,
NamespaceDetector.UNUSED,
NegativeMarginDetector.ISSUE,
NestedScrollingWidgetDetector.ISSUE,
NetworkSecurityConfigDetector.ACCEPTS_USER_CERTIFICATES,
NetworkSecurityConfigDetector.INSECURE_CONFIGURATION,
NetworkSecurityConfigDetector.ISSUE,
NetworkSecurityConfigDetector.MISSING_BACKUP_PIN,
NetworkSecurityConfigDetector.PIN_SET_EXPIRY,
NfcTechListDetector.ISSUE,
NonConstantResourceIdDetector.NON_CONSTANT_RESOURCE_ID,
NonInternationalizedSmsDetector.ISSUE,
NotificationTrampolineDetector.ACTIVITY,
NotificationTrampolineDetector.TRAMPOLINE,
ObjectAnimatorDetector.BROKEN_PROPERTY,
ObjectAnimatorDetector.MISSING_KEEP,
ObsoleteLayoutParamsDetector.ISSUE,
OnClickDetector.ISSUE,
OverdrawDetector.ISSUE,
OverrideConcreteDetector.ISSUE,
OverrideDetector.ISSUE,
PackageVisibilityDetector.QUERY_ALL_PACKAGES_PERMISSION,
PackageVisibilityDetector.QUERY_PERMISSIONS_NEEDED,
ParcelDetector.ISSUE,
PendingIntentMutableFlagDetector.ISSUE,
PermissionDetector.MISSING_PERMISSION,
PluralsDetector.EXTRA,
PluralsDetector.IMPLIED_QUANTITY,
PluralsDetector.MISSING,
PowerManagerDetector.INVALID_WAKE_LOCK_TAG,
PreferenceActivityDetector.ISSUE,
PrivateApiDetector.BLOCKED_PRIVATE_API,
PrivateApiDetector.DISCOURAGED_PRIVATE_API,
PrivateApiDetector.PRIVATE_API,
PrivateApiDetector.SOON_BLOCKED_PRIVATE_API,
PrivateKeyDetector.ISSUE,
PrivateResourceDetector.ISSUE,
ProguardDetector.SPLIT_CONFIG,
ProguardDetector.WRONG_KEEP,
PropertyFileDetector.ESCAPE,
PropertyFileDetector.HTTP,
PropertyFileDetector.PROXY_PASSWORD,
PxUsageDetector.DP_ISSUE,
PxUsageDetector.IN_MM_ISSUE,
PxUsageDetector.PX_ISSUE,
PxUsageDetector.SMALL_SP_ISSUE,
RangeDetector.RANGE,
ReadParcelableDetector.ISSUE,
RecyclerViewDetector.CLEAR_ALL_DATA,
RecyclerViewDetector.DATA_BINDER,
RecyclerViewDetector.FIXED_POSITION,
RegistrationDetector.ISSUE,
RelativeOverlapDetector.ISSUE,
RemoteViewDetector.ISSUE,
RequiredAttributeDetector.ISSUE,
RequiresFeatureDetector.REQUIRES_FEATURE,
ResourceCycleDetector.CRASH,
ResourceCycleDetector.CYCLE,
ResourcePrefixDetector.ISSUE,
ResourceTypeDetector.COLOR_USAGE,
ResourceTypeDetector.HALF_FLOAT,
ResourceTypeDetector.RESOURCE_TYPE,
RestrictionsDetector.ISSUE,
RestrictToDetector.RESTRICTED,
RestrictToDetector.TEST_VISIBILITY,
RtlDetector.COMPAT,
RtlDetector.ENABLED,
RtlDetector.SYMMETRY,
RtlDetector.USE_START,
SamDetector.ISSUE,
ScopedStorageDetector.ISSUE,
ScrollViewChildDetector.ISSUE,
SdCardDetector.ISSUE,
SdkIntDetector.ISSUE,
SecureRandomDetector.ISSUE,
SecureRandomGeneratorDetector.ISSUE,
SecurityDetector.EXPORTED_PROVIDER,
SecurityDetector.EXPORTED_RECEIVER,
SecurityDetector.EXPORTED_SERVICE,
SecurityDetector.OPEN_PROVIDER,
SecurityDetector.SET_READABLE,
SecurityDetector.SET_WRITABLE,
SecurityDetector.WORLD_READABLE,
SecurityDetector.WORLD_WRITEABLE,
ServiceCastDetector.ISSUE,
ServiceCastDetector.WIFI_MANAGER,
ServiceCastDetector.WIFI_MANAGER_UNCERTAIN,
SetJavaScriptEnabledDetector.ISSUE,
SetTextDetector.SET_TEXT_I18N,
SharedPrefsDetector.ISSUE,
SignatureOrSystemDetector.ISSUE,
SliceDetector.ISSUE,
SplashScreenDetector.ISSUE,
SQLiteDetector.ISSUE,
SslCertificateSocketFactoryDetector.CREATE_SOCKET,
SslCertificateSocketFactoryDetector.GET_INSECURE,
StartDestinationDetector.ISSUE,
StateListDetector.ISSUE,
StorageDetector.ISSUE,
StringAuthLeakDetector.AUTH_LEAK,
StringCasingDetector.DUPLICATE_STRINGS,
StringFormatDetector.ARG_COUNT,
StringFormatDetector.ARG_TYPES,
StringFormatDetector.INVALID,
StringFormatDetector.POTENTIAL_PLURAL,
SyntheticAccessorDetector.ISSUE,
SystemPermissionsDetector.ISSUE,
TextFieldDetector.ISSUE,
TextViewDetector.ISSUE,
TextViewDetector.SELECTABLE,
ThreadDetector.THREAD,
TileProviderDetector.ISSUE,
TitleDetector.ISSUE,
ToastDetector.ISSUE,
TooManyViewsDetector.TOO_DEEP,
TooManyViewsDetector.TOO_MANY,
TranslationDetector.EXTRA,
TranslationDetector.MISSING,
TranslationDetector.MISSING_BASE,
TranslationDetector.TRANSLATED_UNTRANSLATABLE,
TranslucentViewDetector.ISSUE,
TypedefDetector.TYPE_DEF,
TypoDetector.ISSUE,
TypographyDetector.DASHES,
TypographyDetector.ELLIPSIS,
TypographyDetector.FRACTIONS,
TypographyDetector.OTHER,
TypographyDetector.QUOTES,
UnpackedNativeCodeDetector.ISSUE,
UnsafeBroadcastReceiverDetector.ACTION_STRING,
UnsafeBroadcastReceiverDetector.BROADCAST_SMS,
UnsafeNativeCodeDetector.LOAD,
UnsafeNativeCodeDetector.UNSAFE_NATIVE_CODE_LOCATION,
UnusedResourceDetector.ISSUE,
UnusedResourceDetector.ISSUE_IDS,
UseCompoundDrawableDetector.ISSUE,
UselessViewDetector.USELESS_LEAF,
UselessViewDetector.USELESS_PARENT,
Utf8Detector.ISSUE,
VectorDetector.ISSUE,
VectorDrawableCompatDetector.ISSUE,
VectorPathDetector.PATH_LENGTH,
VectorPathDetector.PATH_VALID,
ViewConstructorDetector.ISSUE,
ViewHolderDetector.ISSUE,
ViewTypeDetector.ADD_CAST,
ViewTypeDetector.WRONG_VIEW_CAST,
WakelockDetector.ISSUE,
WakelockDetector.TIMEOUT,
WatchFaceEditorDetector.ISSUE,
WearStandaloneAppDetector.INVALID_WEAR_FEATURE_ATTRIBUTE,
WearStandaloneAppDetector.WEAR_STANDALONE_APP_ISSUE,
WebViewApiAvailabilityDetector.ISSUE,
WebViewDetector.ISSUE,
WorkManagerDetector.ISSUE,
WrongCallDetector.ISSUE,
WrongCaseDetector.WRONG_CASE,
WrongIdDetector.INVALID,
WrongIdDetector.NOT_SIBLING,
WrongIdDetector.UNKNOWN_ID,
WrongIdDetector.UNKNOWN_ID_LAYOUT,
WrongImportDetector.ISSUE,
WrongLocationDetector.ISSUE,
WrongThreadInterproceduralDetector.ISSUE,
X509TrustManagerDetector.IMPLEMENTS_CUSTOM,
X509TrustManagerDetector.TRUSTS_ALL
)
)
}
init {
for (issue in builtinIssues) {
//noinspection LeakingThis
issue.registry = this
}
}
public override fun cacheable(): Boolean {
// In the IDE, cache across incremental runs; here, lint is never run in parallel
// Outside of the IDE, typically in Gradle, we don't want this caching since
// lint can run in parallel and this caching can be incorrect;
// see for example issue 77891711
return isStudio
}
override val issues: List<Issue>
get() = builtinIssues
override val deletedIssues: List<String> = listOf(
// Off by default for a while; unlikely to be turned on (and this is
// just an awareness check which is unlikely to be enabled by those
// who could benefit from it)
"GoogleAppIndexingWarning",
// Implementation not correct and would require rewrite to fix, not worth it
"GoogleAppIndexingApiWarning",
// Deleted a while back when restrictions were removed on launcher icons
"IconLauncherFormat",
// No longer relevant, only applied to minSdk < 14
"ViewTag",
// No longer relevant, only applied to minSdk < 9
"FieldGetter",
// Renamed to MissingClass
"MissingRegistered",
// Combined into FontValidation
"FontValidationWarning",
"FontValidationError",
// Combined into AppLinksAutoVerify
"AppLinksAutoVerifyError",
"AppLinksAutoVerifyWarning",
// Deleted; no longer needed thanks to d8
"Assert"
)
override fun getIssueCapacity(scope: EnumSet<Scope>): Int {
return if (scope == Scope.ALL) {
issues.size
} else {
var initialSize = 12
when {
scope.contains(Scope.RESOURCE_FILE) -> initialSize += 115
scope.contains(Scope.ALL_RESOURCE_FILES) -> initialSize += 12
}
when {
scope.contains(Scope.JAVA_FILE) -> initialSize += 150
scope.contains(Scope.CLASS_FILE) -> initialSize += 16
scope.contains(Scope.MANIFEST) -> initialSize += 70
scope.contains(Scope.GRADLE_FILE) -> initialSize += 24
}
initialSize
}
}
override val api: Int
get() = CURRENT_API
}