Glue work
你是一位工作多年的程序员, 你在公司的职位是”软件工程师”,用国内常说的职级体系来看,你是一个 P6,一线干活写代码的大头兵。 但在你日常工作内容中,并没有太多时间去写代码,你似乎大部分时间都在开会,不停的开会。你希望能够有时间停下来写代码,但似乎有更多的工作需要你来做,比如: 给刚毕业的校招生讲解业务知识,帮助他们更好的解决工作中的问题 与其它合作团队沟通、对齐,帮助团队成员梳理工作内容,解决问题 认真阅读团队成员的技术方案文档,给他们提各种名样意见和建议,防止项目上线后 ...
你不会到现在还不知道 Android 中的那些 JDK 配置吧?
在做 Android 应用开发时,不可避免的要使用到 JDK 。在众多版本的 JDK 中, 项目代码的编译会使用哪个版本,开发者要如何指定使用的 JDK 版本?选择和指定 JDK 是一个非常重要的步骤,它会影响整个开发过程。 不论你在源码是用 Java 进行编写的,还是使用 Kotlin,或者是两者都有使用。在整个项目开发迭代周期中,都会有很多地方会涉及到 JDK 版本: Android Studio 的 JDK「工欲善其事,必先利其器」, Android Studi ...
函数式编程:尾调优化
在函数式编程中, 函数是一等公民,实现中,会有很多代码都使用递归进行实现。在编写优雅代码的过程中,也会引入一定的风险:栈溢出。为了解决这个问题, 作为函数式编程风格的语言都会提供「尾调优化(Tail Call Optimization, TCO)」的特性。 什么是尾调用?尾调用(Tail Call)指的是一个函数的最后一条语句是一个返回调用函数的语句,这个函数调用可以是对另一个函数的调用,也可以是对自身的调用。举个例子: fun methodA(data:String): S ...
Android 中compileSdk、minSdk、targetSdk 是干什么用的?
作为多年 Android 开发的老司机, compileSdk 、minSdk、targetSdk 都是经常见到,但其具体含义是什么? 它们都是在什么场景下去使用的。 回想起来还真不太能说得清楚。 背景要想说清楚它们是干什么的,那就不得不说一下主角 Android 操作系统。Android 操作系统在 2008 年发布了第一个版本,到今年已经发布了几十个版本: 在如此多的版本迭代更新的过程中,Android 操作系统中不断引入新的接口,也不断的对 App 添加一些新的限制 ...
(转) The Unofficial R8 Document
IntroductionThis is unofficial documentation for R8, Google’s code shrinker for Android™.Google intends R8 to be a drop-in replacement for ProGuard, and has provided documentation in the Android Studio User Guide to help you get s ...
ProGuard 进阶系列(四)访问者模式
在进行后面的内容分析之前,不得不讲到访问者模式,这是 GOF 23 个设计模式中最难的几个模式之一。如果能够很好的理解访问者模式, 后续源码解读会相对容易一些。本文将结合 ProGuard 的部分源码,理解分析访问者模式的用途及使用场景。 一、什么是访问者模式先来看定义,访问者模式是一种将对象操作算法与对象结构分离的设计模式。这句话很抽象,不是很好理解。用通俗的话来讲就是:我们在写代码的时候,一般情况下,会将对象的操作算法定义此对象内部,直接通过对象的某个方法去获取信息或进行 ...
ProGuard 进阶系列(三) Java 类文件解析
书接上文,当我们从用户的配置文件中读取到所有的配置信息后,下一步便是将配置中的指定的类文件进行读取,构建需要混淆的 Java 类文件的语法树。在阅读类文件之前,先来看一下输入输出参数中的内容,我使用的是一个 Android 项目的输出产物,使用 -injars、-outjars、-libraryjars 指定了相关的信息,运行起来,这些信息会放到 Configuration 中,具体信息看下图: Java 代码源文件在编译后会转换成 Class 文件,格式定义是固定的,可以 ...
ProGuard 进阶系列(二)配置解析
书接上文,从开源库中把代码下载到本地后,就可以在 IDE 中进行运行了。从 main 方法入手,可以看到 ProGuard 执行的第一步就是去解析参数。本文的内容主要分析源码中我们配置的规则解析的实现。 在上一篇文章末尾,在 IDE 中,添加了 @/Users/xxx/debug_proguard.pro 作为函数运行的入参,将配置文件的路径传递给 ProGuard 使用。先来看一下 Main 函数中的代码: 从这几行代码可以看出,ProGuard 的大体运行逻辑。在代码 ...
ProGuard 进阶系列(一)源码运行
在前面的文章深入 Android 混淆实践:ProGuard 通关秘籍和深入 Android 混淆实践:多模块打包爬坑之旅中,已经讲到了如何在 Android 中使用 ProGuard,以及如何自定义实现混淆规则的生成。为了更深入地理解 ProGuard 的细节,本系列文章从我感兴趣的点出发,记录在阅读 ProGuard 源码过程中的思考与启发,希望对你也有所帮助。本文为此系列文章的开篇,将最基础的讲起,使用 ProGuard 源码去实现代码混淆。 1. ProGuard 的 ...
安卓图片编码之必备技能
在进行 Android 开发时,不可避免地会接触到许多图片格式,例如 JPEG、PNG 等。就以 JPEG 格式为例,它是一种有损压缩模式,使用 YCbCr 的颜色空间来保存色彩信息。当需要在屏幕上显示图片时,会将 JPEG 数据解码成 RGB 进行显示。本篇文章可能对初学者来说略显复杂。因此,建议读者具备一定的图像处理和 Android 开发基础知识。下面,一起来看看在 Android 中,如何使用图片编码以及对它们进行操作和处理。 NV21 中图片数据编码首先,让我们来谈 ...