
Android
文章平均质量分 81
针叶
心静,成器。
展开
-
在Android应用中集成使用traceroute工具
traceroute是一个常用于Linux系统的网络工具,它可显示数据包在IP网络中所经过路由的IP地址,理想状态下可探测本机和目标地址之间的所有路由节点。原创 2023-05-05 18:17:56 · 1912 阅读 · 1 评论 -
删除Android Studio中重复的JDK配置
可能因为一些不经意的操作,导致如下这种情况:出现多余重复的JDK路径配置,其实指向的是同一个路径。原创 2023-02-12 22:16:01 · 1497 阅读 · 0 评论 -
谁家推送服务限制最严格
先说句题外话,又过了这么多年了,没想到国内Android的统一推送还是没有实现。由于工作需要,最近正好在调研各家系统推送服务,我发现从他们的技术文档可以分析出很多有意思的东西,比如说能看出来哪家厂商的推送限制最严格,最考虑用户的综合体验。在讲解之前,我们先简单提几个推送服务的基本概念:设备:用户所持有的某台设备,在技术文档中所提到的日活跃用户数一般也就指日联网设备数应用:某台设备上安装的某个应用,后续我们所描述的推送数量限制都是以此维度比较的推送:应用进程活跃或关闭时,通过系统级的推送通道下发.原创 2022-05-17 23:52:07 · 1327 阅读 · 0 评论 -
Rust为Android应用编译so库
前言Rust是个好东西,Google也开始把它用于AOSP了。我们开发应用同样也可以使用Rust来编写原本为C++的Native代码。网上搜罗一圈,入门的文档不多不少,这里稍微归纳整理一下吧,毕竟Hello World是人类的一大步。安装RustRust的文档真的非常棒,目前的翻译版本也几乎满足所有学习需求。安装很简单,参考官网(Rust-lang.org)即可,一行命令:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh原创 2022-02-11 15:52:15 · 5505 阅读 · 0 评论 -
Android手机如何修改DPI触发平板模式
前言目前,微信可以支持平板和手机同时登录,不过并不是所有人都有Android平板设备。实际上,我们可以修改系统文件来达到目的。我看了下网上(主要是酷安社区)很多方法其实都已经过时了,包括一些修改工具App。所以你以为改了实际上对微信没用,会发现其他软件都受dpi影响了,但是打开微信还是正常的手机分辨率,也就触发不了平板登录。分析下面我简单说一下原因,主要是很多ROM随着版本升级,可能那些系统配置的参数字段名称已经变了,如果大家还是一味地改以前的参数自然就没有效果,开发那些工具App的朋友们也不能保证原创 2022-01-28 16:19:59 · 15797 阅读 · 0 评论 -
解决Android Studio升级到Arctic Fox后编译失败的问题
问题从Android Studio 4.1.3升级到最新的Arctic Fox之后,整个组件化工程会编译不过。编译错误显示:e: [kapt] ‘com.sun.tools.javac.util.Context’ class can’t be found (‘tools.jar’ is absent in the plugin classpath). Kapt won’t work.很多同学知难而退,被迫回滚到4.1.3,那怎么行呢?分析首先说,这个错误不是组件化插件的问题,不是Kotli原创 2021-12-21 15:50:17 · 834 阅读 · 0 评论 -
Android Shortcut启动导致其他Activity销毁问题
问题我们都知道,从API 25开始,Android加入了类似3D Touch一样的功能,即长按桌面图标可以弹出快捷方式菜单(最多4个)。早期国产系统的桌面Launcher并没有积极适这一功能,所以各大应用也懒得做,后来才逐渐完善。目前包括微信、支付宝等都可以长按弹出快捷方式,支付宝更是支持动态配置。开发文档直接看官方的就行:https://developer.android.com/guide/topics/ui/shortcuts ,静态快捷方式适配很简单,加xml文件就完事,此处不赘述。但在实际原创 2021-09-27 16:54:02 · 537 阅读 · 0 评论 -
最简单改变状态栏文字及背景颜色的方法
问题我们知道,Android的状态栏(StatusBar)是可以由开发者自行更改背景颜色的,至于文字颜色,不能直接由自己修改色值,而是黑白两种颜色,对应的是Light和Dark两种全局主题模式。为了良好的用户体验,我们在状态栏背景为深色时,需要给予白色字体,反之亦然。比如这样:然而,有些时候我们在Light Mode下并不需要黑色字体,就需要自己手动修改了。方法以前我们修改状态栏相关的内容,都是去找各种反射代码,或者各种封装好的StatusBarUtil之类的,不仅代码不优雅,还容易出现千奇百怪原创 2021-08-23 15:04:01 · 3762 阅读 · 1 评论 -
微信Android端如何安全降级
前言最近微信8.0开始灰度更新,小龙给大家整的新功能我就不赘述了。有不少小伙伴等不及灰度,也开始自行下载安装。微信Android端内测下载链接(复制后通过微信打开即可):https://szsupport.weixin.qq.com/cgi-bin/mmsupport-bin/readtemplate?t=page/android_exp__index然而,“后悔药”无论何时都是有市场的。不喜欢or不习惯新版本?想回退旧版本?这让我想到MIUI刷机党回退旧版ROM的麻烦,当然,微信要回退旧版并非难原创 2021-01-26 13:23:23 · 5757 阅读 · 1 评论 -
InputMethodManager内存泄漏已成为历史
历史问题相信做过很多业务开发的同学都遇到过Android应用的内存泄漏问题,虽然大部分泄漏都是我们自己菜导致的,但实际上系统服务也有可能出现内存泄漏。毕竟,代码都是人写的,AOSP也不是完美无瑕的。说到系统服务,在处理文本输入的时候,我们以前经常会看到这样的泄漏:这里大家也可自行搜索了解,大致上就是因为InputMethodManager(下简称IMM)实例内部会持有View,而View又持有Activity的引用,最终在Activity退出后没有正确处理View导致了Memory Leak。我们明原创 2020-11-27 12:55:46 · 1025 阅读 · 0 评论 -
源码茶舍之没有epoll就没有Handler
Handler,英文释义:处理者,处理程序。他就是Android系统中的打工人,背负着传递消息的重任。很多人在第一次尝试去阅读framework源码时,可能也是从Handler消息机制开始的,我们会发现源码的很多地方都用到了Handler。然而,他好像并没有我们想象的那么简单,如果我们要深入探索的话,可以一直追溯到Linux内核。预备本文分析源码均基于API 29,来源于官方AOSP:cs.android.com问号Handler的API使用还是比较简单的,我们比较常用的就是通过类似如下方式来发.原创 2020-11-19 00:07:28 · 482 阅读 · 1 评论 -
Mace-micro引擎编译与测试
官方简介Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算平台(支持Android, iOS, Linux, Windows)优化的神经网络计算框架。主要从以下的角度做了专门的优化:性能代码经过NEON指令,OpenCL以及Hexagon HVX专门优化,并且采用Winograd算法来进行卷积操作的加速。此外,还对启动速度进行了专门的优化。功耗支持芯片的功耗管理,例如ARM的big.LITTLE调度,以及高通Adreno GPU功耗选项。.原创 2020-10-25 16:03:59 · 634 阅读 · 0 评论 -
Magisk与EdXposed框架安装实践(Android P及以上)
记得初中的时候还在用Android 2.3,高中开始刷机,每个月都去追论坛大佬的自定义精简ROM,不亦乐乎,这一晃都过了快十年了。从以前旧版Android(支持到8.x)的Xposed到现在的EdXposed、Magisk等玩机框架,大佬些的脚步从未停歇。模块开发生态也好了很多(得益于Github及各种文档)。不过由于现在ROM厂商越来越深度的定制和限制(当然也是考虑到普通用户的安全),ROOT起来也麻烦了不少。其实我自从以前用Android 4.x时搞过机,后来也很久没接触这些了。最近把手边的测试机器(原创 2020-07-04 01:08:30 · 23749 阅读 · 0 评论 -
覆盖安装Play Store版本的国产App
前言对于Android平台,如果在国内应用商店安装诸如微信、支付宝等国产大型App,相比去Google Play Store安装,会多要不少权限,即便权限无差异,在隐私政策等规则方面,Play Store也会更严格一些,能上架的应用肯定不敢乱搞。之前也有不少用户反映在Play Store安装的微信要流畅不少,某些功能细节也会有差异。不过由于严格的审核机制,Play Store上的国产App更新频率普遍落后于国内应用商店,如果我们已经安装了国内的最新版本,正常情况下就没办法覆盖安装低版本了。Play St原创 2020-06-06 12:55:07 · 2187 阅读 · 0 评论 -
用Gradle脚本管理Manifest文件
编译时区分不同的manifest很多Android项目都会区分debug和release的manifest文件,以便调试,一些组件化的项目甚至有多个manifest文件来调试不同的组件。举个简单的例子,在app的build.gradle文件中:android { defaultConfig { applicationId "com.xxx.xxx" } sourceSets { main { if(是否为debug打包) {原创 2020-06-01 22:36:08 · 4501 阅读 · 0 评论 -
Win10用WSL下载AOSP
WSL还是挺方便的,配合国内镜像源,可以轻松下载Android源码。启用WSL关于Win10启用WSL的方法微软官方的文档非常清晰了:适用于 Linux 的 Windows 子系统安装指南 (Windows 10)。由于我这里只用到WSL 1而非WSL 2,所以Win10版本号更新到1909即可,等2004正式推送再折腾WSL 2吧。安装Ubuntu 20.04直接在微软应用商店搜索Ubuntu即可下载安装。更好地体验WSL,建议安装Windows Terminal这一步非必须,不过Windo原创 2020-05-17 13:55:18 · 1543 阅读 · 2 评论 -
自定义EditText的无障碍描述(不读hint)
问题我们一般给一个控件设置描述时,会这样:xxxView.setContentDescription(``"xxx"``);但是,当你给EditText设置这个时,会发现毫无卵用。为什么呢?搜了下EditText和其直接父类TextView,没有重写setContentDescription方法,那应该不是setXXX时发生改变,而是getXXX的问题。果然,在TextView中发现:/** * Returns the text that should be exposed to acces原创 2020-05-14 23:44:02 · 1374 阅读 · 0 评论 -
快速修改字节码并重打jar包
背景不管是做Android项目还是Java后端Web项目,我们一般都会引用各种三方库。遇到特殊需求时,可能需要修改jar包中的代码。本文以实际示例讲解一些基本方法,方便大家快速入坑。首先我们都知道直接解压jar包的话,都是class二进制文件,打开后是看不见代码的。之所以可以在开发环境中直接查看jar中的代码是因为IDE已经帮你反编译好了,才能看见Java源码。入坑如何修改这些jar包中的...原创 2020-03-25 02:04:01 · 1649 阅读 · 0 评论 -
Windows安装repo的真正解决方案
背景2020真是魔幻的一年,受疫情影响,大家年后一段时间都远程办公了。奈何很多同事在家没有Linux开发环境,想在Windows上通过repo工具下载Android源码简直比登天还难。网上搜来受去没几个讲透彻的,今天给大家整活。按下面步骤来,保证OK,我们最终以 repo init 执行成功为目标。走起一、安装Git for Windows先到官网(https://git-scm.com...原创 2020-02-05 22:21:22 · 25543 阅读 · 16 评论 -
源码茶舍之如何由Uri找寻ContentProvider
引子我们都知道四大组件之一ContentProvider的用处,它给大家提供一种统一的数据访问格式。调用者无需关心数据源于何处(如DB、XML文件和网络等),只需获取到对应的ContentResolver来进行增删查改即可。自己实现一个Provider的时候,也会在配置文件中声明如下:<provider android:name=".provider.TestProvider"...原创 2020-01-29 19:05:36 · 299 阅读 · 0 评论 -
源码茶舍之FLAG_EXCLUDE_STOPPED_PACKAGES与广播唤醒
发现我们先随便实现一个BroadcastReceiver,静态注册:class TestReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.w("TEST-1", "onReceive ${intent?.action}") ...原创 2020-01-21 15:23:58 · 704 阅读 · 0 评论 -
RecyclerView中DiffUtil的一些注意事项
节能刷新移动设备屏幕大小有限(不得不说我是顽固的小屏爱好者,大于5.5寸难以接受,时代已经抛弃我了哈哈),列表(List)可以说是一个出现非常高频的交互设计。大多数情况下我们的列表不仅仅是一次性加载本地数据,而要应付来自网络的各种动态内容,可能是增加、删除等操作。在Android开发中,一个耳熟能详的方法就是 notifyDataSetChanged ,在适配器(Adapter)的设计模式下,...原创 2020-01-13 01:55:46 · 2937 阅读 · 1 评论 -
MTK设备上DuraSpeed导致Service无法启动的问题
没想到联发科还会改framework,有点小惊讶……背景问题的起因是我们的系统应用无法调起与其他部门联动的某个Service组件了。查日志发现有这么一行:1276-2330/system_process D/ActivityManager: bringUpServiceLocked, suppress to start service!提示内容大概是说Service的启动被禁止了,当...原创 2020-01-05 18:14:43 · 2009 阅读 · 1 评论 -
避免Android定制ROM中的EditText出现pop弹窗
问题可能看到标题的同学一头雾水,这是什么东西,其实类似于你长按文本时出现的复制粘贴pop弹窗。在一些定制ROM中,厂商为了某些方便用户的特殊功能会增加文本输入检测和自定义弹窗,举例:比如在你输入一些邮箱时,会自动弹出这种pop(并不需要你长按),且这个并非系统应用才有的,而是直接影响了所有EditText。对于一些高度定制化UI的应用来说,这个可能影响用户体验。下面给出两种解决办法(都不算...原创 2019-12-07 17:03:56 · 461 阅读 · 0 评论 -
源码茶舍之PackageManager获取注册Service数量问题
问题今天有朋友遇到个问题,说bindService失败了,查了几步发现是由于PackageManager获取不到对应的Service组件导致的。具体示例代码如下:val serviceInfos = packageManager.getPackageInfo("com.xxx.xxx", PackageManager.GET_SERVICES).servicesLog.d("TEST", A...原创 2019-11-02 13:50:55 · 554 阅读 · 0 评论 -
Gradle命令编译失败NoClassDefFoundError和VerifyError
问题不知道大家在编译gradle项目的时候习惯直接在Android Studio这种IDE里面还是命令行操作。今天在Deepin系统里面用命令编译:./gradlew assembleDebug直接报错:Exception in thread “main” java.lang.NoClassDefFoundError: org.gradle.wrapper.BootstrapMain...原创 2019-10-13 15:01:47 · 616 阅读 · 0 评论 -
OkHttp拦截器获取GET/POST请求参数并添加公共参数
我们在创建OkHttp客户端时,可以添加各种拦截器,真的很香:OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .addInterceptor(new XXXInterceptor()) .addIntercept...原创 2019-07-05 23:36:49 · 12299 阅读 · 6 评论 -
Gson混淆配置的一些小坑
Gson就不介绍了,援引一下官方的哈哈:A Java serialization/deserialization library to convert Java Objects into JSON and back我们在配置Proguard配置文件时,都会用Gson官方文档给出的:##---------------Begin: proguard configuration for Gso...原创 2019-07-05 23:14:02 · 3874 阅读 · 0 评论 -
为何点击推送通知打不开Activity?Calling startActivity() from outside……
小米推送Android SDK有这么一个耳熟能详的方法:/** * 接收服务器向客户端发送的通知消息,在用户手动点击通知后触发 */public void onNotificationMessageClicked(Context context, MiPushMessage message) { ... context.startActivity(intent);}如果在其中手动...原创 2019-07-02 02:01:29 · 2208 阅读 · 1 评论 -
在ActionBar上实现返回键和Toolbar共存
在Activity的onCreate里加上两句设置Bar的方法,第一个方法一般是继承AppCompatActivity都会自带的方法,看参数便知道是设置Toolbar用的。原创 2016-07-09 01:37:45 · 1409 阅读 · 0 评论 -
OkHttp拦截器实现无网络时加载缓存,避免Unknown host异常
我们在创建OkHttp客户端时,可以添加接口数据缓存,真的很香:File cacheDir = ... // 缓存目录,可以是内部存储也可以是外部存储的目录OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .cache(new ...原创 2019-07-05 23:52:55 · 2720 阅读 · 0 评论 -
OkHttp拦截器实现禁止一切网络请求
我们在创建OkHttp客户端时,可以添加各种拦截器,这是我见过最有可玩性的库之一:OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .addInterceptor(new XXXInterceptor()) .ad...原创 2019-07-06 00:01:46 · 2387 阅读 · 1 评论 -
Kotlin操作符快速获取爸爸的儿子的狗的名字
NPE(NullPointerException)是最低级且也最容易犯的错,也是最喜欢遇到的Bug因为好解。本文适合Kotlin入门萌新食用,大佬轻喷哈哈哈!问号N连帮你空处理(?)假如服务端返回一个json嵌套了各种数据,映射成POJO大概是这样:// 此处为简洁省去getter和setterpublic class TestParent { private TestChi...原创 2019-08-01 13:37:03 · 263 阅读 · 0 评论 -
Ubuntu安装Source Insight导入Android源码并设置仿IDEA主题Darcula
预览先来张图给大家感受下效果,然后我再慢慢道来过程,保证你避免每一步的坑。我们要做什么1、由于Source Insight(以下简称SI)是Windows应用,所以不能直接安装在Linux上,于是我们要借助wine,所以第一步会介绍wine的安装过程和坑;2、介绍SI在Linux(以Ubuntu 16.04为例)上的安装,并介绍如何导入免费证书(个人建议大家有条件还是付费支持一下SI这个...原创 2019-08-16 22:50:32 · 1293 阅读 · 1 评论 -
OkHttp自定义重试拦截器出现IllegalStateException: cannot make a new request……异常
问题OkHttp自定义重试拦截器常见实现方式:private static class RetryInterceptor implements Interceptor { @Override public okhttp3.Response intercept(Chain chain) throws IOException { int retryCount = 0...原创 2019-09-20 13:39:21 · 7985 阅读 · 0 评论 -
看看,Jetpack Compose是什么新东西
Google 在 I/O 2019 上宣布 Kotlin 成为 Android 开发首选语言(怎么又宣布了哈哈),并且以后会有新的 Jetpack API 和功能将在 Kotlin 中提供,值得注意的是 Google 当天开源了一个叫 Jetpack Compose 的东西,让我们来看看是什么。这里是目前公开的资料:https://developer.android.com/jetpack/...原创 2019-05-09 17:14:23 · 5462 阅读 · 1 评论 -
微信小程序任务栈实现原理
背景之前面试一些校招同学,聊到微信小程序是什么launchMode,其任务栈是如何实现的?很多同学只提到singleInstance,这是不合适的。今天我们就猜测并解析一下微信主程序与小程序的关系与大致实现,最后给出源码,可以给大家作一个简单参考。初探既然要研究微信,那么我们就先打开几个小程序,再用adb命令看看任务栈信息。在终端使用 adb shell dumpsys activity...原创 2019-04-27 14:25:07 · 1448 阅读 · 4 评论 -
在Android上画一个月食动画
貌似7月28号有月食,我个人对天文现象还是挺感兴趣的,虽然已经过了一周了,但还是想把它留下来。 之前看到一个H5的月食动画,感觉很有意思,于是拿起Android的画笔画布,自己实现了一个,很简单,但看起来还不错。 先看看效果: 其中黄色的我们就当作月亮吧,黑色的当作地球或者别的星体,白底就当作天空吧哈哈。 为了好玩一点,这个动画除了能自动播放,还能点击暂停和支持拖动地球去随意遮挡月亮。...原创 2018-08-04 00:30:17 · 1015 阅读 · 0 评论 -
如何防止开发者选项关闭动画后使其失效
很多用户为了手机用起来感觉上快,在开发者选项里把系统动画给关了,即把那3个缩放比例改成了0,系统默认一般是1x。个人建议调到0.5x就很合适了,没必要关闭,否则某些动效比较多的App体验会很差。 本文的问题就是,当开发者选项中的动画缩放比例被全部调成0后,App中部分设置了duration的属性动画就会失效,表现为直接从开头跳到了结尾,没有动画过程。我们先分析下为什么会这样。 看Value...原创 2018-08-03 22:37:32 · 7516 阅读 · 1 评论 -
USB调试Android设备时遇到no permissions (verify udev rules)的解决办法
最近在Ubuntu上调试一些Android O系统的手机,出现adb root失败的情况,明明手机已经root了。 具体就是在执行adb devices查看连接的设备时,设备后显示no permissions (verify udev rules)字样。 根据官网的提示,去查文档:https://developer.android.com/studio/run/device.html#sett...原创 2018-03-03 13:44:11 · 3689 阅读 · 0 评论