技术小黑屋

Mac 下在终端直接查看图片

在开发的过程中,我们通常会遇到这样的情况,就是我们需要根据图片的url地址查看其对应的内容,通常的做法就是把这个图片链接贴到浏览器。不过一直好奇,能不能再终端中直接展示,于是做了一些搜索,发现了对应的实现方式。

注意:此方式只适用于Mac,其他的Linux 发行版 需要自行按照如下的思路查找对应的工具。

在 Android 中如何确定 App(Activity) 的启动者

最近在帮忙定位一个问题,涉及到某个应用自动启动了,为了确定是谁调用的,使用如下的日志进行查看(注:为了简单考虑,下面的启动者为launcher)

1
2
3
4
(pre_release|✔) % adb logcat | grep -E "ActivityManager: START" --color=always
I ActivityManager: START u0 {act=android.intent.action.MAIN
cat=[android.intent.category.HOME] flg=0x10000000 hwFlg=0x10
cmp=com.huawei.android.launcher/.unihome.UniHomeLauncher (has extras)} from uid 10070

这可能是最好的 Android/Kotlin日志输出方法

在编程调试和定位问题的时候,日志是一个最常用的工具。比如输出一些信息,确定执行轨迹。今天我们这里简单聊一聊打印日志的一些分析。

通常,我们进行日志输出的时候都会限定在debug包下执行,对于非debug包,我们就不输出日志。那么如果是非debug,不同的日志输出方式可能存在一定的性能问题,本文将通过几个版本来对比着方面的差异。

简简单单对比encodeURI与encodeURIComponent

encodeURI和encodeURIComponent 是两个很相近的方法,用来encode URI。但是他们之间也存在着细微的差异,如果不能很好的理解这个差异,可能会导致一些不必要的麻烦。本文将尝试用最简单的形式展示这个差异。

GapWorker导致RecyclerView视频播放声音残留问题

场景描述

  • App 有两个tab,每一个都是Fragment,以FragmentA和FragmentB 代称.
  • 切到FragmentA 视频播放(在RecyclerViewA 内部),然后切到FragmentB 视频暂停.
  • 就在此刻,滑动FragmentB 的recyclerView B ,来自FragmentA的视频播放出声音,而且声音是下一条视频的声音。

在终端使用脚本查看网站 SSL 证书信息

之前遇到过一次赛门铁克很久的证书被Chrome弃用的问题,涉及到了查看证书。当然第一个大家会想到的是在浏览器中查看,但是总是感觉不够极客。后来摸索找到了终端查看网站证书的方法

使用脚本批量替换文本内容

很多时候,我们需要进行多个文件的查找并替换,虽然IDE有这样的可视化功能,但是偏爱终端的人还是想要尝试用脚本实现一把。如下是一个简单的脚本来实现多文件的查找替换处理。

一个小技巧提升 OkHttp 请求稳定性

OkHttp是可以说是Android开发中,每个项目都必需依赖的网络库,我们可以很便捷高效的处理网络请求,极大的提升了编码效率。但是有时候,我们使用OkHttp也会遇到这样的问题

崩溃的stacktrace

1
2
3
4
5
6
7
8
9
10
11
 E AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
 E AndroidRuntime: Process: com.example.okhttpexceptionsample, PID: 13564
 E AndroidRuntime: java.lang.NullPointerException: blablabla
 E AndroidRuntime:    at com.example.okhttpexceptionsample.MainActivity$createNPEInterceptor$1.intercept(MainActivity.kt:61)
 E AndroidRuntime:    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
 E AndroidRuntime:    at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
 E AndroidRuntime:    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184)
 E AndroidRuntime:    at okhttp3.RealCall$AsyncCall.run(RealCall.kt:136)
 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
 E AndroidRuntime:    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
 E AndroidRuntime:    at java.lang.Thread.run(Thread.java:784)

根据包名查找 Jar 包文件

很多时候,我们需要根据包名来查找一些依赖所在的jar包,比如我们想要查找com.alipay这个包及其文件所在的jar包。

最笨拙的办法可能是这样

  • 一个一个jar包查找,再利用一些工具来验证。

其实,大可不必,我们需要简单实用如下的脚本就能解决这个问题。

解决 Grep 的多次管道过滤问题

在日常的开发过程中,我们利用grep可以方便快捷的查找感兴趣的日志内容,极大地提升了开发和排错效率。但是有时候,我们也会遇到一些问题,比如。

JvmName 注解在 Kotlin 中的应用

JvmName注解是Kotlin提供的一个可以变更编译器输出的注解,这里简单的介绍一下其使用规则。

应用在文件上

未应用@JvmName

1
2
3
4
5
6
7
8
package com.example.jvmannotationsample

import android.net.Uri


fun String.toUri(): Uri {
    return Uri.parse(this)
}

Contract,开发者和 Kotlin 编译器之间的契约

相比 Java,使用 Kotlin 编程的时候,我们和kotlin编译器的交互行为会更多一些,比如我们可以通过inline来控制字节码的输出结果,使用注解也可以修改编译输出的class文件。

这里介绍一个和kotlin编译器更加好玩的特性,contract。可以理解成中文里面的契约。

简单几招提速 Kotlin Kapt编译

应用Kotlin之后,涉及到注解的注解处理器依赖也会由annotationProcessor替换成kapt,和最初应用Kotlin一样,总会让人一种感觉,一番应用Kotlin和Kapt之后,编译耗时更长了,不过好在Kotlin和Google 在这一方面做了很多的优化和改进,本文将简单介绍一些配置,来实现项目编译关于kapt这方面的加速。

Kotlin编译与Intrinsics检查

在很早的时候,小黑屋就介绍过如何研究Kotlin,其中涉及到了查看字节码和反编译成Java代码的方式,相信很多人研究过的人,都会或多或少遇到过Intrinsics.checkParameterIsNotNull这样或者类似的代码。

Kotlin编译调校之WarningsAsErrors

这之前的文章中,我们介绍过如果通过Kotlin编译器参数实现将所有的warnings按照errors对待,主要的实现方法是这样

1
2
3
4
//Code to be added
kotlinOptions {
    allWarningsAsErrors = true
}

使用Kotlin Reified 让泛型更简单安全

我们在编程中,出于复用和高效的目的,我们使用到了泛型。但是泛型在JVM底层采取了类型擦除的实现机制,Kotlin也是这样。然后这也带来了一些问题和对应的解决方案。这里我们介绍一个reified用法,来实现更好的处理泛型。

为 Kotlin 项目设置编译选项

经常用终端的人都知道,终端命令有很多选项可以指定,这里我们以相关的kotlinc为例,我们可以在终端这样指定选项

1
2
3
4
5
kotlinc -Werror ./app/src/main/java/com/example/compileroptionssample/Simple.kt
error: warnings found and -Werror specified
app/src/main/java/com/example/compileroptionssample/Simple.kt:4:19: warning: unnecessary safe call on a non-null receiver of type String
    println(string?.toString())
                  ^

一个查找字节码更好研究Kotlin的脚本

众所周知,Kotlin通过语法糖的形式实现了很多便捷和高效的方法,因此研究Kotlin代码通常是需要研究字节码或者反编译后的java文件。

比如这样的代码

1
2
3
fun String.toConsole() {
    println(this)
}

修复应用无法通过App Store升级的问题

之前遇到过这样的问题

  • 从微信官网下载微信Mac版安装
  • 后来App Store提示有新的微信更新
  • 但是每次打开都是这样的画面,提示上一个账户(主动更换过账户)的信息
  • 而且上一个账户基本弃用,但是也无法使用当前账户更新

未关闭的文件流会引起内存泄露么?

最近接触了一些面试者,在面试过程中有涉及到内存泄露的问题,其中有不少人回答说,如果文件打开后,没有关闭会导致内存泄露。当被继续追问,为什么会导致内存泄露时,大部分人都没有回答出来。

本文将具体讲一讲 文件(流)未关闭与内存泄露的关系。

解读文件描述符

最近由于机缘巧合,结合最近工作中遇到的一些问题,深入了解了文件描述符(File Descriptor,简称FD,以下使用 FD 称谓)。预计会有两到三篇关于 FD 的文章陆续出来。首篇也就是这篇,作为基础篇,介绍一些关于通用 FD 的内容知识。

浅谈编码中的缩写

目前而言,几乎所有的编程语言都是使用英文来表示,在英文中,使用缩写很普遍,比如URL(Uniform Resource Locator)能够很简单高效地向他人阐述要表达的概念。

然后,在现实的开发过程中,缩写有时候会被滥用,甚至是脱离了其高效传递信息的意思。

送书啦,Kotlin,Android、Flutter都有!

最近和华章搞了一个小合作,把最新出的一些关于Android的书拿出来免费送给大家,如下有四本书,涉及了Kotlin,Android ART,埋点和Flutter。

参与方式:很简单,微信扫描或者长按识别书籍下面的抽奖小程序,然后坐等开奖就可以了。