自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

重学Android,保持学习

记录搬砖中的一些成长和心得

  • 博客(68)
  • 资源 (6)
  • 收藏
  • 关注

原创 Glide源码解析

目前得物的图片库主要是基于的自研图片加载库,但是源码的精妙之处我们也有很多值得学习的地方。今天跟一下源码,和小伙伴们分享下我的理解。什么导包啥的我们就不赘述了,直接干,拿到ImageView去展示服务端图片。大概步骤如下下面我们追踪一下这3个函数:跟到一个有代表性的重载方法里面看:空白通过感知后通知给到所有实现了该接口的类又是一堆重载,但是可以看到很明显有我们常用的跟下来只是在类里面就结束了。意犹未尽,其实下面的才是重点终于看到网络接口的请求了,这里用的是,累惨了!绕了

2022-07-11 10:33:34 1969 1

原创 自定义AndroidLint在得物社区的实践分享

现在正常的商业APP,大部分都会禁止在代码里直接用系统的Log直接打日志,原因大家都懂就不细说了。所以自定义一个Lint检测很有必要,如下图:诸如此类的还有、、、等等一些列常规方法和类检测。随便举两个例子,来说明现实场景中可能存在的问题:这类问题在测试环境很难测出,review阶段也可能没注意到,直到灰度甚至全量在线上出现crash才被发现。而Lint就是这么一种可以较低侵入、损失提前的解决方案。当然除此之外,作为TL或者更高层面的角色,是希望大家能按照某种规则,把相关代码都写在统一要求的位置,那其

2022-06-08 23:29:40 1103

原创 Android基于Fmod实现变音

fmod介绍古人有云:视频界有ffmpeg,音频界有fmod。下面的游戏大家伙可以看看,有没有眼熟的:我随便截了几张图,有兴趣的可以到Fmod官网去具体了解。怎么样有没有兴趣搞个小游戏玩玩,音频引擎已经有了。我这边在调音编辑器里玩了一会,但是调音水平有限,不过多介绍了,有兴趣的自己down下来玩儿。废话不多说,准备干活第一步 先下载Android平台的引擎第二步 下载后需要的文件:新建项目并部署C/C++库步骤第一步 新建Native Project然后一路next

2021-12-15 15:25:10 3888 2

原创 Scrcpy无线控制android手机

背景你是否存在一种情况,正在疯狂搬砖,或者debug正酣的时候,突然想起有个会议或者分享要参加,于是不得不把拓展坞,连接线、手机和电脑一起带着去开会。如果有,那么今天分享的文章可以很好的解决这个问题,至少可以做到扔掉拓展坞和数据线(记得告诉我仍在哪里了,我去捡!!!)具体操作PS以下操作都基于mac,被操作手机无需root。第一步 Homebrew 安装(如果已安装了,则略过此步骤,直接进入第二步)/usr/bin/ruby -e "$(curl -fsSL https://raw.githu

2021-11-16 18:44:10 3817

原创 分析一次kotlin-android-extensions引起的空指针问题

背景最近开发遇到一个问题,下面图片的recycleview在滚动的时候需要动态的去滚动上面的分类recycleview,如下图,结果是代码里虽然写了在底部rv滚动的时候已计算出对应的分类rv_tab的position,并调用了rv_tab?.smoothScrollToPosition(parentPosition),为何没有生效?代码逻辑也很清晰: //初始化滤镜浮层下面的分类 filterList.apply { layoutManager

2021-11-09 16:41:19 2938

原创 CameraX和OpenGL的融合(cameraX预览数据openGL渲染)

上一篇实现了rc版本的CameraX的一些基本能力但是那只是基本,因为很多时候我们想要在拿到预览的YUV之前,就做一些事情,那只能通过拿到SurfaceTexture交给OpenGL去渲染,这篇文章就是主要说这个的,相关文章或者视频再网上挺少的,所以花费了比较多时间,后面细说。前置知识OpenGL(Open Graphics Library)是开放图形库。是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口API。简单来说就是一套画图的API。OpenGL ES (OpenGL fo

2021-04-27 20:53:06 2726 2

原创 最新版CameraX入门(拍照、存储展示、切换前后摄像头、手电筒、闪光灯、手势伸缩、双击放大缩小)

基于官网demo,增加了对焦、手势缩放、手电、闪光灯等操作Camera的预备知识熟悉的大佬可以跳过Surface、SurfaceView、SurfaceHolder这三个是啥Surface是什么?一句话来说Surface 是一块用于填充图像数据的内存空间。可以再深入一点,了解下它包含的东西:SurfaceView是什么?一句话来描述的话那就是:它一个可以显示surface的view!在App端它仍在View hierachy中,但在WMS中(可以理解为Server端),它与宿主窗口是分.

2021-04-22 19:38:09 11728 10

原创 android静默安装+自动打开只需要看这一篇就够了

随着物联网的兴起,无人值守的android设备越来越多,我目前手里刚好在接相关的售票机器,由于无人值守,网上太多了相关文章了,但是我看了很多总结如下,亲测有效!前提:root!非root设备就需要rom厂商的签名了第一步增加权限 <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission

2020-12-22 11:49:23 3127 4

原创 傻瓜式真香Mac for jadx 查看apk、dex、class文件

第一步打开链接https://github.com/skylot/jadx第二步按照要求下载或配置第三步1、apk重命名后缀为zip2、解压该zip,把.dex文件拖入工具中即可看到原文,如果未混淆的话。

2020-12-02 16:34:13 1030

原创 解决Android10 无法下载安装apk的问题 open failed: EACCES (Permission denied)

背景Android 10 华为P30 pro手机从服务器下载apk安装包的时候报错open failed: EACCES (Permission denied)解决方法注意这句话: android:requestLegacyExternalStorage="true" <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mip

2020-06-11 12:03:36 12952 1

原创 Error inflating class com.google.android.material.button.MaterialButton

在xml里面使用MaterialButton的时候报错,报错信息如下: Caused by: android.view.InflateException: Binary XML file line #141: Binary XML file line #141: Error inflating class com.google.android.material.button.MaterialButton at android.view.LayoutInflater.inflate(Layo

2020-05-14 17:33:24 5514

原创 Flutter与原生安卓iOS开发交互(一)

Flutter如何嵌入到原生安卓中?请把Flutter Dart都更新到最新版,否则网上大多数文章就不要看了,纯属浪费时间。新建一个Flutter Module切换config为app,而非默认的main.dart如图:以上两步轻松在安卓项目中引入Flutter你问:如何把Flutter写的view引入到安卓中呢?我答:第一步在安卓端把Flutter编写的界面作为普通的view...

2020-04-15 12:04:40 930 1

原创 flutter bottom overflowed by 50 PIXELS

原来的布局是这样:return new Scaffold( appBar: new AppBar( title: new Text("界面一"), ), body: Padding( padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24....

2019-09-30 10:15:55 4085

原创 debugPaintSizeEnabled Flutter显示布局

有时候我们想要像Android一样可以显示的看到自己布局的情况,那么很简单只需要设置---->系统---->开发者选项---->显示边界布局(选中)就OK了,类似下图:那么在Flutter种有没有类似的操作呢?答案是有的:debugPaintSizeEnabled = true; //显示边界布局然后自动import即可...

2019-08-14 13:51:17 2947 1

原创 Flutter通过Android Studio 打包release版本的APK

简单点:第一步:创建keystore,假设已经创建了一个jsk文件第二步:在工程里创建key.properties文件:storePassword=xxxxkeyPassword=xxxxkeyAlias=xxstoreFile=xxxxxxxx第三步:在/android/app/build.gradle文件里面新增这样三行代码:def keystoreProp...

2019-08-06 14:49:07 3152 1

原创 Flutter中如何去掉右上角的DEBUG标签(debugShowCheckedModeBanner)

看到自己写的Flutter APP或者运行的Demo常常有这个标签,那么我们需要如何去掉呢?方法一,构建release版本方法二,看着不爽,在调试阶段只需要一行代码:void main() { runApp(Zodoscope());}class Zodoscope extends StatefulWidget { @override _ZodoscopeSt...

2019-08-06 10:16:25 3768

原创 斐波那契(Fibonacci)的算法优化

前言斐波那契 相信大多数开发者都有所了解,就是像这样的数列:0、1、1、2、3、5、8、13、21如果您还没有想起或者以前没有接触过,可以参考链接:斐波那契百度百科斐波那契维基百科好了现在假设你知道了斐波那契的现象,那么进入正题:如何最牛逼的用Java语言实现斐波那契a)最常想到的算法 /** * 最常想到的 递归 * @param n *

2014-01-05 15:30:40 3659 1

原创 Dialog事件穿透解析

背景activity上弹出全屏dialog,需要在dialog透明度为0的地方进行事件传递,即下方的activity响应事件。毫无疑问,事件分发。但是之前我们都是在同一个view树上进行递归分发,那么dialog和activity也是这样吗?事件分发于是,按照常规思路,dialog是依附在activity上展示的,那么只需要对dialog中rootview的onTouchEvent事件进行不拦截,返回false,最后会调用activity的onTouchEvent方法,代码如下: @Overri

2021-11-03 13:34:40 281

原创 浅谈设备唯一 ID

一、前言设备ID,简单来说就是一串符号(或者数字),映射现实中一台设备。如果这些符号和现实中的设备是一一对应的,可称之为“唯一设备ID(Unique Device Identifier)”。然而,对于Android平台而言,没有稳定的API可以让开发者获取到这样的设备ID。开发者通常会遇到这样的困境:随着项目的演进, 越来越多的地方需要用到设备ID然而随着Android版本的升级,获取设备ID却越来越难了。加上Android平台碎片化的问题,获取设备ID之路,可以说是步履维艰。二

2021-11-01 17:45:37 375

原创 Class JavaLaunchHelper is implemented in both ..One of the two will be used. Which one is undefined.

最近用IDEA运行项目的时候 遇到过两次这个错:objc[99514]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/bin/java (0x10af364c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/jre/lib/libinst

2021-10-13 10:32:29 1291

原创 kotlin arraylist mutabllist indexOf 一直为0的问题原因及剖析

背景最近有一个需求,从服务端请求数据拿到一个数组,塞到list里面后,在后面某个地方需要通过具体的Element去找到它在list中的index,很简单对不对,直接list.indexOf(e) 不就好了么?奇怪的地方举个例子Data 是数据实体Bean,比如存在两个属性,name和addressvar data1 = Data("张三","北京朝阳区")var data2 = Data("李四","北京海淀区")var data3 = Data("王五","北京朝阳区")dataList.

2021-07-05 10:54:07 779

原创 动态替换APP的logo

奇怪的知识又增加了动态替换桌面图标以前认为不可能实现,后来被打脸了class MainActivity : AppCompatActivity() { var isChange = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

2021-03-19 15:38:43 324

原创 Jetpack之LiveData你所需要的一切

基本概念LiveData是一种具有生命周期感知能力的可观察数据持有类LiveData可以保证屏幕上的显示内容和数据一直保持同步特点LiveData了解UI界面的状态,如果activity不在屏幕上显示,livedata不会触发没必要的界面更新,如果activity已经被销毁,会自动清空与observer的连接-LiveData是一个LifecycleOwner,他可以直接感知activity或fragment的生命周期可解决什么问题感知生命周期,在active的时候接收变化可以感知

2021-02-15 19:35:57 259

原创 Jetpack之LifeCycle你所需要知道的一切

背景从今天开始整理一些之前学过的jetpack的组件基本概念Livecycle 是一个表示android生命周期及状态的对象LivecycleOwner(可以理解为被观察者) 用于连接有生命周期的对象,如activity,fragmentLivecycleObserver(可以理解为观察者) 用于观察LifecycleOwner可以解决什么问题可以有效的避免内存泄漏和解决android生命周期的常见难题。Glide里面就是通过LifeCycle而免除了很多这样的代码:“on

2021-02-15 15:12:18 522

转载 [转载]双重校验单例模式的经典实现为什么要加volatile

双重校验单例模式的经典实现为什么要加volatile这里加volatile关键字的用途是为了防止指令重排class Singleton{ private volatile static Singleton singleton; public static Singleton getInstance(){ if(singleton == null){ // 语句1 synchronize

2021-02-07 14:33:43 141

原创 WebView容器的封装和理解

核心基础简介Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。WebView的状态//激活WebView为活跃状态,能正常执行网页的响应webView.onResume() ;//当页面被失去焦点被切换到后台不可见状态,需要执行onPause//通过onPause动作通知内核暂停所有的动作,比如DOM的解析、plugin的执行、JavaScript执行。webView.onPause();//当应用程序(存在webview)

2021-02-01 15:00:41 1160

原创 记录一次Android多渠道打包

背景我有一个需求,要求是同一份代码要打两个包出来,只不过包名、logo、名称、签名、部分代码不一样,我是这样做的。第一步app的build.gradle中android { compileSdkVersion 29 buildToolsVersion "29.0.3" defaultConfig { applicationId "xxx" minSdkVersion 21 targetSdkVersion 30

2021-01-12 17:14:36 223

原创 监听网络状态

背景硬件设备有时候断网或者网络不佳的时候,需要做出相应逻辑,比如跳转到网络异常界面,或者从网络异常界面恢复,当然也可能只是简单的提示。第一步写receiver//这里传入了一个全局的livedata参数过来class NetworkReceiver(private val liveNetInfo: MutableLiveData<NetworkInfo?>) : BroadcastReceiver() { override fun onReceive(context:

2021-01-11 15:10:19 442

原创 Okhttp相关知识点总结

OkHttp介绍Google在Android4.4以后开始将源码中的HttpURLConnection底层实现替换为OKHttp,同时现在流行的Retrofit框架底层同样是使用OKHttp的。优点支持Http1、Http2、Quic以及WebSocket连接池复用底层TCP(Socket),减少请求延时缓存响应数据减少重复的网络请求请求失败自动重试主机的其他ip,自动重定向使用流程在使用OkHttp发起一次请求时,对于使用者最少存在 OkHttpClient 、 Request

2020-12-22 23:08:20 476 2

原创 《APP架构师实践指南》读书笔记

全书分15个章节,概述了作为一个APP客户端架构师所要掌握的技能图谱,作为安卓开发者,所以里面所有iOS的内容我自动跳过了,这里也作为一些记录,有的是我实践过的,有的是待验证的,留作记录。眼界的拓展:架构的核心是功能、安全、性能和稳定。职责包括选型规划、架构设计、技术攻关、沟通协调、疑难攻略等。封装、继承、多态到底什么是封装?封装是面向对象中最基础的,本质可以理解为将一堆函数、一堆对象放在一起,对外暴露接口,隐藏具体执行细节。那继承呢?继承是OO中一个重要的概念,如果处理不好,容易.

2020-12-13 21:10:29 310

原创 依赖倒置原则的理解

一直不太理解这个原则,直到看到了这个例子:class DriverTest { @Test fun main(){ val driver = Driver() val benz = Benz() driver.driver(benz) }}class Driver{ fun driver(car: Benz){ car.run() }}class Benz{ fun run(){

2020-12-11 18:38:36 327

原创 Java和Android序列化相关知识点记录

概念序列化:将数据结构或对象转换成二进制串的过程。反序列化:反之。常见的序列化协议Serializable Java的序列化方案Parcelable Android独有json,xml,protbuf … 广义的序列化Serializablepublic interface Serializable { }Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。public c

2020-12-08 14:14:26 111

原创 Java线程梳理

线程和进程的基本概念线程:一言以蔽之就是CPU调度的最小单位,必须依赖于进程。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享。进程:一言以蔽之就是程序运行资源分配的最小单位,当我们运行一个程序,就启动了一 个进程。显然,程序是死的、静态的,进程是活的、动态的。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,用户进程就是所有由我们启动的进程。CPU核心数和线程的关系一般情况

2020-12-07 23:07:54 133

原创 动态代理相关知识记录

静态代理抽象角色 指代理角色和真实角色对外提供的公共方法,一般为一个接口真实角色 需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业务逻辑在此代理角色 需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制都放到代理角色中处理!静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。一般来说,被代理对象和代理对象是一对一的关系,当然一

2020-12-06 00:39:16 139

原创 新接手项目,查看依赖关系

gradlew app:dependencies >> dependency.txt竟然报错了:bash: ./gradlew: Permission denied那我加权限:chmod +x gradlew完事儿我再次调用还是报错:bash: ./gradlew: /usr/bin/env: bad interpreter: Operation not permitted继续:ls -l发现:由于项目在经过云盘或者什么传输后加入了拓展属性@,注意gradlew文件也是被加

2020-12-06 00:30:05 252

原创 Java注解和反射相关知识总结

注解与声明一个"Class"不同的是,注解的声明使用 @interface 关键字。一个注解的声明如下:/** - Created by Alex on 12/1/20 */public @interface PassengerType {}元注解:作用在注解上的注解@TargetElementType.ANNOTATION_TYPE 可以应用于注解类型。ElementType.CONSTRUCTOR 可以应用于构造函数。ElementType.FIELD 可以应用于字段

2020-12-03 00:07:08 139

原创 Java泛型知识点总结

为什么需要泛型适用于多种数据类型执行相同的代码。比如:List list = new ArrayList<>()list.add("aa");list.add("bb");list.add(123);因为List里面可以放object,所以上面没问题。但是在取出元素用的时候 就容易出现 int转成string报错ClassCastException。而使用泛型List<String>lisit = new ArrayList<>();在编译期不允

2020-11-26 14:11:35 274

原创 sharedUserId共享两个APP的SP数据

第一步两个APP的manifest里面使用统一的android:sharedUserId=“shared.cn.ly”shared.cn.ly这个值随便取,但是要求xxx.xxx这种格式。第二步第一个APP的某个activity中往sp里面写数据 val sp = getSharedPreferences("data", Context.MODE_PRIVATE) sp.edit().putString("name","alex").apply()第三步必须要用

2020-11-25 16:37:23 523 1

原创 《组件化架构》知识汇总

组件:指单一的功能组件,如视频组件(VideoSDK)、支付组件(PaySDK)、路由组件(Router),每个组件都能单独抽出来制作成SDK,也有的公司内部叫Lib组件模块:指的是独立的业务模块,如直播模块(LiveModule)、首页模块(HomeModule)、即时通信模块(IMModule)等。模块相对于组件来说粒度更大,模块可能包含多种不同的组件。有的公司内部也叫UI组件组件化的好处: 避免重复造轮子,节省开发和维护成本 通过组件和模块为业务基准合理安排人力,提高开发...

2020-11-24 22:38:46 612

原创 [算法]最长公共前缀

题目编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例输入: [“flower”,“flow”,“flight”]输出: “fl”输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。这是一道简单题,没什么说的class Solution { public String longestCommonPrefix(String[] str) { if(str==null||st

2020-11-18 14:03:36 97

QtScrcpy-mac-x64-v1.7.1.dmg.zip

用于在电脑上无线连接和操控手机

2021-11-16

DangeroutUtils.kt

Android的危险操作,具体请看https://blog.csdn.net/u012346890/article/details/111516870

2020-12-22

jadx-1.2.0.zip

windows和mac上支持直接查看.apk .class .dex 具体介绍 https://blog.csdn.net/u012346890/article/details/110488259

2020-12-02

斐波那契多种算法优化

斐波那契算法的各种实现,详情请看:http://blog.csdn.net/u012346890/article/details/17882813

2014-01-05

Android反编译for windows

通过这两个工具拿到已知apk的图片资源、源代码,学习必备。

2013-11-21

Android反编译for mac

在mac 上实现android 反编译,拿到图片等资源、源代码等,学习神器。

2013-11-21

空空如也

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

TA关注的人

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