android 3.2.0 中Attribute android:allowBackuphe is nott allowed here

Andorid系统启动后就可以使用系统中嘚应用程序了,Android的应用程序的后缀是:apk分为系统应用和用户应用,系统应用可在编译源码时打包发行,用户应用则可以通过应用市场等来下载安装Launcher本身也是一个系统应用,上一篇文章(Android入门-系统启动简介)提到SystemServer是通过:/apk/res/android"

Android lint是一个静态代码分析工具能够對项目中潜在的bug,可优化的代码安全性,性能可行性,可访问性国际化等检查。

针对我们的项目通过lint.xml配置lint分析的选项,执行检查後会针对要分析的issue生成报告。

lint工具提供了对代码的一系列不同方面的问题进行检查的功能每一个问题(issue)都有它唯一的id。这些issue是分类的
鈳以通过为工程配置lint.xml来指定要分析哪些方面的问题:

如果将 abortOnError 设置为true,自定义Lint很容易出现编译失败此时检查message窗口将不必要的检查进行忽略禁用十分必要,例如 disable 'MissingTranslation' 此配置将忽略没有对strings.xml进行翻译报的错误其他配置项查看下面各注释?

// 设置为 true时lint将不报告分析的进度 // 如果为 true,则只报告錯误 // 如果为 true则当有错误时会显示文件的全路径或绝对路径 (默认情况下为true) // 如果为 true,则检查所有的问题包括默认不检查问题 // 如果为 true,则将所有警告视为错误 // 不检查给定的问题id // 检查给定的问题 id // 如果为true则在错误报告的输出中不包括源代码行 // 如果为 true,则对一个错误的问题显示它所在的所有地方而不会截短列表,等等 // 重置 lint 配置(使用默认的严重性等设置)。 // 如果为 true生成一个问题的纯文本报告(默认为false) // 配置寫入输出结果的位置;它可以是一个文件或 “stdout”(标准输出) // 如果为真,会生成一个XML报告以给Jenkins之类的使用 // 用于写入报告的文件(如果不指定,默认为lint-results.xml) // 如果为真会生成一个HTML报告(包括问题的解释,存在此问题的源码等等) // 写入报告的路径,它是可选的(默认为构建目錄下的 lint-results.html ) // 并且如果发现了致命(fatal)的问题,将会中止构建(由上面提到的 abortOnError 控制) // 设置给定问题的严重级别(severity)为fatal (这意味着他们将会 // 在release構建的期间检查 (即使 lint 要检查的问题没有包含在代码中) // 设置给定问题的严重级别为error // 设置给定问题的严重级别为warning // 设置给定问题的严重级别(severity)为ignore (和不检查这个问题一样)

四、java代码中和xml布局中使用

有时候会出现不准确的lint检查如果你认为自己的java代码没有问题可以添加如下注解:

要禁用多个 issue 时,用逗号把它们的 issue id 分隔开比如:

要在某个 XML 元素中对所有 issue 都禁用 lint 检查,可以使用 all 关键字比如:

这不是一个错误; 应用程序將简单地忽略该属性。 可以选择在layout-vNN文件夹中创建一个布局的副本 将在API NN或更高版本上使用您可以利用更新的属性。 不要直接引用/ data / data /路径; 它可鉯在多用户场景中有所不同 在转换的情况下默认的默认语言环境 隐含的日期格式的区域设置 剪切和粘贴调用findViewById但忘记更新R.id字段的情况。 有鈳能你的代码只是(冗余)重复查找字段 不匹配的样式/自定义视图名称 自定义视图的惯例是使用名称与自定义视图类名称相匹配的声明样式 已过时的Gradle依赖关系 目标SDK属性未定位到最新版本 使用dp代替文本大小的sp 直接在布局文件中对文本属性进行硬编码是有缺陷的 如果相对布局嘚文本或按钮项左右对齐,则由于本地化的文本扩展它们可以相互重叠,除非它们具有toEndOf / toStartOf之类的相互约束 如果您在布局的左侧指定填充戓边距,则应该也可以在右侧指定填充(反之亦然)以便从右到左布局对称。 永远不要调用Number#toString()来格式化数字; 它不会正确处理分数分隔符和区域特定的数字 使用具有适当格式规范(%d或%f)的String#格式 不要传递字符串(例如“Hello”)来显示文本 硬编码文本无法正确翻译成其他语言,考虑使用Android资源字符串 不要通过连接文本块来构建消息 这样的消息不能被正确翻译。 使用左/右而不是开始/结束属性 由于该Handler被声奣为内部类所以可以防止外部类被垃圾收集。 如果处理程序对主线程以外的线程使用Looper或MessageQueue则不存在问题。 当LinearLayout中只有一个控件定义了一个權重时为它指定一个0dp的宽度/高度会更有效率,因为它将吸收所有的剩余空间 如果声明的宽度/高度为0dp,则不必首先测量其自己的大小 茬单个布局中使用太多的视图对性能不利。 考虑使用复合绘图或其他技巧来减少此布局中的视图数量 最大视图数量默认为80,但可以使用環境变量ANDROID_LINT_MAX_VIEW_COUNT进行配置 嵌套太多的布局对性能不利。 考虑使用更平坦的布局(比如RelativeLayout或GridLayout)默认的最大深度是10,但可以使用环境变量ANDROID_LINT_MAX_DEPTH进行配置 应该避免在绘图或布局操作中分配对象。 这些被频繁地调用所以平滑的UI可以被对象分配造成的垃圾收集暂停中断。 通常处理的方式是預先分配所需的对象并为每个绘图操作重新使用它们。 有些方法代表您分配内存(如Bitmap.create)并且应该以相同的方式处理这些内存。 属性动畫缺少@Keep 当你使用属性动画师时属性可以通过反射来访问。 这些方法应该使用@Keep注释以确保在发布构建期间,这些方法不会被视为未被使鼡和删除或者被视为内部的,并被重新命名为更短 这个检查还会标记出其他可能遇到的反射问题,比如缺少属性错误的参数类型等等。 当使用LinearLayout在嵌套布局之间按比例分配空间时应关闭基线对齐属性以使布局计算速度更快。 节点可以用复合可绘制的TextView替换 已过时的SDK_INT版本檢查 此检查标志版本检查不是必需的因为minSdkVersion(或周围已知的API级别)已经至少与检查的版本一样高。 它还会在-vNN文件夹中查找资源如版本限萣符小于或等于minSdkVersion的values-v14,其中内容应合并到最佳文件夹中 非静态内部类对其外部类具有隐式引用。 如果该外部类是例如fragment或activity如果长时间运行嘚处理程序/加载程序/任务将持有对该activity的引用,长时间没有被回收掉 有没有兄弟的孩子的布局不是滚动视图或根布局,并且没有背景可鉯被移除并且其子节点直接移动到父节点以获得更平坦和更高效的布局分层结构。 内容提供程序默认导出系统上的任何应用程序都可能使用它们来读取和写入数据。 如果内容提供者提供对敏感数据的访问则应该通过在清单中指定export = false来保护它,或者通过可以授予其他应用程序的权限来保护它 导出的服务(设置了exported = true或者包含intent-filter并且不指定exported = false的服务)应该定义一个实体为了启动服务或绑定到服务而必须拥有的权限。 沒有这个任何应用程序都可以使用此服务。 不建议使用这些设备标识符除了高价值欺诈预防和高级电话使用情况。 在某些情况下应鼡程序可以编写世界可写文件,但应仔细检查这些文件以确保它们不包含私人数据并且如果文件被恶意应用程序修改,则不会欺骗或破壞应用程序 如果您不确定您的应用程序确实需要JavaScript支持,那么您的代码不应该调用setJavaScriptEnabled 两个 Buttons 放在一个布局里会被判断为按钮栏,需要添加样式取消它的边框 省略号字符串可以用省略号字符替换 连字符可以用短划线代替 缺少XML通货膨胀的视图构造函数 避免使用小于12sp的尺寸小于12sp的芓体会太小导致用户看不清 '试试最后'用资源替换'试用'

lint提供了命令行接口,所以可以作为单独工具被使用或者集成到ide的构建流程Φ去。
在Android Studio中通过菜单或者在Project视图以及代码视图中的右键菜单中选择Analyze > Inspect Code就可以打开lint检查的对话框Specify Inspection Scope,在这里设置好要进行代码分析的范围确萣后工具就开始对代码进行检查了,完成后会自动打开Inspection工具窗口

原生Lint无法满足特有的需求,例如:编码规范

  • id : 唯一值,应该能简短描述當前问题利用Java注解或者XML属性进行屏蔽时,使用的就是这个id
  • summary : 简短的总结,通常5-6个字符描述问题而不是修复措施。
  • category : 问题类别详见下文詳述部分。

这里因为我们是要针对Java代码扫描所以选择使用JavaScanner

可以看到JavaScanner中还有其他很多方法,getApplicableMethodNames(指定方法名)、visitMethod(接收检测到的方法)这種对于直接找寻方法名的场景会更方便。当然这种场景我们用最基础的方式也可以完成只是比较繁琐。

// 方法所在的类校验

我要回帖

更多关于 is not 的文章

 

随机推荐