0%

前端代码在部署发布过程中,需要涉及到服务器的配置处理,一般都是运维或发布同事帮忙处理,目前公司主要使用的是 Nginx 服务器。了解一些 Nginx 的知识,有利于我们快速定位处理一些发布中遇到的问题。

基础概念说明

Nginx

Nginx 是一个免费的、开源的、高性能的 HTTP 服务器,同时也是反向代理服务器,以及 IMAP/POP3 代理服务器。Nginx 以其高性能、稳定性、丰富功能集、简单的配置和低资源消耗而著称。可以通过简单配置来实现反向代理、负载均衡、Nginx 缓存以及动静分离等功能。

阅读全文 »

什么是 JavaScript,它有什么特点?对于客户端原生开发者来说,在学习 JavaScript 过程中,有哪些不得不注意的点?

背景

JavaScript 是一种轻量级的脚本语言,同时也是一门动态类型语言。对于 Android 或 iOS
开发者来说,JavaScript 的动态类型特性会让我们在学习过程中遇到各种“坑”,下面将学习过程中需要注意的点罗列出来作为后续备忘使用。(JavaScript 基于 ECMAScript 5.1 版本,更多历史背景可参考 JavaScript 语言的历史)

阅读全文 »

背景

随着项目的发展扩张,项目区分多个 module 的做法越来越常见,同时项目中的依赖也越来越多,不同 module 引入的版本也不一致。有必要对项目中的依赖做梳理,达到统一管理、单独配置,版本号统一的目的。

gradle 依赖管理的一些方案

gradle 随着版本的发展,也不断涌现出一些不同的方案。包括:原始手动管理extra 扩展管理buildSrc 方案composing build 方案以及 gradle 7.0 新出的 version catalog 等。

阅读全文 »

最近在做 web 离线包,需要使用到增量更新,这里对基于 Android Studio 编译 Bsdiff so 库做一个总结记录

web 离线包需要从服务端下载资源压缩包到本地并解压,当使用到对应资源时可以优先从本地读取,减少了网络耗时,优化了用户体验。当压缩包体积过大,或者变动量小时,如果还是整包下载,则会造成带宽流量的浪费。因此需要使用到增量更新的方式。

增量更新原理

增量更新就是在服务端生成新包和旧包之间的差分包,然后客户端下载这个差分包,和本地的旧包进行合并成完整包再使用。

增量更新的算法有很多,最常用的是 bsdiff 算法

阅读全文 »

总结梳理下 Android 架构设计的几种模式

为什么我们的项目需要使用架构模式?个人理解使用架构模式是为了使我们的代码模块化,达到模块内部高内聚和模块间低耦合的目的,同时开发人员只需要关注相应的业务逻辑点,提高开发效率。当然,使用架构模式不一定是减少了代码量,相反还可能增加代码量;但是它帮你简化了逻辑,提高了扩展性和兼容性。针对不同的项目规模,合理采用或不采用架构模式都是值得考虑的。

MVC

MVC(Model-View-Controller)

  • Model: 模型层。主要是实体类,数据库,网络等存在的层面,Model 将新的数据发送到 View 层,用户得到数据响应。
  • View: 视图层。一般以 xml 为代表的视图界面,它显示来自 Model 层的数据,同时将用户的点击操作等事件传送到 Controller 层。
  • Controller 控制层。一般以 Activity/Fragment 为代表,它连接 Model 层和 View 层;它收到 View 层发送过来的事件请求,然后从 Model 层获取数据,并展示给 View 层。
阅读全文 »

前言:公司 App 主要面向东南亚市场,因此必须针对东南亚市场做多语言国际化的实现。

需求

  • 支持 App 内切换语言系统,不跟随系统语言变化
  • 重启后,使用用户上次选择记录的语言

实现

生成资源文件

首先需要生成对应语言的资源文件,这一点 Studio 还是挺方便的。

阅读全文 »

前言:App 的内存使用情况是我们评价 App 性能高低的一个重要指标,为了提高 App 的质量,提供用户更良好的体验,需要我们对 App 的内存使用有一定的控制。因此,内存优化也是我们开发过程中不可避免的一个工作。本文将从内存优化的背景知识、内存优化工具、常见内存泄漏类型及解决方案等方面做一个简单介绍。

注:目前 Android Studio 已到最新版 3.2.1,部分内存分析工具已被官方废弃或移除,本文将以 Studio 最新版进行内存优化的相关介绍说明。

Java 内存基础知识介绍

Java 内存分配策略

Java 程序运行时会把它所管理的内存划分为若干个不同的数据区域,这些数据区域各有用途。主要分为下面几个部分:

  • 静态存储区(方法区):主要存放已被虚拟机加载的类信息、常量、静态变量等。这块内存在程序编译时就已经分配好,并且在程序整个运行期间都存在。
  • 栈区:方法体内的局部变量(一些基本类型的变量和对象的引用变量)都在栈上创建,并在方法执行结束时这些局部变量所持有的内存将会被自动释放
  • 堆区:又称动态内存分配区,主要用来存放 Java 对象实例(包括该对象其中的所有成员变量)和数组。它们不再使用时,由 Java 垃圾回收器来负责回收。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,这个特殊的变量就是我们上面说的引用变量。我们可以通过这个引用变量来访问堆中的对象或者数组。
阅读全文 »

公司工作使用 Gitlab,自己需要使用 Github,那么该如何在同一台 Mac 上配置多个账号呢

思路

ssh 方式链接到 Github/Gitlab,需要使用唯一的公钥,因此同一台 Mac 绑定多个账号,需要满足两个条件:

  • 生成对应的私钥/公钥
  • 设置不同的 Host 和 HostName 配置
  • 为每个仓库独立配置 用户名/用户邮箱
阅读全文 »

APP 接入 Bugly 热更新

公司最近项目在考虑加入热更新能力,综合目前开源的多个项目方案,我们采取了基于 Tinker 封装的 Bugly 热更新解决方案。

热补丁方案对比

主要参考阿里的 深入探索 Android 热修复技术原理

我们项目规模小,热修复实际运用场景很少,增加热补丁功能没有后台人力支援,没有项目经费;根据这些实际情况,我们选择了免费开源的 Tinker 项目,并使用了基于 Tinker 的免费后台发布系统 bugly。

阅读全文 »

函数基础

函数是最基本的一种代码抽象方式

条件判断

根据 Python 的缩进规则,如果 if 语句判断为 True ,就把接下来缩进的语句执行,否则执行 else 的内容

1
2
3
4
5
6
7
>>> age = 20
>>> if age>= 18:
... print("your age is",age)
... else:
... print("haha child")
...
your age is 20
阅读全文 »