笔记
文章平均质量分 75
张建良_19890510
这个作者很懒,什么都没留下…
展开
-
Git基本命令
服务器创建Git仓库在服务器创建新的 git库git init --bare frameworkbase.git授权,使 gitlan 用户有权限操作该git仓库sudo chown gitlan:gitlan -R frameworkbase.git客户端关联并提交代码到Git如果原先存在 .git 目录,最好先删除该目录,再初始化git initgit add .git commit -m "第一次提交"git remote add origin ssh://gitlan@192.原创 2020-05-26 09:32:35 · 251 阅读 · 0 评论 -
Android 源码编译笔记
一、下载源码 https://source.android.com/setup/downloading1、安装Repo 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中: mkdir ~/bin PATH=~/bin:$PATH 下载安装curl: https://blog.csdn.net/qq_31458537/article/details/87914443 下载 Repo 工具,并确保它可执行: curl https://storage.googleapis原创 2020-05-14 18:19:31 · 375 阅读 · 0 评论 -
力扣算法练习与解答笔记(21-30)
1、合并两个有序链表将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4解答:/** * Definition for singly-linked list. * public class ListNode...原创 2019-10-12 19:15:18 · 254 阅读 · 0 评论 -
ThreadPoolExecutor源码笔记(三)线程池的实现
1、5种状态//线程池能够接受任务,并且可以运行队列中的任务private static final int RUNNING = -1 << COUNT_BITS;//不接受新的任务,但是之前队列里面的任务还是会被调用[shutDown()之后的状态]private static final int SHUTDOWN = 0 << COUNT_BITS;...原创 2018-04-10 17:17:07 · 645 阅读 · 0 评论 -
JVM学习笔记(一)内存区域,对象创建,对象内存布局
前置1、符号引用:符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。 1)符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。 2)在Java中,一个java类将会编译成一个class文件。在编译时,java类并不知道所引用的类的实际地址,因此只能使用符号引用来代替。2、直接引用:直接引用可以是 1)直接指向目标的指针(比如,指向"...原创 2018-04-25 20:51:30 · 229 阅读 · 0 评论 -
jvm学习笔记(二)垃圾收集器与内存分配策略
一、对象可回收状态判断 1、引用计数算法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1;当引用失效时,计数器值减一。 计数器为0的对象,可以回收。 缺点:难以解决对象之间互相循环引用的问题;两个对象互相引用,但没有其他引用指向这两个对象,这两个对象 已经不可能再被访问,但是它们的引用计数都不为1,通过引用计数法无法通知GC收集器回收它们。 2、可达性...原创 2018-04-27 19:00:30 · 190 阅读 · 0 评论 -
dvm学习笔记(三)类文件结构、java方法数65535上限的原因
了解class类文件结构,对于学习smali也是有必要的!一、class类文件的结构(8位字节,一个字节占8位,以字节为基础单位的二进制流)存储结构:class文件是一组以字节(8位)为基础单位的二进制流,各数据严格按照顺序紧凑排列在class文件中,中间没有任何分隔符。需要占用一个字节(8位)以上空间的数据,会按照高位在前的方式分割成若干个字节(8位)进行存储。概念:无符号数和表组成。无...原创 2018-05-12 17:20:15 · 3202 阅读 · 2 评论 -
jvm学习笔记(四)虚拟机类加载机制、类加载器
一、类加载时机 1、流程: 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 2、解析一般发生在初始化前,也可以发生在初始化之后,但是其他步骤是不可变的。 3、加载一定发生在初始化之前,而以下情况必须立即初始化,在初始化之前自然必定先完成加载 1)遇到new、getstatic、putstatic、invokestatic这4...原创 2018-05-12 17:28:21 · 182 阅读 · 0 评论 -
android web模块独立进程的实现
一、简述原理:html -> web进程 -> app主进程 -> 回调到web进程 通过广播,也可以直接 app主进程 -> web进程 1、html->web进程,这一步不用说了,webview.addJavascriptInterface(obj, "webview"); 2、web进程 -> app主进程 通过ai...原创 2018-05-23 17:45:05 · 1968 阅读 · 2 评论 -
Android多进程重启app
对于一些需求,比如切换语言重启应用,如果项目中很多地方有通过Application.getResource().getString(int stringRes)在部分手机可能存在语言没有切换的问题,比较简单的能解决这个问题的方式是,杀死当前进程,重新启动app。具体实现:1、子进程服务/** * 跨进程重启,避免用Application获取的文案,切换语言后文案未更新问题 */public ...原创 2018-05-28 20:17:10 · 1133 阅读 · 0 评论 -
android自定义圆角矩形背景按钮,避免创建大量不可复用的shape.xml
圆角矩形背景,可变色,可左右方向渐变背景色,TextView项目中常常用到圆角矩形按钮,空心的、实心的、纯圆角的、任意radius的、背景颜色各种的、甚至颜色渐变的过去drawable中存在大量xml文件用来设置shape,这个自定义控件就是为了解决这个问题,避免在drawable中创建大量的shape/selector文件源码package xxx.xxx.xxx;imp...原创 2018-06-13 17:37:36 · 1066 阅读 · 3 评论 -
Java线程的底层实现、调度、状态转换
线程是CPU调度的基本单位,线程可以把一个进程的资源分配与执行调度分开,各线程共享进程资源,独立调度。一、线程的实现【通常说的Java线程是基于内核线程的轻量级进程来实现的】 1、使用内核线程实现 1.1 内核线程 1)内核线程是直接由操作系统内核支持的线程,由内核完成线程切换。 2)内核通过线程调度器(Scheduler)对线程调度并负责将线程的任务映射到各个处理器上。 3)...原创 2018-05-03 14:16:10 · 353 阅读 · 0 评论 -
Okio源码阅读笔记(二)复习下位运算
原作:Java位运算原理及使用讲解为了加深记忆,还是在上面博客基础上细节处加了点补充,方便时间久了回忆Okio高性能IO的关键在三点:1)的Segment对象池、Segment内部的压缩内容2)Buffer中缓存了一个Segment双向闭合链表,用空间换时间嘛。且有大量位运算,把写入的数据通过位运算转换成字节写入缓存,提高了性能。3)ByteString封装大量api,把各种输入(字符串/...)...转载 2018-04-21 12:28:35 · 197 阅读 · 0 评论 -
Okio源码阅读笔记(一)Segment与SegmentPool解析
1、 SegmentPool源码解析/** * 一个单例的线程安全的segment对象池,避免频繁创建和回收对象带来的性能消耗 */final class SegmentPool { //SegmentPool最大容量 64KB static final long MAX_SIZE = 64 * 1024; // 64 KiB. //由Segment组成的双向链表的第...原创 2018-04-19 22:02:27 · 908 阅读 · 1 评论 -
从源码看Activity启动过程(三)AMS-ActivityThread/ApplicationThread-实例化Activity
1、ActivityThread源码解析public final class ActivityThread { //一些重要变量 final ApplicationThread mAppThread = new ApplicationThread(); final Looper mLooper = Looper.myLooper(); //这个mH就是当前进程UI线程的handler...原创 2018-03-28 10:56:55 · 630 阅读 · 0 评论 -
从源码看Activity启动过程(二)从Activity到AMS
1、Activitypublic class Activity extends ContextThemeWrapper implements LayoutInflater.Factory2, Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks2, Window.OnWindow...原创 2018-04-03 12:38:41 · 179 阅读 · 0 评论 -
算法题库leetcode多加练习
多加练习:https://leetcode-cn.com/problemset/all/https://blog.csdn.net/notOnlyRush/article/details/79996933https://blog.csdn.net/jiangyanting2011/article/details/70325215https://blog.csdn.net/it_yangkun/ar...原创 2018-04-16 20:50:49 · 7125 阅读 · 0 评论 -
java 深入理解volatile关键字
一、首先要说明Java内存模型:参考资料1、Java为了保证其平台性,使Java应用程序与操作系统内存模型隔离开,需要定义自己的内存模型。在Java内存模型中,内存分为主内存和工作内存两个部分,其中主内存是所有线程所共享的,而工作内存则是每个线程分配一份,各线程的工作内存间彼此独立、互不可见,在线程启动的时候,虚拟机为每个线程分配一块工作内存,不仅包含了线程内部定义的局部变量,也包含了线程所需要使...原创 2018-03-29 15:24:41 · 176 阅读 · 0 评论 -
java锁的实现-AbstractQueuedSychronizer源码阅读(二)源码解析、深入理解排它锁(独占锁)的实现
AbstractQueuedSynchronizer设计者:Doug Lea一、简介1、本质上,AQS是基于Unsafe.CAS Unsafe.park Unsafe.unpark的原子操作来实现锁功能 Unsafe的操作粒度不是类,而是数据和地址。 1)先理解LockSupport.park,unpark(LockSupport.park内部是Unsafe.park,unpark也类似) 使用...原创 2018-04-13 15:18:15 · 842 阅读 · 0 评论 -
Okio源码阅读笔记(三)ByteString
其实ByteString没什么好看的。看之前以为有重要内容,看完后发现没有,不过既然已经看了,就记录下来吧。ByteString封装了以下几点1、就是把一些输入类型(字符串/字节数组/ByteBuffer/byte)转成字节数组,并封装成新的ByteString返回。比如ByteString.of(...)2、封装了对ByteString的比较、加密操作,方便使用比如ByteString.enco...原创 2018-04-23 16:37:30 · 9791 阅读 · 0 评论 -
Okio源码阅读笔记(四)Buffer
Buffer里缓存了一个双向闭合Segment链表,head引用指向链表的头部,head.prev就是链表尾部链表的每个元素Segment内部都缓存有一个字节数组,segment的有效起点是pos,有效数据终点是limitBuffer中封装了对该缓存链表的读、写等操作的方法,其中把其他类型的数据转成字节写入缓存中的代码运用了大量的位运算,我表示看不怎么懂,暂时先不钻研了。也算是个笔记。public...原创 2018-04-23 20:36:49 · 928 阅读 · 0 评论 -
Android断点技巧
1、Evaluate Expression 在断点处,用快捷键 Alt + F8 进入一个求值环境,在这里模拟执行任意代码 2、条件断点 在特定条件下的断点,满足该条件才会触发断点。 在断点上鼠标右键会出现一个小窗口,写上条件即可 3、日志断点 在想要输出信息的地方下一个断点;然后右键这个断点,在出现的设置框里面把这个断点的 suspend 属性设置为 False, 然后,我们在 log mess...转载 2018-05-31 16:21:20 · 1156 阅读 · 0 评论 -
SharedPreference源码简析
final class SharedPreferencesImpl implements SharedPreferences { ... private final File mFile; private final File mBackupFile; private final int mMode; private final Object mLock =...原创 2018-05-31 18:45:41 · 330 阅读 · 0 评论 -
Java常用注解笔记
常用注解笔记1、@Target####用于描述注解的使用范围####取值范围(ElementType):1)CONSTRUCTOR:用于描述构造器2)FIELD:用于描述域3)LOCAL_VARIABLE:用于描述局部变量4)METHOD:用于描述方法5)PACKAGE:用于描述包6)PARAMETER:用于描述参数7)TYPE:用于描述类、接口(包括注解类型) 或enum声明...原创 2019-01-30 19:07:24 · 372 阅读 · 0 评论 -
Android一串数字分两段,底部对齐字号不同
一串数字/文字分两段,字号不同没什么技术含量,分享下。效果图package xxx;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Pa...原创 2019-08-02 17:32:32 · 1307 阅读 · 0 评论 -
Android通过配置,在编译时修复第三方库中的bug
之前在项目中发现一个bug,是由于引用的一个第三方库中要求的最低版本高于app的最低版本。导致不支持的版本出现崩溃,排查发现可以通过修改库中版本判断的方法来解决问题。在网上找了一些实现方式,发现配置方式复杂,难以理解。于是决定参考其实现原理自己写一套。原理在 gradle编译android项目时,注册自定义 Transform,Transform中可以获取所有输入的jar信息扫描到需要修...原创 2019-07-25 20:07:29 · 508 阅读 · 0 评论 -
V2签名多渠道脚本与渠道读取
笔记,避免忘记和丢失签名脚本import java.nio.BufferUnderflowExceptionimport java.nio.ByteBufferimport java.nio.ByteOrderimport java.nio.channels.FileChannel/** * 多渠道写入脚本 * Created by zhangjianliang on 2018/1...原创 2019-09-09 20:32:58 · 540 阅读 · 0 评论 -
零碎知识点笔记
1、关于MediaTypeMediaType:指的是要传递的数据的MIME类型(描述消息内容类型的因特网标准)MediaType对象包含了三种信息:type 、subtype以及charset,一般将这些信息传入parse()方法中,这样就可以解析出MediaType对象,比如 “text/x-markdown; charset=utf-8” ,type值是text,表示是文本这一大类...原创 2019-09-18 14:26:58 · 381 阅读 · 0 评论 -
力扣算法练习与解答笔记(1-10)
1、两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解答...原创 2019-09-27 19:37:56 · 984 阅读 · 0 评论 -
力扣算法练习与解答笔记(11-20)
1、回文数原创 2019-10-08 18:19:38 · 518 阅读 · 0 评论 -
RecyclerView滚动到指定位置及高度计算
RecyclerView滚动到指定位置及高度计算滚动到指定位置高度计算滚动到指定位置由于RecyclerView的布局复用,看不到的item是暂时没有添加到RecyclerView中的,所以要滚动到看不到的item所在位置时,调用smoothScrollToPosition(int position)并不能滚动到目标位置。实现思路,每次滚动到最后一个可见item之前,循环滚动,直到滚动到目标...原创 2019-02-15 10:59:47 · 3028 阅读 · 0 评论 -
android命令行签名之V1Sign、V2Sign
获取keystore的别名:keytool -list -v -keystore keyStore的绝对路径 -storepass 密码keytool -alias //获取别名命令行V1签名命令:jarsigner.exe -verbose -keystore keystore的绝对路径 -signedjar 签名输出apk绝对路径 待签名apk绝对路径 keyStore别名Dem...原创 2019-01-25 15:49:25 · 2658 阅读 · 0 评论 -
Jenkins,android打包后脚本配置
只适合本人项目使用,其他项目可参看脚本代码记一下,怕以后自己也忘了# delete old apk (before 1 min) in sub folderstest $? -eq 0 &amp;amp;amp;amp;&amp;amp;amp;amp; find ${WORKSPACE}/app/build/outputs/apk -mindepth 1 -maxdepth 3 -type f -mmin +2 -exec rm -f...原创 2018-11-01 20:07:36 · 918 阅读 · 0 评论 -
插件化基础(二)Hook Binder
#插件化基础(二)Hook Binder(学习[大神](http://weishu.me/))原作:[Android插件化原理解析——Hook机制之Binder Hook](http://weishu.me/2016/02/16/understand-plugin-framework-binder-hook/) ##一、ClipboardManager的创建和获取过程###获取Clipboard...原创 2018-06-09 18:22:04 · 478 阅读 · 0 评论 -
Android8.0适配
Android8.0适配官方文档通知通知官方文档 解决方式//8.0通知栏适配if (Build.VERSION.SDK_INT &amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(String.valueOf...原创 2018-07-02 18:28:32 · 1658 阅读 · 0 评论 -
插件化基础(三)宿主中启动插件的四大组件原理、宿主与插件资源的共享实现原理
插件化原理(三)宿主中启动插件的四大组件原理、宿主与插件资源的共享实现原理插件化原理一、启动插件Activity原理1、Activity启动过程1) ●ActivityManagerProxy是AMS在app进程的Binder代理,ActivityManagerNative是对该Binder代理的操作工具类●IApplicationThread是应用启动时调用A...原创 2018-07-17 19:58:33 · 1386 阅读 · 0 评论 -
Android LruCache源码简析
LruCache源码解析缓存置换算法:LRU,LFU,FIFOLRU:淘汰最长时间未使用的对象LFU:淘汰一段时间内使用最少的对象,也就是淘汰使用频率最低的对象 FIFO:frist in first out,先进先出源码解析LruCache是线程安全的,对maxSize、map的操作,都有用synchronizedpackage android.support.v4.ut...原创 2018-03-31 14:54:57 · 266 阅读 · 0 评论 -
Android实现通用可控的控件阴影效果(附效果图)
背景android原生的阴影效果,一般都是用CardView来实现CardView的不足:1、阴影颜色无法修改2、阴影显示的位置不可控解决方案根据CardView阴影实现{@link android.support.v7.widget.RoundRectDrawableWithShadow},在它的基础上实现自定义阴影Drawable,阴影颜色、位置可控少说废话,多上干货Shadow...原创 2018-12-14 18:26:07 · 1418 阅读 · 3 评论 -
Android自己实现快速多渠道打包功能V1
Android多渠道打包性能优化1、问题传统的方式在 build.gradle 中通过 productFlavors 配置多渠道的方案,在多渠道打包时会执行多次编译打包过程,速度缓慢网上已经有成熟的、大厂大牛写的开源项目解决该问题;比如美团的walle但是,用第三方的插件,有时候不灵活。比如我们已经用了一个第三方打包插件,而我们多渠道打包任务要放在该插件执行完成之后;这时候就太好弄了。...原创 2018-12-07 15:32:38 · 755 阅读 · 0 评论 -
Android AccessibilityService模拟点击监测、上报、防御
模拟点击原理1、系统启动时,会启动大量系统服务,其中就包括 AccessibilityManagerServiceAccessibilityManagerService(这里简称AMS)在创建时,会注册一些系统广播,包括应用状态变化广播 PackageMonitor。2、PackageMonitor在有应用安装、卸载、更新时都会收到广播,在收到广播后,AMS会获取对应应用中注册的Access...原创 2019-01-11 14:56:05 · 8506 阅读 · 0 评论