删除Android Studio中重复的JDK配置
问题可能因为一些不经意的操作,导致如下这种情况:出现多余重复的JDK路径配置,其实指向的是同一个路径。
强迫症犯了之后,就会想怎么干掉这个(2)。
解决第一步:先打开你最近打开的项目,找到 .idea/misc.xml 看看里面有没有那个多余的JDK路径,如果有就直接把这个misc.xml文件删掉。然后完全退出整个Android Studio。
第二步:在Android Studio缓存配置目录里找到 options/jdk.table.xml ,针对不同的系统路径不太一样:
WindowsC:\Users\username\AppData\Roaming\Google\AndroidStudioX.Y
Linux/home/username/.config/Google/AndroidStudioX.Y和/home/username/.local/share/Google/AndroidStudioX.Y
macOS~/Library/Applica ...
当Google关心起你的健康数据
此文为初稿备份,终稿已发布于少数派:https://sspai.com/post/77024
今年五月,在 Android 开发者官方博客中,Google 隆重介绍了一个新平台,名为 Health Connect,并推出了相应的 Android API。其官方网站用非常显眼的大标题和副标题简洁地描述了其核心功能与优势:简化健康类应用之间的连接。
Health Connect: simplify connectivity between apps
Health and fitness apps record valuable data. With permission from your users, you can unlock the full potential of this data by combining it to generate powerful insights.
粗略地看这应该是 Google 搞的一个平台化的东西。那么它具体是什么呢?又会给用户和开发者带来什么利益?
什么是Health Connect如今健康和健身类的应用越来越多,各大厂商迅速占领这个细分 ...
让终端命令更有时间观念
背景我们无论是在Mac还是Linux平台上工作,都避免不了要使用终端来执行命令。然而系统默认的终端功能非常简单,没有命令建议、自动补全等功能,对强依赖终端的工作者来说很不友好。
还好有oh-my-zsh,它对zsh进行了增强,不仅有丰富的插件,还可以自定义主题配置。了解或使用过它的同学一定会觉得非常香。这里引用一篇少数派作者之前的文章,我就不赘述它的好处了:Oh My Zsh 配置指南
使用安装和使用都非常简单,在安装了zsh的前提下,一行命令即可搞定:
123sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"# 或者sh -c "$(wget https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"
特别提醒: 如果访问不了GitHub的话,可以使用国内镜像备份仓库:
12git clone https://gitee.com/mirrors/o ...
简单几步实现内网穿透
场景为了避免阐述过多理论,我们直接从需求场景入手,来了解一下为什么需要内网穿透?
小明是少数派的一位咕咕作者,在家里电脑稿某文稿了一半,到公司后打算摸鱼继续稿,怎么办呢(此处假定他没有使用任何云同步软件,也不会使用git,就算会用他也忘了提交)?
此时,小明想通过ssh等远程访问设备文件的方式来下载家里那半稿子,但他的家庭网络是没有分配公网IP的,无法通过互联网直连。内网穿透就这样派上用场了。
所以通俗地讲,内网穿透就是要将流量从公网穿透到内网,让内网设备也能通过公网访问,帮助小明在公司访问家里电脑的文件。
设施内网穿透的核心思想就是“映射”和“转发”,把内网设备的端口映射到公网设备的端口上,来进行流量转发。
简单地画一下示意图如上,基础设施由两个核心设备组成:
服务端:拥有公网IP的设备一台,即上图“公网服务器”,开放2个端口7000和6000,用于公网通信。
客户端:要访问的内网设备一台,即上图”内网家用电脑”,开放实际应用服务所需的端口(比如ssh服务,默认22端口),并将配置的公网映射端口6000告知服务端。所以服务端开放的那个端口6000实际上是客户端告诉它的。
(以上 ...
谁家推送服务限制最严格
先说句题外话,又过了这么多年了,没想到国内Android的统一推送还是没有实现。
由于工作需要,最近正好在调研各家系统推送服务,我发现从他们的技术文档可以分析出很多有意思的东西,比如说能看出来哪家厂商的推送限制最严格,最考虑用户的综合体验。在讲解之前,我们先简单提几个推送服务的基本概念:
设备:用户所持有的某台设备,在技术文档中所提到的日活跃用户数一般也就指日联网设备数
应用:某台设备上安装的某个应用,后续我们所描述的推送数量限制都是以此维度比较的
推送:应用进程活跃或关闭时,通过系统级的推送通道下发消息,一般以通知消息的形式呈现给用户,点击后激活应用进程
透传:仅在应用活跃时可接收数据,仍然依赖系统的推送服务器下发,但数据格式一般可以自定义,处理逻辑也是由应用自己实现,所以应用如果被杀死,自然就处理不到了
一个不那么规范的示意图:
注:下文以x表示日联网设备数量;我们主要关注推送,不过多说明透传的限制。
各家次数限制华为对于某设备某应用,推送和透传次数总共不超过3000次/每日;相当于该应用每日推送总量上限为:f(x) = 3000 * x
简要解读:华为严格限 ...
解决iptables导致无法联网的问题
问题先说下我的单机环境是Ubuntu 16.04,只放了点小应用,一直没升级系统(懒),防火墙规则也是简单地使用iptables来控制。
今天我因需要重启服务器之后,发现突然连不上了,ssh无法连接,ping也不通,我开始慌了。于是我只能进入云服务器商的后台,用网页版登录,不管你是阿里云还是腾讯云还是国外的服务商,现在大多都有这种功能。
进去之后,先任意ping一个公网IP,提示 “Network is unreachable” ,看来这互联网是彻底断了。用ifconfig也能发现本机的公网IP看不见了。
怎么重启一下就这样了呢?
排查直接检查networking服务状态:
1systemctl status networking.service
能发现服务运行状态不是Active的,并且提示了是由于iptables规则应用失败,其中可以看见 **“cannot resolve host” **之类的字样,具体现场我没有截图保存,大概是这些内容。
原因基本上就清楚了,因为我前段时间手动禁用了某些IP来做测试:
1iptables -I INPUT -s xxx.xxx.xxx.xxx ...
无需电脑如何执行adb shell命令
背景ADB(Android Debug Bridge),是调试Android设备的一个命令行工具。对开发者来说,ADB自然是日常工作的得力助手;对我们业余玩家来说,它也可以用来控制一些默认情况下接触不到的功能设置。
在早期的Android平台上,我们只能通过USB数据线连接电脑和手机,然后再在电脑上使用ADB工具,前提是已经在开发者选项中开启了USB调试开关。
从Android 10开始,Google看着大家那可怜的USB接口数量和满桌的数据线,无奈之下推出了一个无线调试功能。只需要电脑和手机连接到同一个WiFi(即在同一局域网下),就可以进行调试。
虽然简化如此,但用户还是需要一台电脑才可以执行ADB的相关命令。比如说我想随时随地“冻结”某个应用:
1adb shell pm disable-user com.tencent.mm
还得身边有一台安装了Android开发工具的电脑,挺麻烦的。
本地ADB既然现在新设备已经支持无线调试,我们是不是可以把手机本身当作电脑,让它自己连接自己呢?相当于手机本身既是ADB Server也是Client,同时也满足在同一局域网的条件。
是的, ...
Rust为Android应用编译so库
前言Rust是个好东西,Google也开始把它用于AOSP了。我们开发应用同样也可以使用Rust来编写原本为C++的Native代码。网上搜罗一圈,入门的文档不多不少,这里稍微归纳整理一下吧,毕竟Hello World是人类的一大步。
安装RustRust的文档真的非常棒,目前的翻译版本也几乎满足所有学习需求。安装很简单,参考官网(Rust-lang.org)即可,一行命令:
1curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
配置NDK1、先确保你在Android Studio的SDK Manager中下载安装好了NDK相关的工具包,基操就不赘述了。
2、默认目录一般都在 /Users/你的用户名/Library/Android/sdk/ndk-bundle 这个位置,用户目录可以用 ${HOME} 代替。当然,如果你的SDK在其他位置,按你的来即可。
在任意处创建一个名为NDK的目录(名字随意,也可不叫NDK),然后运行NDK工具包中的py脚本以编译NDK开发环境: ...
Android手机如何修改DPI触发平板模式
前言目前,微信可以支持平板和手机同时登录,不过并不是所有人都有Android平板设备。实际上,我们可以修改系统文件来达到目的。
我看了下网上(主要是酷安社区)很多方法其实都已经过时了,包括一些修改工具App。所以你以为改了实际上对微信没用,会发现其他软件都受dpi影响了,但是打开微信还是正常的手机分辨率,也就触发不了平板登录。
分析下面我简单说一下原因,主要是很多ROM随着版本升级,可能那些系统配置的参数字段名称已经变了,如果大家还是一味地改以前的参数自然就没有效果,开发那些工具App的朋友们也不能保证及时更新这些修改。
以我的测试机器Redmi Note 9 Pro为例,使用工具修改dpi为280之后(原dpi为440),会发现 /system/build.prop 文件内容末尾追加了 ro.sf.lcd_density=280,这很明显不是修改而是新增,说明搭载MIUI 13最新开发版的Note 9 Pro对应的配置参数不是这个。
解决解决方法非常简单,先保证手机已经ROOT,然后拉出配置文件:
1234adb rootadb remountadb disable-verityad ...
个人网站Log4j2漏洞风险排查
前言Log4j2漏洞事件已经过去了几个月,影响面可以说是非常的广。本质上还是权限和代码注入问题,这里就不作赘述,和SQL注入在原理和形式上都异曲同工。
我个人没太明白还是,如此流行的开源库,竟然开发者和使用者这么久都没发现这个巨大漏洞(可能早有人发现但并未公布),而且作为一个日志记录工具,权限未免太高。
修复从互联网上可以查到最新的修复建议:
升级到最新版本:
目前官方已推出最新Apache log4j 2.15.0版本,可从地址中下载升级:https://logging.apache.org/log4j/2.x/download.html
缓解措施:
(1)添加jvm启动参数 -Dlog4j2.formatMsgNoLookups=true
(2)在应用程序的classpath下添加log4j2.component.properties配置文件文件,文件内容:log4j2.formatMsgNoLookups=True
(3)移除log4j-core包中JndiLookup 类文件,并重启服务
具体命令:zip -q -d log4j-core-*. ...
解决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,那怎么行呢?
分析首先说,这个错误不是组件化插件的问题,不是Kotlin的问题,也不是工程本身的代码问题,而是JDK没配置好导致的。
但是有人会问了,为什么旧版Studio用得好好的,升级到新版就有JDK的问题了?因为新版Studio默认内置了JDK 11,Gradle会使用11来运行,放弃了JDK 8(细心的同学已经发现,启动界面的Runtime version已经变成了11,不再是8了)。
如果不做任何设置,默认用JDK 11来编译工程,就会失败,当然错误提示不会是上面那个,是另一个,这里不赘述,我们还是以JDK 8来编译。
解决1、我们先打开Studio ...
Apache和PHP环境打开php页面File Not Found问题
问题之前搞了个腾讯云的轻量应用服务器(预装环境LAMP)来玩,结果最近发现网站目录下面的php文件访问不了,在浏览器打开就出现“File Not Found”的提示。
搜罗了很多答案,没有一个明确能解决问题的,不过还是得到了一些启示。下面属于我的个例,不一定能解决所有此类问题。
解决腾讯云的这种服务器预装的软件都在此目录下面,包括相关配置:
123[root@VM-0-15-centos ~]# cd /usr/local/lighthouse/softwares[root@VM-0-15-centos softwares]# lsapache mariadb oniguruma php
1、我们先配置一下apache,让你的网站首页可以以index.php的形式存在:
12# 直接编辑配置文件vim apache/conf/httpd.conf
然后找到这段内容:
123<IfModule dir_module> DirectoryIndex index.html index.php</IfModule>
原本只有index.html,在后面 ...
IDE Eval Reset忘了重置进不去怎么办
问题我相信很多白嫖怪都知道目前JB全家桶“极为先进”的使用方法——其实就是无限重置30天(IDE Eval Reset)。具体使用方法就不赘述了。
这里会出现一个问题,尤其是针对电脑上安装了多款JB家的IDE用户来说(比如我就是,IDEA、PyCharm和CLion都在使bai用piao),如果超过30天未打开其中某个IDE进行试用重置,那么你就会发现打不开了,要求你补充License,而且菜单栏也没有地方让你再去打开Eval Reset插件了。怎么办!?
或许你唯一能想到的办法就是完全卸载,清空一切相关配置文件和卸载残留,重新安装,重新试用。但是这样损失惨重啊,尤其是很多设置和项目又要重新导入。
解决这个办法也是我偶然发现的,你在其他地方肯定搜不到。不过当你第一次遇到这个问题时,有个前提:需要至少有一款IDE是可以打开使用的,也就是刚刚使用过Eval Reset并且还在30天内的。
举例,比如我现在PyCharm打不开了,但是IDEA平时经常用到,所以能打开,接下来:
1、这里以macOS版本为例(其他系统也是类似的,就是路径不太一样,看后文),复制IDEA内部eval文件夹下面的k ...
Android Shortcut启动导致其他Activity销毁问题
问题我们都知道,从API 25开始,Android加入了类似3D Touch一样的功能,即长按桌面图标可以弹出快捷方式菜单(最多4个)。早期国产系统的桌面Launcher并没有积极适这一功能,所以各大应用也懒得做,后来才逐渐完善。目前包括微信、支付宝等都可以长按弹出快捷方式,支付宝更是支持动态配置。
开发文档直接看官方的就行:https://developer.android.com/guide/topics/ui/shortcuts ,静态快捷方式适配很简单,加xml文件就完事,此处不赘述。
但在实际体验开发过程中发现,通过快捷方式打开应用的对应页面后,其他Activity会被销毁。这并不是我们想要的效果。
简单分析这个现象很像是在启动Activity时设置了 CLEAR_TASK 的标识,导致任务栈被清空。但是,从下列的使用示例来看,静态快捷方式又无法设置Intent的flag,相关逻辑由系统SDK内部实现。
1234567891011121314151617181920<shortcuts xmlns:android="http://schemas.androi ...
聊一聊MIUI最近更新的原子内存
前言比起最近雷布斯的个人演讲,其实我更好奇MIUI 12.5增强版(超级Bug-list修复版)推出的那四个性能优化项目:
焦点计算 - 处理器智能调度机制
原子内存 - 精细化内存管理机制
液态存储 - 文件存储管理机制
智能均衡 - 对旗舰硬件性能的智能调配
作为技术爱好者,这个“原子内存”还真是提起了我的兴趣,因为其他三项还算比较好理解。毕竟内存管理这件事,是操作系统领域几乎永恒的课题。
官方解释我们先来了解下MIUI官方网站是如何介绍原子内存的。官网的海报动效还是阐释得比较清晰明了(辛苦设计师小姐姐,不知道又加了多少班)。
最开始是几个独立的应用各自占有一定的内存,看看这绿,这不就是微信绿。看看这蓝,支付宝?看看这橙,这啥,淘宝吧估计是,肯定不是小米自己。设计姐姐在疯狂暗示。
然后,第二步是拆分应用内存,结束不重要的任务,刚才还是整块的内存占用现在在逻辑上被划分为了大小不等(即不同功能占用内存大小不同)的几块。这一步其实就是核心了,如何来划分呢?按什么维度划分呢?有没有可能划分失误反而影响用户体验呢?我们后面来聊。
第三步,根据场景,进一步精细压缩。这一步也很关 ...