自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (1)
  • 收藏
  • 关注

原创 软件项目管理第一章——软件项目管理概述

软件项目管理是为了使软件项目能够按照预定的成本、进度质量顺利完成,而对成本、人员、进度、质量、风险等进行分析和管理的活动。1.1.1项目(Project):为了创造一个。1.1.2.1项目目标遵循SMART原则。1.2.5 软件项目管理的迫切需要。1.2.3 软件开发项目管理定义。1.1.2.2 项目目标的特性。1.2.4 软件开发面临的问题。1.2.5 软件项目管理的目的。1.4.1 项目管理5要素。1.2.1 项目管理定义。1.1.2 项目的目标。1.4.1 战略角度。

2024-09-09 22:55:45 995

原创 Android 私服的搭建——Nexus

上一篇博客我介绍了Android 搭建私服的另外一个工具——Artifactory ,感兴趣的可以去了解下Android 私服的搭建——Artifactory但由于Artifactory是收费的,并且费用也不低。所以今天我也有必要在这里介绍下第二种私服的搭建工具Nexus。一、下载Nexushttps://www.sonatype.com/nexus/repository-oss-download今天我们选择windows环境进行操作。二、启动Nexus将下载的文件,解压后,会有如下两个文件夹

2021-02-05 22:02:35 769

原创 Android 私服的搭建——Artifactory

一、私服的选择用于Android 的私服了解的有以下两个1.nexus2.Artifactory由于nexus只支持maven,而artifactory支持maven,php,docker,npm等等,我们今天就只讲述下Artifactory的使用。Artifactory是由Jfrog开发的一款Maven仓库服务端软件,常用于内网部署maven仓库,提供公司内部公共库的上传和发布,同时可以为远程库提供缓存,以提高公共代码使用的便利性。Artifactory是收费的,如果只是练手,可以用用破解版

2021-01-21 22:28:26 5180 2

原创 Android 系统的启动和App的启动流程

一、Android 系统的启动流程在分析AMS之前,我们先看看Android系统的启动流程。      1.当用户按下电源开机键,引导芯片会加载BootLoader到内存中,开始拉起Linux OS,待Linux内核启动完毕后,它就会在系统文件中找init.rc文件,并启动init进程。      2.init进程在处理了一系列任务后,会进行一项非常关键的步骤:启动Zygote进程。

2020-12-19 14:08:39 1029 2

原创 Android Hook技术的简单实现

一、什么是Hook 技术Android 程序有一套特有的事件分发机制,都是按既定程序从前往后执行的。Hook 技术就是利用反射和代理,在既定程序中插入我们自己写的程序。比如,我们想在App所有的点击事件中添加播放音乐的效果。所有控件的点击事件,分发流程都是系统已经写好了,这时我们怎么做到在其中插入我们的播放音乐的效果呢?让我们拭目以待!二、如何寻找Hook点1.尽量选择静态变量和单例对象,因为一旦创建对象,他们不容易变化,非常容易定位。2.尽量Hook public的对象和方法三、Hook过程选

2020-12-06 12:57:54 703

原创 Android 类加载机制

Android 项目的.java文件会打包成.dex文件,那么Android程序在运行的时候,是如何从dex中找到我们的java类,然后加载到程序中的呢?下面我们来了解下。一、Android中的类加载器Android 中类加载器有三种BootClassLoader用于加载Android Framework层class文件,比如Activity,View类。PathClassLoader用于加载Android Framework之外的第三方插件的类或者是由开发者自己写的类,比我我们写的Ma

2020-12-05 22:02:10 380

原创 Android 插件化系列(一)——如何加载插件的类?

一、插件化的概念在说插件化之前我们先说说组件化组件化就是将一个app分成多个模块,每个模块都是一个组件(Module),开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,但是最终发布的时候是将这些组件合并成一个apk,这就是组件化开发。再来理解插件化插件化 和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包。二、组件化要解决的问题1.

2020-12-02 20:54:20 398

原创 Gradle系列知识(九)——Gradle 插件的另外几种写法

一、以gradle脚本的方式写gradle 插件在build.gradle中写入一下代码apply plugin :SimplePluginclass SimplePlugin implements Plugin<Project>{ @Override void apply(Project project) { println("我是SimplePlugin") }}编译可以看到一下输出> Configure project :app

2020-11-29 17:12:14 1557

原创 Gradle系列知识(八)——Gradle中的插件

一、Android 引用Gradle插件的形式apply plugin: 'com.android.application'apply plugin: 'r2generator-plugin'在这里引入的插件,系统编译是会到dependencies 代码块中查找是否有对应的依赖,dependencies 中引入的依赖,系统又会去repositories 代码块中配置的仓库中寻找有没有对应的插件。有才会正常加载,编译。buildscript { repositories {

2020-11-29 16:25:41 392

原创 Gradle系列知识(七)——Gradle中的Project 和Task

setting.gradle:这个文件是在初始化阶段执行,一个gradle项目中必须由setting.gradle这个文件,因为它决定了那些项目参与构建。在gradle的构建中这是最先执行的一个文件。一、Project在一个Android项目中,根工程师一个Project,其内部每一个module,只要有build.gradle,它就是一个Project。每一个Project,在编译期间都会生成一个对应的Project对象,我们在build.gradle中写的代码,其实就是在Project对象内部执行的

2020-11-29 10:18:51 621

原创 Gradle系列知识(六)——Gradle 生命周期

一、Gradle 生命周期1、initialization:初始化阶段执行工程的setting.gradle文件。 解析整个工程下的所有Project,构建所有的Project对应的project对象2、Configuration:配置阶段解析所有project对象中的task,构建好所有的task拓扑图(有向无环图)。这个有向无环图其实就是各个执行一个Task所依赖的其他Task而形成的一种关系图。3、Excution:执行阶段执行具体的task,及其依赖的task(先执行目标Task依赖的

2020-11-28 22:56:40 2862

原创 Gradle系列知识(五)——Groovy的文件操作

先从代码开始了解//通过文件路径构建File操作对象def file = new File("D:\\demo\\静夜思.txt")//这里是一行一行读file.eachLine {line-> println(line)}看看输出结果 《静夜思》床前明月光,疑是地上霜。举头望明月,低头思故乡。groovy中的文件操作比java 要简单很多。def text = file.getText()println(text)通过file.getText()的方

2020-11-28 17:15:45 454

原创 Gradle系列知识(四)——Groovy的面向对象

一、类(class)我们先来定义一个类class Runner { String name int age}注意groovy中class、以及变量默认都是public的,不用再写。使用对象Runner runner = new Runner(name: "Tom",age: 18)println "我是"+runner.name+" 年龄是"+runner.age前面Runner 类中我们虽然没有定义有参的构造函数,这样写了后,系统会自动为我们创建含参数的构造函数。输

2020-11-28 16:42:10 279 1

原创 Gradle系列知识(三)——Groovy的数据结构Map

一、Map的定义和访问def students = ["001":"Tom","002":"Jack","003":"Rose","004":"Tim"]println students['001']println students."002"输出结果TomJack二、添加元素def students = ["001":"Tom","002":"Jack","003":"Rose","004":"Tim"]//添加元素students."005" = "Lily"println

2020-11-28 16:05:34 838 2

原创 Gradle系列知识(二)——Groovy的数据结构List

一、闭包中的三个重要变量this、owner、delegate让我们先看看这样一份代码def closure1 = { println("我是 closure1 this ="+this) println("我是 closure1 owner ="+owner) println("我是 closure1 delegate ="+delegate) def closure2 ={ println("我是

2020-11-28 14:14:37 891

原创 Gradle系列知识(一)—— Groovy基础变量和闭包

一、强类型强类型直接用变量类型申明变量弱类型可以用def 申明变量 ,编译器自动识别类型,弱类型用之前必须初始化,强类型可以不初始化。二、弱类型

2020-11-28 11:21:27 364

原创 MVVM中data binding系列(三)

动态更新和双向绑定根据Model实体类的内容来动态更新UI,分别对应字段(ObservableField),类(Observable),集合类型(Observable 容器类)1.使用Observable首先我们需要定义Model实体类import androidx.databinding.BaseObservable;import androidx.databinding.Bindable;import com.mvvm.BR;public class Student extends Bas

2020-11-22 14:53:02 295

原创 MVVM中data binding系列(二)

一、自定义Binding类名在默认情况下,Binding辅助类的名称取决于布局文件的命名,将布局文件的名称按驼峰命名规则更改后,再在后面加上Binding。如布局文件名称为activity_main,对应的Binding辅助类的名称就是ActivityMainBinding。那么该怎么自定义Binding辅助类的名称呢?看看下面代码<data class="com.mvvm.CustomBinding"> <variable name="list"

2020-11-22 11:56:00 319

原创 MVVM中data binding系列(一)

一、gradle配置android { compileSdkVersion 30 buildToolsVersion "30.0.2" ... buildFeatures{//注意这里 Gradle 5.0之前的版本是dataBinding,5.0之后的版本是buildFeatures dataBinding = true } 二、基础使用添加Model实体类public class Student { private Str

2020-11-22 11:01:08 320

原创 OkHttp里面的拦截器

一、RetryAndFollowUpInterceptor重试和重定向拦截器

2020-11-16 22:20:11 2656

原创 Android面试题系列(2)

1、创建线程的四种方式?(1)定义类A继承Thread ,复写run方法,然后new 一个类A的对象,调用start方法即可(2)定义类B实现Runnable接口,复写run方法,然后new一个Thread对象thread,传入类B的对象,调用thread的start方法即可(3)定义类C实现Callable接口,new一个FutureTask对象F传入类C的对象,再new一个Thread对象传入对象F,调用Thread对象的start()方法即可(4)使用线程池创建线程。2、run()和star

2020-11-13 21:22:12 173

原创 Android面试题系列(1)

1、String、StringBuffer、StringBuilder区别String类,被final修饰,不能被继承,也不能被改变,拼接的时候会生成新的对象。StringBuffer 间接实现了Appendable接口,可以拼接,操作字符串的接口都加了线程同步机制,线程安全,但效率较低。StringBuilder间接实现了Appendable接口,可以拼接,相对于StringBuffer 而言,操作字符串的接口没有加线程同步机制,所以线程不安全,但效率较高。2、进程和线程的区别进程是系统分配资源

2020-11-12 22:03:11 231

原创 从源码角度简单分析下Handler发消息流程

一、发送消息(sendMssage)handler.sendMessage(message)handler.sendMessageDelayed()等发送消息的方法,最终都会走到sendMessageAtTime public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; if (queue == null) { R

2020-11-11 23:12:09 194

转载 Java方法之参数传递机制

文章目录Java方法之参数传递机制一、基本数据类型二、引用数据类型Java方法之参数传递机制Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。这就涉及到Java中的参数传递机制,值传递。一、基本数据类型基本数据类型,值传递的体现是数值的传递。public class TransferTempTest { public static void main(String[] args) { //基本数据类型参数传递

2020-11-11 20:55:46 253

原创 简单聊下Java 中的字符串String

一、String对象的创建java中的String创建有2种方式,字符串的创建有2种方式,一种是字面常量的方式,如:String s1 = "abc";另外一种是构造函数的方式,如:String s2 = new String("def");两种方式的创建的字符串在内存中的存放有所区别。通过字面常量申明的字符串,JVM会先去字符串常量池中找有没有相同的字符串,有的话直接返回其引用,没有到话在字符串常量池中创建,并返回其引用。使用构造函数创建字符串时,JVM同样也会先到字符串常量池中找找有

2020-11-08 18:48:46 262

原创 java中==、equals和hashCode的区别

1、java中==和equals和hashCode的区别(1)==对于byte、short、char、int等基础类型,他们用“==”比较的是值 。当用于比较引用类型时,如类,数组,他们比较的是内存地址 。注意:Integer == Integer,因为前后都是对象,所以比较的是引用。int == Integer 这里会自动拆箱为int, 所以比较得是值。看看一下代码Integer a1 = 127; Integer b1 = 127; Integer a = 128;

2020-11-05 22:28:26 310

原创 gradle 下载地址

最近gradle 官方网站下载超慢,这里给大家分享下几个版本,应该够用。1.gradle-3.5-all.zip链接:https://pan.baidu.com/s/1JLQCh_04K_2kCJQX9UApsA提取码:efws2.gradle-4.6-all.zip链接:https://pan.baidu.com/s/1jUQ2twTf5upaOgSaojUgRA提取码:u6173.gradle-4.7-all.zip链接:https://pan.baidu.com/s/1nY1nj1dn

2020-11-01 20:04:36 447

原创 ViewPager相关问题总结

1.给ViewPager设置高度为wrap_content,给子布局的高度设置为固定高度,为什么这个固定高度不生效?看看ViewPager的onMeasure源码 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { this.setMeasuredDimension(getDefaultSize(0, widthMeasureSpec), getDefaultSize(0, heightMeasu

2020-10-31 20:34:53 324

原创 RecycleView 缓存机制总结

一、RecycleView的四级缓存1.第一级缓存mChangedScrap(ArrayList<ViewHolder>)和mAttachedScrap (ArrayList<ViewHolder>),主要用于缓存屏幕内的ViewHolder,在用户调用notifyxxx()的时候,直接取数据刷新页面。mChangedScrap和mAttachedScrap 的区别是当调用不同的notifyxxx()方法刷新页面的时候,缓存数据有些放在mChangedScrap,有些放在mAtta

2020-10-31 14:54:28 513

原创 JNI入门指南

一、配置JNI开发环境1.在Android studio 的SDK Tools里面下载NDK 和CMake,并配置ndk的环境变量。2.在local.properties添加配置ndk路径sdk.dir=D\:\\software_install\\Android\\sdkndk.dir=D\:\\software_install\\Android\\sdk\\ndk //添加这行3.在gradle.properties中添加android.useDeprecatedNdk=true /

2020-10-29 21:49:35 472

原创 CMakeLists文件解析

一、

2020-10-29 21:38:13 446

原创 linux基础知识(四)

九、文件压缩管理1.gz 格式的文件使用 gzip 命令压缩文件,使用gunzip 命令解压缩文件注意:压缩过程中不保留源文件,不能对目录进行压缩,不能对多个文件进行打包压缩。 gzip * //压缩目录下的所有文件,这是单个文件压缩2.bz2 格式的文件使用 bzip2 命令压缩文件,使用 bunzip2 命令注意:通过使用参数 -k(keep) 保留源文件,不能对目录进行压缩,不能对多个文件进行打包压缩、# bzip2 -c a.txt b.txt3.rar格式文件使用前使用以下

2020-10-26 22:16:21 189

原创 linux基础知识(三)

八、磁盘管理相关命令df命令可列出文件系统的整体磁盘使用量用法:df [-参数] [目录或文件名]参数:a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;k :以 KBytes 的容量显示各文件系统;m :以 MBytes 的容量显示各文件系统;h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;H :以 M=1000K 取代 M=1024K 的进位方式;T :显示文件系统类型, 连同该 partition 的 file

2020-10-25 22:28:25 219

原创 linux基础知识(二)

五、用户、用户组、文件权限相关操作命令1.查看当前登录用户whoami2.修改文件属性chmod [who] [+|-|=] [mode] 文件名参数who:u : 用户(user)g : 同组用户(group)o :其他用户(other)a : 所用用户(all)【默认】操作符【±=】:+ : 添加权限- : 取消权限= : 赋予给定权限并取消其他权限权限【mode】:r : 读w : 写x :执行3.将指定文件的拥有者改为指定的

2020-10-24 15:22:28 182

原创 linux基础知识(一)

一、linux系统目录结构登录系统后,在当前命令窗口下输入命令:ls /就会显示出系统目录以下是对这些目录的解释:/bin:bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。/boot:这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev :dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。/etc

2020-10-24 14:10:55 474

原创 解决Android studio 连接 dl.google.com超时的问题

报错如下Connect to dl.google.com:443 [dl.google.com/120.253.255.33] failed问题原因:是DNS未解析到域名dl.google.com的IP或者解析过程中出了差错。解决方案:1.百度一个IP查询网址,输入域名dl.google.com,查找到对应的IP2.找前几个ping一下,看是否可用,我们这里选第一个3.找到电脑的hosts文件,C:\Windows\System32\drivers\etc\hosts将域名和对应IP写

2020-10-18 21:17:40 5664 5

原创 java设计模式(三)——代理模式

一、代理模式定义: 为其他对象提供一种代理控制对这个对象的访问。**使用场景: **当无法或者不想访问某个对象,或者访问某个对象存在困难时可以通过一个代理对象来间接访问。为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。代理模式分为静态代理和动态代理,先说说静态代理。1.静态代理被代理对象和代理对象都需要实现的接口。public interface IBuySomething { void buy(String string);}被代理对象public class

2020-10-15 22:06:16 245 2

原创 java设计模式(二)——工厂方法模式、抽象工厂模式

一、工厂方法模式工厂模式分为简单工厂模式、工厂方法模式、抽象工厂模式。简单工厂模式就是将所有对象的创建放在一个类里面,由外面传的参数,用if else或者是switch语句来判断是创建何种对象,过于简单,这里就不赘述了。工厂方法模式:简单来说就是一类产品用一个工厂类来创建。产品父类:public class Product { public void showMsg(){}}产品A类:public class ProductA extends Product{ @Overr

2020-10-11 22:11:42 195

原创 java设计模式(一)——单例模式、Builder模式、适配器模式

一、六大设计原则1.开闭原则对扩展开发,对修改关闭。2.里氏替换原则子类可以扩展父类的功能,但不能修改父类的功能。3.依赖倒置原则高层模块不应该依赖底层模块,两者都应该依赖抽象模块,抽象不应该依赖细节。4.单一职责原则规定一个类应该有且只有一个原因使它发生改变,否则该类应该被拆分。5.接口隔离原则一个类对另一个类的依赖应该建立在最小的接口上。6.迪米特法则也叫作最少知识原则只跟你的朋友交谈,不跟陌生人说话。也就是当两个程序无须直接通行,就不应该发生相互调用,可通过第三方调用。

2020-10-11 17:45:14 545 2

原创 C++学习笔记(二)

1.命名空间命名空间的出现是为解决命名冲突。namespace namespaceA{ int a = 100;}namespace namespaceB{ int a = 2999;//这里可以定义变量,也可以定义结构体}int main() { using namespace namespaceA; cout<<" a= "<<namespaceA::a<<endl; using namespace names

2020-10-08 18:35:38 222

opencv-3.4.0-android-sdk.zip

opencv for Android sdk,今天在网上找了好久都没找到。 这是直接从官网下载的,大家可以放心使用,希望可以帮到大家!

2020-11-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除