自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

倚竹幽篁

心静,成器。[github/ysy950803]

  • 博客(106)
  • 论坛 (6)
  • 问答 (1)
  • 收藏
  • 关注

原创 InputMethodManager内存泄漏已成为历史

历史问题相信做过很多业务开发的同学都遇到过Android应用的内存泄漏问题,虽然大部分泄漏都是我们自己菜导致的,但实际上系统服务也有可能出现内存泄漏。毕竟,代码都是人写的,AOSP也不是完美无瑕的。说到系统服务,在处理文本输入的时候,我们以前经常会看到这样的泄漏:这里大家也可自行搜索了解,大致上就是因为InputMethodManager(下简称IMM)实例内部会持有View,而View又持有Activity的引用,最终在Activity退出后没有正确处理View导致了Memory Leak。我们明

2020-11-27 12:55:46 93

原创 源码茶舍之没有epoll就没有Handler

Handler,英文释义:处理者,处理程序。他就是Android系统中的打工人,背负着传递消息的重任。很多人在第一次尝试去阅读framework源码时,可能也是从Handler消息机制开始的,我们会发现源码的很多地方都用到了Handler。然而,他好像并没有我们想象的那么简单,如果我们要深入探索的话,可以一直追溯到Linux内核。预备本文分析源码均基于API 29,来源于官方AOSP:cs.android.com问号Handler的API使用还是比较简单的,我们比较常用的就是通过类似如下方式来发.

2020-11-19 00:07:28 29 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 111

原创 给MIUI开发一个5G快捷开关

早年4G设备刚刚普及的时候,我记得通知栏还有专门的快捷开关来控制4G/3G网络的切换,和WiFi开关、GPS开关类似。现在5G来了,我发现MIUI没有这种开关了,要打开系统设置到很深的入口里去开关5G,这就很不爽了。毕竟5G还是很耗电的,也不是所有地方都有基站,平时完全需要一个快捷开关来自己控制。思路从Android N开始,系统支持开发者自己实现QuickSettings,说白了就是在通知栏/控制中心里添加一个快捷开关,用户可以拖出来使用。代码也很简单,只需要实现 android.service..

2020-08-13 15:48:09 791

原创 借助acme.sh免费开启网站的HTTPS(Apache2环境)

本文仅记录无套路搞定网站HTTPS的方法。网上搜索的资料实在太杂乱了,就连acme.sh官方文档也不够详尽。主要就三步:生成证书、安装证书、配置SSL。下文以Ubuntu 16.04(版本不重要) + Apache2为例。默认已经安装crontab、openssl等基本工具。网站目录也是默认的 /var/www/html/ 。生成证书1、先做准备工作:# 进入服务器的用户(一般是root)目录然后创建文件夹cd ~mkdir -p ~/.acme.sh/cd ~/.acme.sh/# 配.

2020-07-09 15:22:07 179

原创 等差数列异或和的小规律

背景异或(xor,运算符号^):按位计算,同0异1,1 ^ 0 = 1 ,1 ^ 1 = 0 ,如此。现定义等差数列 1, 2, ... , n 的 异或和 为 f(n) = 1 ^ 2 ^ ... ^ n ,求f(n)的值。实现我们很容易想到质朴的实现如下:int func(int n) { int xor_sum = 0; for (int i = 1; i <= n; ++i) { xor_sum ^= i; } return xor_s

2020-07-06 17:49:54 168

原创 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 8467

原创 Kotlin变长参数的一些小坑

Java中的变长参数先来看看Java中的变长参数,很简单,为了后面的对比,我们做进行一个连续的传参:import java.util.Arrays;public class TestVarargs { public static void main(String[] args) { test1("1", "2"); } private static void test1(String... args) { test2(args);

2020-06-13 15:19:39 189

原创 浅谈JVM语言之函数式编程

Java中的函数式编程闲聊函数式编程在上世纪五十年代就有了,只不过在工业界一直不温不火,最近十年才被广泛认知。其理论基础也并非为编程而设计,而是一种数学抽象(Lamda演算),其实初中就学过了,λ表达式。在JS(建议把JS作为函数式编程思想学习的入门语言,Java的实现略显臃肿,可能不太便于理解)当中,函数式编程算是应用比较多的了。各现代高级编程语言,都或多或少地支持了函数式编程。一些基本特点总结相比平常的指令式编程,函数式编程更在乎执行结果而非过程;函数是一等公民,可以像普通的数值、引用等变

2020-06-10 12:47:39 126

原创 覆盖安装Play Store版本的国产App

前言对于Android平台,如果在国内应用商店安装诸如微信、支付宝等国产大型App,相比去Google Play Store安装,会多要不少权限,即便权限无差异,在隐私政策等规则方面,Play Store也会更严格一些,能上架的应用肯定不敢乱搞。之前也有不少用户反映在Play Store安装的微信要流畅不少,某些功能细节也会有差异。不过由于严格的审核机制,Play Store上的国产App更新频率普遍落后于国内应用商店,如果我们已经安装了国内的最新版本,正常情况下就没办法覆盖安装低版本了。Play St

2020-06-06 12:55:07 453

原创 用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 266

原创 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 384

原创 自定义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 229

原创 快速修改字节码并重打jar包
原力计划

背景不管是做Android项目还是Java后端Web项目,我们一般都会引用各种三方库。遇到特殊需求时,可能需要修改jar包中的代码。本文以实际示例讲解一些基本方法,方便大家快速入坑。首先我们都知道直接解压jar包的话,都是class二进制文件,打开后是看不见代码的。之所以可以在开发环境中直接查看jar中的代码是因为IDE已经帮你反编译好了,才能看见Java源码。入坑如何修改这些jar包中的...

2020-03-25 02:04:01 444

原创 Win10也要愉快地使用Bash

对于习惯了Linux和Mac的同学来说,Windows自带的终端确实不太好用。其实我们完全可以用Bash取而代之。安装Windows Terminal自从巨硬拥抱开源之后,那是骚操作频频。Windows Terminal是一个开源项目,它本身只是一个终端容器,可以装载系统自带的CMD、PowerShell甚至是WSL子系统的终端。下载安装很简单,可以在应用商店直接搜索Terminal安装,也...

2020-02-24 18:16:16 415

原创 Windows安装repo的真正解决方案

背景2020真是魔幻的一年,受疫情影响,大家年后一段时间都远程办公了。奈何很多同事在家没有Linux开发环境,想在Windows上通过repo工具下载Android源码简直比登天还难。网上搜来受去没几个讲透彻的,今天给大家整活。按下面步骤来,保证OK,我们最终以 repo init 执行成功为目标。走起一、安装Git for Windows先到官网(https://git-scm.com...

2020-02-05 22:21:22 4419 3

原创 源码茶舍之如何由Uri找寻ContentProvider

引子我们都知道四大组件之一ContentProvider的用处,它给大家提供一种统一的数据访问格式。调用者无需关心数据源于何处(如DB、XML文件和网络等),只需获取到对应的ContentResolver来进行增删查改即可。自己实现一个Provider的时候,也会在配置文件中声明如下:<provider android:name=".provider.TestProvider"...

2020-01-29 19:05:36 101

原创 源码茶舍之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 216

原创 DeepinWine微信等软件如何升级

前言不管是Ubuntu还是Deepin系统的用户,我相信不少同学是用的Deepin移植的基于Wine容器的QQ和微信等Windows上面的软件。对此我很久前也有一篇引导文章:Ubuntu 18.04/16.04安装最新版QQ和微信具体安装流程不是本文重点哈,就不介绍了,可以看上述链接。本文主要讲讲安装后如何升级这些容器里的软件。就拿微信来说,官方推送更新时,你会发现在DeepinWine版本...

2020-01-19 23:01:32 3834 7

原创 RecyclerView中DiffUtil的一些注意事项

节能刷新移动设备屏幕大小有限(不得不说我是顽固的小屏爱好者,大于5.5寸难以接受,时代已经抛弃我了哈哈),列表(List)可以说是一个出现非常高频的交互设计。大多数情况下我们的列表不仅仅是一次性加载本地数据,而要应付来自网络的各种动态内容,可能是增加、删除等操作。在Android开发中,一个耳熟能详的方法就是 notifyDataSetChanged ,在适配器(Adapter)的设计模式下,...

2020-01-13 01:55:46 571 1

原创 MTK设备上DuraSpeed导致Service无法启动的问题

没想到联发科还会改framework,有点小惊讶……背景问题的起因是我们的系统应用无法调起与其他部门联动的某个Service组件了。查日志发现有这么一行:1276-2330/system_process D/ActivityManager: bringUpServiceLocked, suppress to start service!提示内容大概是说Service的启动被禁止了,当...

2020-01-05 18:14:43 402

原创 Win10家庭版如何正确关闭自动更新

背景Windows10还是很漂亮很好用的,大部分同学购买的品牌机也都会预装正版Win10,不过是家庭版的(个人用户一般也不需要专业版,比如我这种装双系统的只把Win10拿来打游戏),然而,家庭版系统要用常规手段是没法彻底关闭自动更新的。微软也非常不给面子,各种给你悄悄打开,当你关机时,你会吃惊地发现“更新并关机”这个选项。下面就介绍一下正确关闭自动更新的方法。解决找回家庭版的组策略换...

2019-12-14 20:20:25 357 1

原创 避免Android定制ROM中的EditText出现pop弹窗

问题可能看到标题的同学一头雾水,这是什么东西,其实类似于你长按文本时出现的复制粘贴pop弹窗。在一些定制ROM中,厂商为了某些方便用户的特殊功能会增加文本输入检测和自定义弹窗,举例:比如在你输入一些邮箱时,会自动弹出这种pop(并不需要你长按),且这个并非系统应用才有的,而是直接影响了所有EditText。对于一些高度定制化UI的应用来说,这个可能影响用户体验。下面给出两种解决办法(都不算...

2019-12-07 17:03:56 132

原创 源码茶舍之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 182

原创 Deepin系统add-apt-repository失败的问题

问题目前Deepin系统版本为15.11,貌似在15.10时切到了Debain的软件仓库,而不再是Ubuntu了,虽说比较稳定,但还不够新,比如git,版本就没有官方的新。于是我尝试 git官方的办法:sudo add-apt-repository ppa:git-core/ppa报错,提示未找到命令。解决这个问题在网上搜搜办法,很多回答都是让安装一个包:sudo apt-get ...

2019-10-28 00:53:46 7050

原创 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 199

原创 Deepin标题栏太高的解决办法(自定义高度)

Deepin 15.11已经发布一段时间了,前段时间折腾了一下,把我的Ubuntu换成了Deepin(有兴趣可以看看我的另一篇:Deepin15.11初体验及问题解决),总体感觉非常好。依我个人习惯,目前有两点不是很能接受:第一就是软件源貌似是debian stable的,所以很多软件版本比较老,比如git版本,远低于官方版本,这个还是有一些解决办法的,具体的我就没去折腾了,Deepin官方...

2019-10-10 22:38:42 8682 7

原创 Deepin15.11初体验及问题解决

Deepin发展也有不少年了,最近还和华为的笔记本合作预装。之前我一直都用Ubuntu做日常开发,现在心血来潮也想折腾一下Deepin哈哈,本文主要讲从Ubuntu无痛迁移到Deepin的安装过程、N卡显卡驱动等一系列小坑的解决。权当总结吧!下载和制作启动盘这个就不讲了哈,直接在官网下就行了,包括启动盘制作工具。http://www.deepin.org/download/保留数据从...

2019-10-03 13:57:53 10495 2

原创 Docker安装Ubuntu镜像并保存且修改IP及Mac地址

本文仅作为一个Docker入坑手札。主要介绍:1、Docker在Linux上的安装配置;2、在Docker容器中安装一个Ubuntu镜像并保存更改;3、以任意IP地址和Mac地址启动刚才安装的Ubuntu镜像。

2019-09-21 14:43:48 2271 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 2189

原创 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 603

原创 解决war包部署后找不到本地jar包的问题(ClassNotFoundException、NoClassDefFoundError)

大多数Web项目都会引用一些本地jar包,然后最终以war包的形式部署上线。但实际运行时jar包里面的类根本找不到,出现各种ClassNotFoundException、NoClassDefFoundError等错误。这里记录一下注意事项和正确的解决方法:1、先简单说下怎么配置war包部署(如果你原来是jar包部署的话):<project ...> <packaging&...

2019-08-15 18:25:34 1022

原创 Kotlin操作符快速获取爸爸的儿子的狗的名字

NPE(NullPointerException)是最低级且也最容易犯的错,也是最喜欢遇到的Bug因为好解。本文适合Kotlin入门萌新食用,大佬轻喷哈哈哈!问号N连帮你空处理(?)假如服务端返回一个json嵌套了各种数据,映射成POJO大概是这样:// 此处为简洁省去getter和setterpublic class TestParent { private TestChi...

2019-08-01 13:37:03 106

原创 OkHttp拦截器实现禁止一切网络请求

我们在创建OkHttp客户端时,可以添加各种拦截器,这是我见过最有可玩性的库之一:OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .addInterceptor(new XXXInterceptor()) .ad...

2019-07-06 00:01:46 1207 1

原创 OkHttp拦截器实现无网络时加载缓存,避免Unknown host异常

我们在创建OkHttp客户端时,可以添加接口数据缓存,真的很香:File cacheDir = ... // 缓存目录,可以是内部存储也可以是外部存储的目录OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .cache(new ...

2019-07-05 23:52:55 1316

原创 OkHttp拦截器获取GET/POST请求参数并添加公共参数

我们在创建OkHttp客户端时,可以添加各种拦截器,真的很香:OkHttpClient okHttpClient = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .addInterceptor(new XXXInterceptor()) .addIntercept...

2019-07-05 23:36:49 6435 4

原创 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 1797

原创 为何点击推送通知打不开Activity?Calling startActivity() from outside……

小米推送Android SDK有这么一个耳熟能详的方法:/** * 接收服务器向客户端发送的通知消息,在用户手动点击通知后触发 */public void onNotificationMessageClicked(Context context, MiPushMessage message) { ... context.startActivity(intent);}如果在其中手动...

2019-07-02 02:01:29 1256 1

原创 看看,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 3910

原创 微信小程序任务栈实现原理

背景之前面试一些校招同学,聊到微信小程序是什么launchMode,其任务栈是如何实现的?很多同学只提到singleInstance,这是不合适的。今天我们就猜测并解析一下微信主程序与小程序的关系与大致实现,最后给出源码,可以给大家作一个简单参考。初探既然要研究微信,那么我们就先打开几个小程序,再用adb命令看看任务栈信息。在终端使用 adb shell dumpsys activity...

2019-04-27 14:25:07 752 1

空空如也

请问自定义模块不显示是为何?

发表于 2019-09-21 最后回复 2019-09-23

为什么博客排名从1w+突然变成35w+了?

发表于 2019-04-11 最后回复 2019-04-11

博客主页的顶部背景图什么时候能自定义?

发表于 2017-12-30 最后回复 2019-04-11

【建议】分辨不了未读消息

发表于 2018-07-31 最后回复 2018-08-01

请问2048游戏保存上一次的游戏状态(进度)怎么实现?

发表于 2015-03-19 最后回复 2017-06-16

谷歌推新开发语言Sky还附带IDE那Android Studio怎么办?

发表于 2015-05-07 最后回复 2017-06-16

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除