Pig Cat

Full-Stack, Android, AI

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

鼓捣鼓捣。

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

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

后知后觉。

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

Magisk与EdXposed框架安装实践(Android P及以上)

鼓捣鼓捣。

记得初中的时候还在用Android 2.3,高中开始刷机,每个月都去追论坛大佬的自定义精简ROM,不亦乐乎,这一晃都过了快十年了。从以前旧版Android(支持到8.x)的Xposed到现在的EdXposed、Magisk等玩机框架,大佬些的脚步从未停歇。模块开发生态也好了很多(得益于Github及各种文档)。不过由于现在ROM厂商越来越深度的定制和限制(当然也是考虑到普通用户的安全),RO...

等差数列异或和的小规律

后知后觉。

背景 异或(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...

Kotlin变长参数的一些小坑

见微知著。

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

浅谈JVM语言之函数式编程

见微知著。

Java中的函数式编程 闲聊 函数式编程在上世纪五十年代就有了,只不过在工业界一直不温不火,最近十年才被广泛认知。其理论基础也并非为编程而设计,而是一种数学抽象(Lamda演算),其实初中就学过了,λ表达式。 在JS(建议把JS作为函数式编程思想学习的入门语言,Java的实现略显臃肿,可能不太便于理解)当中,函数式编程算是应用比较多的了。各现代高级编程语言,都或多或少地支持了函数式编程...

macOS下载AOSP的小坑

坑也太多了吧。

爬坑 以下载Android X源码为例,过程和下载AOSP是一样的,只是分支不同而已。源码在线地址:frameworks/support 安装Homebrew 在Mac上搞开发必须的包管理工具,类似Ubuntu上的apt。安装非常简单,一行命令的事情,来自官网(Homebrew): /bin/bash -c "$(curl -fsSL https://raw.githubuserco...

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

探索发现。

前言 对于Android平台,如果在国内应用商店安装诸如微信、支付宝等国产大型App,相比去Google Play Store安装,会多要不少权限,即便权限无差异,在隐私政策等规则方面,Play Store也会更严格一些,能上架的应用肯定不敢乱搞。之前也有不少用户反映在Play Store安装的微信要流畅不少,某些功能细节也会有差异。 不过由于严格的审核机制,Play Store上的国产...

用Gradle脚本管理Manifest文件

探索发现。

编译时区分不同的manifest 很多Android项目都会区分debug和release的manifest文件,以便调试,一些组件化的项目甚至有多个manifest文件来调试不同的组件。举个简单的例子,在app的build.gradle文件中: android { defaultConfig { applicationId "com.xxx.xxx" }...

Win10用WSL下载AOSP

探索发现。

WSL还是挺方便的,配合国内镜像源,可以轻松下载Android源码。 启用WSL 关于Win10启用WSL的方法微软官方的文档非常清晰了:适用于 Linux 的 Windows 子系统安装指南 (Windows 10)。由于我这里只用到WSL 1而非WSL 2,所以Win10版本号更新到1909即可,等2004正式推送再折腾WSL 2吧。 安装Ubuntu 20.04 直接在微软应用...

自定义EditText的无障碍描述(不读hint)

探索发现。

问题 我们一般给一个控件设置描述时,会这样: xxxView.setContentDescription("xxx"); 但是,当你给EditText设置这个时,会发现毫无卵用。为什么呢? 搜了下EditText和其直接父类TextView,没有重写setContentDescription方法,那应该不是setXXX时发生改变,而是getXXX的问题。 果然,在TextView...

快速修改字节码并重打jar包

探索发现。

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

Win10也要愉快地使用Bash

世界那么大。

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

Windows安装repo的真正解决方案

专治各种小毛病。

2020-02-22更新!我发现谷歌在最近几天发布了git-repo 2.4版本,并更新了 Microsoft Windows Details 文档,直接解决了此文问题,比本文以前的三方解决办法简单很多很多。 最新官方解决方案 一、基础设施 安装最新的Git for Windows(参考下面的旧文即可),目前版本是2.25.1 安装Python 3 ,目前版本是3.8.1...

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

品味AOSP。

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

源码茶舍之FLAG_EXCLUDE_STOPPED_PACKAGES与广播唤醒

品味AOSP。

发现 我们先随便实现一个BroadcastReceiver,静态注册: class TestReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { Log.w("TEST-1", "onReceive ${intent?.action}...

走进各大语言的协程世界

开阔眼界。

想聊聊C++、C#、JS、Kotlin等语言中的协程实现与应用。 挖坑待填,未完待续……

Android神经网络(Neural Networks API)初探

见微知著。

谷歌早在Android 8.0就推出了神经网络API,不过现在网上资料仍旧不多,随着TensorFlow Lite的成熟,底层API更是无人问津。 前言 Android Neural Networks API (NNAPI) 是一个 Android C API,专为在 Android 设备上运行计算密集型运算从而实现机器学习而设计。NNAPI 旨在为更高层级的机器学习框架(如 T...

RecyclerView中DiffUtil的一些注意事项

见微知著。

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

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

知其所以然。

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