首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

微信 WCDB 进化之路 - 开源与开始

SQL注入通常是利用SQL字符串拼接的特点,用一些特殊符号提前截断SQL,达到执行其他SQL的目的。试想这么一段代码: 这段封装很简单,就是将消息内容插入数据库中。... Android 2.x 时代,由于系统不完善,很多手机用户选择通过 Root 和刷机定制自己的手机。... Android SDK 中,SQLite 是会不断升级的,实际上使用哪个版本的 SQLite 取决于 APP 运行在哪个版本的系统上,这是对开发者来说相当不友好,因为同样的 SQL 语句会有不同的性能表现...如果业务需要使用 SQLite 的新特性,比如我们的我们的全文搜索,就更加需要确定版本的 SQLite 保证新特性在所有手机上都可用。...Cursor 实现优化 Android 框架查询数据库使用的是 Cursor 接口调用 SQLiteDatabase.query(...)

1.4K40

微信 WCDB 进化之路:开源与开始

换句话说,就是单线程下会不断地阻塞数据库。这就会直接影响用户收发和查看聊天记录。 难道用户备份数据的时候,就不能使用微信了吗?显然不现实。 于是,我们就让WCDB完成了一次进化。... Android 2.x 时代,由于系统不完善,很多手机用户选择通过 Root 和刷机定制自己的手机。... Android SDK 中,SQLite 是会不断升级的,实际上使用哪个版本的 SQLite 取决于 APP 运行在哪个版本的系统上,这是对开发者来说相当不友好,因为同样的 SQL 语句会有不同的性能表现...如果业务需要使用 SQLite 的新特性,比如我们的我们的全文搜索,就更加需要确定版本的 SQLite 保证新特性在所有手机上都可用。...Cursor 实现优化 Android 框架查询数据库使用的是 Cursor 接口调用 SQLiteDatabase.query(...)

5.3K51
您找到你想要的搜索结果了吗?
是的
没有找到

我闻到了 Android AppCompat 代码的坏味道!

,例如 Api 19 的话应该直接使用 ActivityCompat,你 ActivityCompatApi23 又出来捣什么乱?...也就是说, ActivityCompatApi23 本不应该被加载进来的。 可是我现在调用 Kotlin 的 allSuperType 获取所有父类就会触发它的加载,这又是怎么回事?...原来 Kotlin 通过反射查询这些父类的时候,会运行这里: ?...再吐槽两句 关于这个问题我其实还想说的是: 我为了偷懒直接调用了一个获取所有父类和接口的 API,实际上我只是递归地遍历父类, FragmentActivity 之前遍历就会结束,也就是说根本不会触发对...Android Support 库里面 FragmentActivity 的父接口里面居然有对涉及兼容 Api 的显式引用,这个写法简直了,臭臭的。。 我觉得这事儿不怪 Kotlin ! ----

59710

开发一款 SDK 需要注意哪些问题

(jdk 11), 应为 52.0(jdk 8) 所以,SDK 非必要情况下,Java 版本尽量兼容最低,除非遇到特殊情况,例如 SDK 需要适配 Android 12,但 Deprecated 的...上面这个报错是接入 Compose 依赖后报错的一个 app 工程 compileSDK 版本过低的问题,升级 33 即可,这时我就在想了,一个依赖组件是怎么影响主工程的 compileSDK 版本的...@Deprecated 标注方法废弃,since 标明从哪个版本开发废弃,forRemoval 标明未来将会删除该方法 注释使用 @deprecated 标注提供新的替换方法 调用效果如下,将鼠标移至方法处会提示...: image.png 可以使用快捷键实现一键替换 使用新的方法进行代替 4、非空处理 对外接口必须标明入参与返回值的可空与非空,避免业务方发生 NPE 问题,下面列个对比: image.png kotlin...7、DIP 依赖倒置原则 SDK 提供抽象接口,业务方依赖接口调用,这么做的好处是,业务方面向接口调用使用简单,还能避免使用不稳定的内部实现,并且,内部实现可以进行混淆。

21410

Android中的线程

Android 中线程的使用 线程 Android官网文档->https://developer.android.com/guide/components/processes-and-threads.html...继承 Thread类 实现 Runnable接口 继承Thread类 重写 run方法,调用start()后JVM会自动调用run()方法 /** * 通过继承Thread 创建一个Thread...当线程执行完毕后,他放弃“互斥锁”,如果一个线程获得“互斥锁”时,其余的线程就必须等待当前线程结束并放弃“互斥锁”。 java中,提供了关键字synchronized实现对象的“互斥锁”关系。...Looper的loop()方法,是因为程序启动的时候已经为主线程创建好了Looper,并且调用了loop(),一直等待消息 工作线程给工作线程发消息 跟上面两个一样,想给哪个线程发消息就要先拿到哪个线程的...… ExecutorService的方法中可以看到线程池除了可执行Runnable接口还可以执行Callable 接口,并且可以通过Future感知线程状态和结果。

1.4K140

AndroidP升级之路

一、升级Target23,兼容Android6.0 问题:敏感权限需要动态申请,不会安装时自动授权。...详情见Android官方文档 · 如果设备运行的是 Android 5.1 更低版本,或者应用的目标 SDK 为 22 更低:如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限;如果他们不授予此权限...· 如果设备运行的是 Android 6.0 更高版本,或者应用的目标 SDK 为 23 更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。...斗破苍穹的升级过程需要分以下两步做。 一、升级Target23,兼容Android6.0 问题:敏感权限需要动态申请,不会安装时自动授权。...· 如果设备运行的是 Android 6.0 更高版本,或者应用的目标 SDK 为 23 更高:应用必须在清单中列出权限,并且它必须在运行时请求其需要的每项危险权限。

1.2K31

Android 14 Developer Preview一览

获取Android 14 如果你想要现在就对Android 14进行尝鲜,那么主要有两种办法,一是使用一台Pixel 4更高版本的Pixel系统手机,二是使用Android Studio自带的模拟器。...所以,如果你还需要依赖这种精准闹钟的API,那么使用之前,应该先调用canScheduleExactAlarms()方法判断我们是否有权限设置精准闹钟。...白名单自然就是所有Android官方的API接口,这些都可以放心地调用。...compileSdkVersion比较好理解,就是用于编译当前项目的Android系统版本。你指定到了哪个版本,就可以使用哪个版本的API,指定版本过低的话,一些新版系统中推出的API就使用不了了。...targetSdkVersion则是另外一回事,它指的是,你的App已经为哪个Android系统版本做好了适配,系统会根据你指定的版本决定是否启动某项功能。

45120

Android P 行为变更

不论应用针对的是哪个 Android 版本,其中大部分变更会影响所有应用;不过部分变更仅影响针对 Android P 开发的应用。...设备安全变更 运行 Android P 的设备提供密钥轮替以及系统调用保护。不论您的应用针对哪个级别的 API,此类变更都能显著提升应用安全性。...若您的应用面向 Android 8.1 (API 等级 27) 更低版本进行开发,您请求调用 Bouncy Castle 用以实现已弃用的算法时,您将收到警告信息。...开发者不可以 StrictMode 激活状态下待机应用,否则,应用可能产生新的异常,比如:使用 detectNetwork()  detectAll()  方法获取策略侦测网络违规时,会产生NetworkOnMainThreadException...您可以传送 socket 标记其它线程之前,调用 untagSocket() 保留以前的行为。

2.6K20

(三)组件治理之编译期检查

拿到参与编译的版本,然后读取 local.properties 里的 sdk.dir 路径,由此即可拼接出 android.jar 的路径,以此拿到 Android SDK 源码,读取到的路径如下:...2、检查 class 文件引用外部类的情况 一个类引用到其他类的几种情况: 注解:类、字段、方法、参数使用注解去描述的情况 字段:使用类去申明的字段,基础类型忽略 方法:方法 Code 里涉及的外部类字段...、方法的调用 接口 父类 我们遍历所有参与编译依赖的 Class 文件时(Android、java 源码不参与遍历),即可通过这些情况去分析引用情况。...这里有一个细节点,方法 Code 中的字段与方法调用 owner 找不到的情况还要继续从他的父类与接口继续查找,因为调用的字段与方法有可能在父类。...,他们的包名不同的 SDK 版本不一样,但他们在运行阶段会通过 SDK 版本来选择加载哪个类,所以,类似这类的 unsolved 是可以放过的,但前提是做好 review 3、检查 xml 中 class

17130

Android Pie限制非 SDK 接口调用

只要应用引用非 SDK 接口尝试使用反射JNI获取其(包括Method、Class、Field)句柄,这些限制就适用。...非SDK接口等级 Android9.0后 , Android 10、11都陆续更新了非SDK提供接口全集....预计这些接口未来的 Android 版本中会被有条件地屏蔽,并列 max-target-x 名单中。...SDK (whitelist) 已在 Android 框架中正式记录、受支持并且可以自由使用接口 简单描述则为以下情况 : black List : 不管在哪个平台上 , 都会抛出错误 greylist-max-x...: 当APP的TargetVersion与运行时Android版本相同时 , 则会抛出错误 greylist : 目前可以继续调用 , 其实系统是不建议这样使用 , 可能在未来的版本会加入greylist-max-x

1.1K30

Android入门教程 | 四大组件之Service(前台服务,后台服务)

前台服务 台服务执行一些用户能注意的操作。例如,音频应用会使用前台服务播放音频曲目。前台服务必须显示通知。 即使用户停止与应用的交互,前台服务仍会继续运行。...例如,如果应用使用某个服务压缩其存储空间,则此服务通常是后台服务。 文中的服务/Service 指的是后台服务。 示例使用Kotlin实现。...方法 介绍 stopService(Intent) Activity其他组件调用这个方法,停止目标service stopSelf() Service调用这个方法停止自己 例如在Activity中...() stopService() 停止服务,服务会走onDestroy()方法。...绑定服务 方法二 通过接口Iservice调用Service方法,使用接口调用service和直接调用其实本质都是一样的,只不过多了借口一个步骤 4.

4.6K30

Gradle 与 AGP 构建 API: 如何编写插件

无论请求运行哪个 Task,配置阶段都会执行。配置阶段执行耗时操作会导致较长的配置时间。 Task 的执行应当只执行阶段发生,所以我们需要将打印调用移动至执行阶段。...我可以通过添加 doFirst() doLast() 函数来达到这一目的,二者分别可以执行阶段的开始和结束时打印 hello 消息。...阶段结束时,AGP 将会锁定 DSL 对象,这样它们就无法再被更改。如果我再次运行构建,我会看到应用的 staging 版本被构建了。...现在,假设我的一个测试没有通过,这时我想要禁用单元测试构建一个内部版本,以找出问题所在。 为了禁用单元测试,我可以使用 beforeVariants() 回调。...本文中,您已经了解了如何使用新的 Variant API AndroidComponentsExtension 中注册回调、使用 DSL 对象初始化 Variant、影响已被创建的 Variant

79230

Android面试题集

动态注册:非常驻,跟随组件的生命变化,组件结束,广播结束组件结束前,需要先移除广播,否则容易造成内存泄漏。 广播发送和接收的原理了解吗?...描述一下Android的事件分发机制? Android事件分发机制的本质:事件从哪个对象发出,经过哪些对象,最终由哪个对象处理了该事件。此处对象指的是Activity、Window与View。...重写 如果是跨版本数据库升级,可以由两种方式,如下所示: 逐级升级,确定相邻版本与现在版本的差别,V1升级V2,V2升级V3,依次类推。...避免Bitmap浪费过多的内存,使用压缩过的图片,也可以使用Fresco等库优化对Bitmap显示的管理。...APK安装过程中会调用dexopt将DEX文件优化成ODEX文件,dexopt使用LinearAlloc存储应用信息,关于LinearAlloc缓冲区大小,不同的版本经历了4M/8M/16M的限制,

81710

Android权限机制,你真的了解吗?

然而,不同版本的操作系统不同的target SDK level中的结果是不同的。...如果设备运行Android5.1或者更低版本的操作系统,或者你的目标SDK版本号小于等于22,当你manifest文件中请求了一些权限,用户必须在安装过程时授予全部权限,否则应用不能正常安装。...如果设备运行在Android6.0或者更高版本,并且目标SDK版本号大于等于23,应用程序必须要在manifest文件中声明需要的权限,当程序运行时,它必须要向用户请求授权每个所需的敏感权限。...更高版本并且设备版本Android6.0或者更高。...targetAPIleve:是在编译的时候起作用,用于指定使用哪个API版本(SDK版本)进行编译。

5.9K100

BAT最新内部Android经典面试题目大汇总!

” 变成“edcba” 4、 抽象类与接口的区别(abstract与interface的区别) 5、 集合的实现类与区别?...12、 常用排序算法,时间复杂度,实现思路 13、 android系统架构? 14、 Activity生命周期?保存activity的一些信息在哪个生命周期方法中?...35、 android内存的优化 36、 加载大图片的时候如何防止内存溢出 37、 Android缓存机制 38、 如何实现消息推送,有哪些方式,各自优缺点,最常使用哪种?...39、 MVCAndroid中的应用 40、 Android自定义组件实现思路 41、 版本更新的实现思路 42、 播放视频有哪些实现方式? 43、 NDK开发流程?...【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间学习

49100

Android 广播机制(Broadcast)介绍与使用

Android应用可以通过广播从系统其他App接收发送消息。类似于订阅-发布设计模式。当某些事件发生时,可以发出广播。 系统某些状态改变时会发出广播,例如开机、充电。App也可发送自定义广播。...AndroidManifest.xml中注册称为静态注册。动态注册的刚波接收器一定要取消注册。onDestroy()方法中调用unregisterReceiver()方法取消注册。...不要在onReceive()方法中添加过多的逻辑操作耗时的操作。因为广播接收器中不允许开启线程,当onReceive()方法运行较长时间而没结束时,程序会报错。...manifest中使用permission标签 添加后编译一下。...实验中我们注意,Intent.ACTION_TIME_TICK广播是可以截断的。

2.8K30

基于React-Native0.55.4的语音识别项目全栈方案

调用Web API的多媒体采集接口需要特定的域 Web API的多媒体接口是WebRTC技术PC端的实现,由于多媒体采集涉及用户隐私,所以浏览器端调用这个接口需要在安全的域下才能被调起,安全的域是指以下三类...测试结果: 应用编译目标版本为API23支持API23Android6.0)的虚拟机和真机中测试,均无法通过WebAPI接口调起麦克风进行录音。...cordova的基本原理是将一般UI层操作和功能放在WebView里实现,需要调用移动设备硬件原生接口时,均通过添加cordova插件的形式实现,每一个cordova版本都会横跨支持若干个Android...版本,例如新的cordova7.0.0官方文档的说明中是支持android从4.48.1版本的,笔者认为非常适合小型hybrid开发团队使用。...cordova7.0.0的脚手架经测试国内是可以使用的,新建的工程无论是通过自带命令行还是import进Android Studio进行开发都可以打包为对应的工程,官方文档有很详细的调用各种底层接口的说明

3.6K30

最新 Android 面试点梳理,我收藏了你呢?

:类之间的依赖关系应该建立最小的接口上 迪米特原则:一个对象对其他对象应该有尽量少的了解 Java 23 种设计模式(按目的分类为:5+7+11) 1995 年 GoF(四人组)出了一本设计模式的书,...插入消息时会根据消息执行时刻 Message#when 决定插入什么位置,when 为 0 最早执行就会插入链表头,否则按执行时刻排序插入 插入后如果正在阻塞则会尝试唤醒,插入到头部则会唤醒,...Binder 的工具 Android Interface Definition Language,可实现跨进程调用方法 服务端:将暴漏给客户端的接口声明 AIDL 文件中,创建 Service 实现.../tombstones 下,并在 logcat 输出崩溃日志 定位:so 库剥离调试信息的话,只有相对位置没有具体行号,可以使用 NDK 提供的 addr2line ndk-stack 定位 addr2line...Jetpack 组件架构的 LiveData、ViewModel 可以便捷的实现 MVVM 原文链接文章的知识点将持续更新及补充,如果你对文中涉及的知识点有疑问,欢迎原文链接文章中评论后台留言哦

69821

如何实现文本内容折叠并显示“...查看全部”?

可以考虑使用"双边逼近法"(称”二分法“)查找合适的截取长度x,大大减少尝试的次数。...监听文本容器宽度的变化,可以考虑使用ResizeObserver监听,但是这个接口的兼容性不够好(IE各个版本都不支持),因此选择了一个npm库element-resize-detector监测(非常好用...每次refresh调用会异步地递归调用多次checkLoop,refresh可能重新调用,新的refresh调用结束之前的checkLoop的调用。...不过或许可以借助浏览器的Range API 实现截断位置的定位,Range的insertNode以及setStart接口可以将“...查看全部”插入指定位置,而如果插入位置刚好符合需要,则可以通过Range.cloneContents...想解决这个问题,可以使用一个脱离文档流的元素来进行字符串动态截断后的渲染与判断,布局就类似上述的textarea。 因为不在文档流中,回流的影响范围就会减少该元素自身。

4.7K20
领券