阿里巴巴Android开发手册

15.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 Toast 时,建议定义一个全局的 Toast 对象,这样可以避免连续显示 Toast 时不能取消上一次 Toast 消息的情况(如果你有连续弹出 Toast 的情况,避免 使用 Toast.makeText)。

16.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 Adapter 的时候,如果你使用了 ViewHolder 做缓存,在 getView()的 方法中无论这项 convertView 的每个子控件是否需要设置属性(比如某个 TextView 设置的文本可能为 null,某个按钮的背景色为透明,某控件的颜色为透明等),都需 要为其显式设置属性(Textview 的文本为空也需要设置 setText(“”),背景透明也需要 设置),否则在滑动的过程中,因为 adapter item 复用的原因,会出现内容的显示错 乱。

17.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Activity或者 Fragment 中动态注册BroadCastReceiver 时,registerReceiver() 和 unregisterReceiver()要成对出现。 说明: 如果 registerReceiver()和 unregisterReceiver()不成对出现,则可能导致已经注册的 receiver 没有在合适的时机注销,导致内存泄漏,占用内存空间,加重 SystemService 负担。 部分华为的机型会对 receiver 进行资源管控,单个应用注册过多 receiver 会触发管 控模块抛出异常,应用直接崩溃。 Activity 的生命周期不对应,可能出现多次 onResume 造成 receiver 注册多个,但 最终只注销一个,其余 receiver 产生内存泄漏。

四、UI 与布局

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传布局中不得不使用 ViewGroup 多重嵌套时,不要使用 LinearLayout 嵌套,改用 RelativeLayout,可以有效降低嵌套数。 说明: Android 应用页面上任何一个 View 都需要经过 measure、layout、draw 三个步骤 才能被正确的渲染。从 xml layout 的顶部节点开始进行 measure,每个子节点都需 要向自己的父节点提供自己的尺寸来决定展示的位置,在此过程中可能还会重新 measure(由此可能导致 measure 的时间消耗为原来的 2-3 倍)。节点所处位置越 深,套嵌带来的 measure 越多,计算就会越费时。这就是为什么扁平的 View 结构 会性能更好。 同时,页面拥上的 View 越多,measure、layout、draw 所花费的时间就越久。要缩 短这个时间,关键是保持 View 的树形结构尽量扁平,而且要移除所有不需要渲染的 View。理想情况下,总共的 measure,layout,draw 时间应该被很好的控制在 16ms 以内,以保证滑动屏幕时 UI 的流畅。 要找到那些多余的 View(增加渲染延迟的 view),可以用 Android Studio Monitor 里的 Hierarachy Viewer 工具,可视化的查看所有的 view。 多重嵌套导致 measure 以及 layout 等步骤耗时过多。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在 Activity 中显示对话框或弹出浮层时,尽量使用 DialogFragment,而非 Dialog/AlertDialog,这样便于随Activity生命周期管理对话框/弹出浮层的生命周期。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传源文件统一采用 UTF-8 的形式进行编码。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传禁止在非 ui 线程进行 view 相关操作。

  5. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传文本大小使用单位 dp,view 大小使用单位 dp。对于 Textview,如果在文字大小确定的情况下推荐使用 wrap_content 布局避免出现文字显示不全的适配问 题。

  6. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传禁止在设计布局时多次设置子 view 和父 view 中为同样的背景造成页面过度绘制,推荐将不需要显示的布局进行及时隐藏。

  7. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传灵活使用布局,推荐 Merge、ViewStub 来优化布局,尽可能多的减少 UI布局层级,推荐使用 FrameLayout,LinearLayout、RelativeLayout 次之。

  8. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在需要时刻刷新某一区域的组件时,建议通过以下方式避免引发全局 layout 刷新:

  • 设置固定的 view 大小的高宽,如倒计时组件等;
  • 调用 view 的 layout 方式修改位置,如弹幕组件等;
  • 通过修改 canvas 位置并且调用 invalidate(int l, int t, int r, int b)等方式限定刷新 区域;
  • 通过设置一个是否允许 requestLayout 的变量,然后重写控件的 requestlayout、 onSizeChanged 方 法 , 判 断 控 件 的 大 小 没 有 改 变 的 情 况 下 , 当 进 入 requestLayout 的时候,直接返回而不调用 super 的 requestLayout 方法。
  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不能在 Activity 没有完全显示时显示 PopupWindow 和 Dialog。

10.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传尽量不要使用 AnimationDrawable,它在初始化的时候就将所有图片加载到内存中,特别占内存,并且还不能释放,释放之后下次进入再次加载时会报错。 说明: Android 的帧动画可以使用 AnimationDrawable 实现,但是如果你的帧动画中如果 包含过多帧图片,一次性加载所有帧图片所导致的内存消耗会使低端机发生 OOM 异常。帧动画所使用的图片要注意降低内存消耗,当图片比较大时,容易出现 OOM。

11.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew;因为这样会把 ListView 的所有 Item 都加载到内存中,要消耗巨大的内存和 cpu 去绘制图面。 说明: ScrollView 中嵌套 List 或 RecyclerView 的做法官方明确禁止。除了开发过程中遇到 的各种视觉和交互问题,这种做法对性能也有较大损耗。ListView 等 UI 组件自身有 垂直滚动功能,也没有必要在嵌套一层 ScrollView。目前为了较好的 UI 体验,更贴 近 Material Design 的设计,推荐使用 NestedScrollView。

五、进程、线程与消息通信

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不要通过 Intent 在 Android 基础组件之间传递大数据(binder transaction缓存为 1MB),可能导致 OOM。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在 Application 的业务初始化代码加入进程判断,确保只在自己需要的进程初始化。特别是后台进程减少不必要的业务初始化。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。 说明: 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解 决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致 消耗完内存或者“过度切换”的问题。另外创建匿名线程不便于后续的资源使用分析, 对性能分析等会造成困扰。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明: Executors 返回的线程池对象的弊端如下:

  • FixedThreadPool 和 SingleThreadPool : 允 许 的 请 求 队 列 长 度 为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM;
  • CachedThreadPool 和 ScheduledThreadPool : 允 许 的 创 建 线 程 数 量 为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传子线程中不能更新界面,更新界面必须在主线程中进行,网络操作不能在主线程中调用。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不要在非 UI 线程中初始化 ViewStub,否则会返回 null。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传尽量减少不同 APP 之间的进程间通信及拉起行为。拉起导致占用系统资源,影响用户体验。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传新建线程时,定义能识别自己业务的线程名称,便于性能优化和问题排查。

  5. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传ThreadPoolExecutor 设置线程存活时间(setKeepAliveTime),确保空闲时线程能被释放。

  6. 【 推 荐 】 禁 止 在 多 进 程 之 间 用 SharedPreferences 共 享 数 据 , 虽 然 可 以 (MODE_MULTI_PROCESS),但官方已不推荐。

11.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传谨慎使用 Android 的多进程,多进程虽然能够降低主进程的内存压力,但会遇到如下问题:

  • 不能实现完全退出所有 Activity 的功能;
  • 首次进入新启动进程的页面时会有延时的现象(有可能黑屏、白屏几秒,是白 屏还是黑屏和新 Activity 的主题有关);
  • 应用内多进程时,Application 实例化多次,需要考虑各个模块是否都需要在所 有进程中初始化;
  • 多进程间通过 SharedPreferences 共享数据时不稳定。

六、文件与数据库

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传任何时候不要硬编码文件路径,请使用 Android 文件系统 API 访问。 说明: Android 应用提供内部和外部存储,分别用于存放应用自身数据以及应用产生的用 户数据。可以通过相关 API 接口获取对应的目录,进行文件操作。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传当使用外部存储时,必须检查外部存储的可用性。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传应用间共享文件时,不要通过放宽文件系统权限的方式去实现,而应使用FileProvider。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传SharedPreference 中只能存储简单数据类型(int、boolean、String 等),复杂数据类型建议使用文件、数据库等其他方式存储。

  5. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 SharedPreference 提 交 数 据 时 , 尽 量 使 用 Editor#apply() ,而非 Editor#commit()。一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使 用 Editor#commit()。 说明: SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入 磁盘,commit 方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit, apply 会将最后修改内容写入磁盘。但是如果希望立刻获取存储操作的结果,并据此 做相应的其他操作,应当使用 commit。

  6. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传数据库 Cursor 必须确保使用完后关闭,以免内存泄漏。 说明: Cursor 是对数据库查询结果集管理的一个类,当查询的结果集较小时,消耗内存不 易察觉。但是当结果集较大,长时间重复操作会导致内存消耗过大,需要开发者在 操作完成后手动关闭 Cursor。 数据库 Cursor 在创建及使用时,可能发生各种异常,无论程序是否正常结束,必须 在最后确保 Cursor 正确关闭,以避免内存泄漏。同时,如果 Cursor 的使用还牵涉 多线程场景,那么需要自行保证操作同步。

  7. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传多线程操作写入数据库时,需要使用事务,以免出现同步问题。 说明: Android 的通过 SQLiteOpenHelper 获取数据库 SQLiteDatabase 实例,Helper 中会 自动缓存已经打开的 SQLiteDatabase 实例,单个 App 中应使用 SQLiteOpenHelper 的单例模式确保数据库连接唯一。由于 SQLite 自身是数据库级锁,单个数据库操作 是保证线程安全的(不能同时写入),transaction 时一次原子操作,因此处于事务中 的操作是线程安全的。 若同时打开多个数据库连接,并通过多线程写入数据库,会导致数据库异常,提示 数据库已被锁住。

  8. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传大数据写入数据库时,请使用事务或其他能够提高 I/O 效率的机制,保证执行速度。

  9. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传执行 SQL 语句时,应使用 SQLiteDatabase#insert()、update()、delete(),不要使用 SQLiteDatabase#execSQL(),以免 SQL 注入风险。

10.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传如果 ContentProvider 管理的数据存储在 SQL 数据库中,应该避免将不受信任的外部数据直接拼接在原始 SQL 语句中,可使用一个用于将 ? 作为可替换参 数的选择子句以及一个单独的选择参数数组,会避免 SQL 注入。

七、Bitmap、Drawable 与动画

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传加载大图片或者一次性加载多张图片,应该在异步线程中进行。图片的加载,涉及到 IO 操作,以及 CPU 密集操作,很可能引起卡顿。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在 ListView,ViewPager,RecyclerView,GirdView 等组件中使用图片时,应做好图片的缓存,避免始终持有图片导致内存泄露,也避免重复创建图片,引起 性 能 问 题 。 建 议 使 用 FrescoGlide等图片库。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传png 图片使用 tinypng 或者类似工具压缩处理,减少包体积。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传应根据实际展示需要,压缩图片,而不是直接显示原图。手机屏幕比较小,直接显示原图,并不会增加视觉上的收益,但是却会耗费大量宝贵的内存。

  5. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用完毕的图片,应该及时回收,释放宝贵的内存。

  6. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传针对不同的屏幕密度,提供对应的图片资源,使内存占用和显示效果达到合理的平衡。如果为了节省包体积,可以在不影响 UI 效果的前提下,省略低密度图片。

  7. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在 Activity.onPause()或 Activity.onStop()回调中,关闭当前 activity 正在执行的的动画。

  8. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在动画或者其他异步任务结束时,应该考虑回调时刻的环境是否还支持业务处理。例如 Activity 的 onStop()函数已经执行,且在该函数中主动释放了资源,此时回调中如果不做判断就会空指针崩溃。

  9. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 inBitmap 重复利用内存空间,避免重复开辟新内存。

10.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 ARGB_565 代替 ARGB_888,在不怎么降低视觉效果的前提下,减少内存占用。 说明: android.graphics.Bitmap.Config 类中关于图片颜色的存储方式定义:

  • ALPHA_8 代表 8 位 Alpha 位图;
  • ARGB_4444 代表 16 位 ARGB 位图;
  • ARGB_8888 代表 32 位 ARGB 位图;
  • RGB_565 代表 16 位 RGB 位图。 位图位数越高,存储的颜色信息越多,图像也就越逼真。大多数场景使用的是 ARGB_8888 和 RGB_565,RGB_565 能够在保证图片质量的情况下大大减少内存 的开销,是解决 oom 的一种方法。 但是一定要注意 RGB_565 是没有透明度的,如果图片本身需要保留透明度,那么 就不能使用 RGB_565。

11.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 尽量减少 Bitmap(BitmapDrawable)的使用,尽量使用纯色(ColorDrawable)、 渐变色(GradientDrawable)、StateSelector(StateListDrawable)等与 Shape 结 合的形式构建绘图。

12.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传谨慎使用 gif 图片,注意限制每个页面允许同时播放的 gif 图片,以及单个gif 图片的大小。

13.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传大图片资源不要直接打包到 apk,可以考虑通过文件仓库远程下载,减小包体积。

14.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传根据设备性能,选择性开启复杂动画,以实现一个整体较优的性能和体验;

15.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在有强依赖 onAnimationEnd 回调的交互时,如动画播放完毕才能操作页面 , onAnimationEnd 可 能 会 因 各 种 异 常 没 被 回 调 , 建 议 加 上 超 时 保 护 或 通 过 postDelay 替 代 onAnimationEnd。

16.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传当 View Animation 执行结束时,调用 View.clearAnimation()释放相关资源。

八、安全

  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 PendingIntent 时,禁止使用空 intent,同时禁止使用隐式 Intent 说明:
  • 使用 PendingIntent 时,使用了空 Intent,会导致恶意用户劫持修改 Intent 的内 容。禁止使用一个空 Intent 去构造 PendingIntent,构造 PendingIntent 的 Intent 一定要设置 ComponentName 或者 action。
  • PendingIntent 可以让其他 APP 中的代码像是运行自己 APP 中。PendingIntent 的intent接收方在使用该intent时与发送方有相同的权限。在使用PendingIntent 时,PendingIntent 中包装的 intent 如果是隐式的 Intent,容易遭到劫持,导致 信息泄露。
  1. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传禁止使用常量初始化矢量参数构建 IvParameterSpec,建议 IV 通过随机方式产生。 说明: 使用固定初始化向量,结果密码文本可预测性会高得多,容易受到字典式攻击。iv 的作用主要是用于产生密文的第一个 block,以使最终生成的密文产生差异(明文相 同的情况下),使密码攻击变得更为困难,除此之外 iv 并无其它用途。因此 iv 通过 随机方式产生是一种十分简便、有效的途径。

  2. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传将 android:allowbackup 属性设置为 false,防止 adb backup 导出数据。 说明: 在 AndroidManifest.xml 文件中为了方便对程序数据的备份和恢复在 Android API level 8 以后增加了 android:allowBackup 属性值。默认情况下这个属性值为 true,故 当 allowBackup 标志值为 true 时,即可通过 adb backup 和 adb restore 来备份和恢 复应用程序数据。

  3. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传在实现的 HostnameVerifier 子类中,需要使用 verify 函数效验服务器主机名的合法性,否则会导致恶意程序利用中间人攻击绕过主机名效验。 说明: 在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以 回调此接口的实现程序来确定是否应该允许此连接。如果回调内实现不恰当,默认 接受所有域名,则有安全风险。

  4. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传利用 X509TrustManager 子类中的 checkServerTrusted 函数效验服务器端证书的合法性。 说明: 在实现的 X509TrustManager 子类中未对服务端的证书做检验,这样会导致不被信 任的证书绕过证书效验机制。

  5. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传META-INF 目录中不能包含如.apk,.odex,.so 等敏感文件,该文件夹没有经过签名,容易被恶意替换。

  6. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Receiver/Provider 不能在毫无权限控制的情况下,将 android:export 设置为 true。

  7. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传数据存储在 Sqlite 或者轻量级存储需要对数据进行加密,取出来的时候进行解密。

  8. 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传阻止 webview 通过 file:schema 方式访问本地敏感数据。

10.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不要广播敏感信息,只能在本应用使用 LocalBroadcast,避免被别的应用收到,或者 setPackage 做限制。

11.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不要把敏感信息打印到 log 中。 说明: 在 APP 的开发过程中,为了方便调试,通常会使用 log 函数输出一些关键流程的信 息,这些信息中通常会包含敏感内容,如执行流程、明文的用户名密码等,这会让 攻击者更加容易的了解 APP 内部结构方便破解和攻击,甚至直接获取到有价值的敏 感信息。

12.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传对于内部使用的组件,显示设置组件的"android:exported"属性为 false。 说明: Android 应用使用 Intent 机制在组件之间传递数据,如果应用在使用 getIntent(), getAction(),Intent.getXXXExtra()获取到空数据、异常或者畸形数据时没有进行异 常捕获,应用就会发生 Crash,应用不可使用(本地拒绝服务)。恶意应用可通过向 受害者应用发送此类空数据、异常或者畸形数据从而使应用产生本地拒绝服务。

13.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传应用发布前确保 android:debuggable 属性设置为 false。

14.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 Intent Scheme URL 需要做过滤。 说明: 如果浏览器支持 Intent Scheme Uri 语法,如果过滤不当,那么恶意用户可能通过浏 览器 js 代码进行一些恶意行为,比如盗取 cookie 等。如果使用了 Intent.parseUri 函 数 , 获 取 的 intent 必 须 严格过滤, intent 至少包含 addCategory(“android.intent.category.BROWSABLE”) , setComponent(null) , setSelector(null)3 个策略。

15.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传密钥加密存储或者经过变形处理后用于加解密运算,切勿硬编码到代码中。 说明: 应用程序在加解密时,使用硬编码在程序中的密钥,攻击者通过反编译拿到密钥可 以轻易解密 APP 通信数据。

16.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传将所需要动态加载的文件放置在 apk 内部,或应用私有目录中,如果应用必须要把所加载的文件放置在可被其他应用读写的目录中(比如 sdcard),建议对不可信的加载源进行完整性校验和白名单处理,以保证不被恶意代码注入。

17.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传除非 min API level >=17,请注意 addJavascriptInterface 的使用。 说明: API level>=17,允许 js 被调用的函数必须以@JavascriptInterface 进行注解,因此 不受影响; 对于 API level < 17,尽量不要使用 addJavascriptInterface,如果一定 要用,那么:

  • 使用 https 协议加载 URL,使用证书校验,防止访问的页面被篡改挂马;
  • 对加载 URL 做白名单过滤、完整性校验等防止访问的页面被篡改;
  • 如果加载本地 html,应该会 HTML 内置在 APK 中,以及对 HTML 页面进行完整 性校验。

18.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传使用 Android 的 AES/DES/DESede 加密算法时,不要使用默认的加密模式ECB,应显示指定使用 CBC 或 CFB 加密模式。 说明: 加密模式 ECB、CBC、CFB、OFB 等,其中 ECB 的安全性较弱,会使相同的铭文 在不同的时候产生相同的密文,容易遇到字典攻击,建议使用 CBC 或 CFB 模式。

  • ECB:Electronic codebook,电子密码本模式
  • CBC:Cipher-block chaining,密码分组链接模式
  • CFB:Cipher feedback,密文反馈模式
  • OFB:Output feedback,输出反馈模式

19.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传不要使用 loopback 来通信敏感信息。

20.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传对于不需要使用 File 协议的应用,禁用 File 协议,显式设置 webView.getSettings().setAllowFileAccess(false),对于需要使用 File 协议的应用,禁止 File 协议调用 JavaScript,显式设置 webView.getSettings().setJavaScriptEnabled(false)。

21.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Android APP 在 HTTPS 通信中,验证策略需要改成严格模式。说明:Android APP 在 HTTPS 通信中,使用 ALLOW_ALL_HOSTNAME_VERIFIER,表示允许和 所有的 HOST 建立 SSL 通信,这会存在中间人攻击的风险,最终导致敏感信息可能会被劫持,以及其他形式的攻击。

22.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Android5.0 以后安全性要求 较高的应用 应该使 用 window.setFlag (LayoutParam.FLAG_SECURE) 禁止录屏。

23.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传zip 中不建议允许…/…/file 这样的路径,可能被篡改目录结构,造成攻击。 说明:当 zip 压缩包中允许存在"…/“的字符串,攻击者可以利用多个”…/"在解压时改变 zip 文件存放的位置,当文件已经存在是就会进行覆盖,如果覆盖掉的文件是 so、dex 或者 odex 文件,就有可能造成严重的安全问题。
24.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传开放的 activity/service/receiver 等需要对传入的 intent 做合法性校验。
25.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传加密算法:使用不安全的 Hash 算法(MD5/SHA-1)加密信息,存在被破解的风险,建议使用 SHA-256 等安全性更高的 Hash 算法。
26.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Android WebView 组件加载网页发生证书认证错误时,采用默认的处理方法handler.cancel(),停止加载问题页面。 说明: Android WebView 组件加载网页发生证书认证错误时,会调用 WebViewClient 类的 onReceivedSslError 方法,如果该方法实现调用了 handler.proceed()来忽略该证书 错误,则会受到中间人攻击的威胁,可能导致隐私泄露。
27.外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传直接传递命令字或者间接处理有敏感信息或操作时,避免使用 socket 实现,使用能够控制权限校验身份的方式通讯。

学习福利

【Android 详细知识点思维脑图(技能树)】

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
mg-LZIdD9id-1715423647161)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值