android 进阶
d_o_n_g2
这个作者很懒,什么都没留下…
展开
-
Android R文件分析
可以看的出当我们代码里面使用R 的时候能够直接引用到相关的静态变,静态变量都是int整数,并且不重复。编译R文件是在编译代码之前进行的,所以代码可以直接引用R文件。R文件是在编译资源的时候将工程和包所有的资源文件编译成一个final类,我贴一个简单工程的R文件,以方便大家了解。原创 2022-11-02 15:20:06 · 251 阅读 · 0 评论 -
switchhost 提示没有管理员权限?
当你确实是管理员并且以管理员身份运行还是提示这个,把360安全卫士和杀毒软件关闭再尝试下。原创 2022-09-14 11:22:23 · 268 阅读 · 0 评论 -
Android 原生导入Flutter模块
问题1:java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE原因在于导入的flutter模块的compileSdkVersion 31和targetSdkVersion 31 过高,将他调低。注意将Flutter模块里面的Flutter工程调低。位置别搞错了。flutter模块包含了.android模块也包含了一个Flutter模块将对应的sdk都调成一致吧。问题2:setting.gradle 加入这两原创 2022-06-19 14:23:54 · 962 阅读 · 0 评论 -
flutter踩坑
的确花了不少时间来说说中间遇到的问题。1、dart sdk>=2.12.0 以后 null safety自动激活。这个可以混合模式解决,也可以升级非null safety 库。注意看官方迁移教程。我这里只是图编译通过。直接用了混合模式。其一:命令里面加 --no-sound-null-safety。截个图看看其次可以用?!方式。再次在文件最上头加上//@dart=2.9 。好吧,这属于混合模式解决 null safety。话说跟kotlin很像。大佬们开发出来的东西我就不吐槽 了。2、依原创 2022-05-17 08:30:35 · 860 阅读 · 0 评论 -
flutter踩坑-Could not get unknown property ‘compileSdkVersion‘ for extension ‘flutter‘ of type Flutter
刚开始很好奇,为啥android项目的app.gradle 文件会出现这种错误。因为我对flutter版本做过升级降级操作。把fullter版本放到原来版本就行。百思不得其解。stackoverflow也说是flutter版本问题,怎么折腾都解决不了。其实思路有问题。android项目是flutter create生成的。在进行flutter升降级操作后要及时更新下android或者ios工程。我的工程是初次创建,没有什么单独原生代码,所以我直接删除再重新来一次问题解决。....原创 2022-05-16 19:37:57 · 2479 阅读 · 0 评论 -
一次flutter依赖问题解决
初学flutter和dart,对于dart依赖管理不是很清楚。今天报个这个错。Because dnetty depends on sqflite ^2.0.2 which depends on flutter from sdk, flutter from sdk is required.So, because dnetty depends on flutter from hosted, version solving failed.其实说的是 sqflite依赖flutter(sdk 依赖)但是dne原创 2022-05-16 13:56:58 · 720 阅读 · 0 评论 -
windows 环境下利用protoc 生成dart文件
1、首先需要安装protoc程序,进入网站(https://github.com/protocolbuffers/protobuf/releases)下载合适版本的Protoc,2、上述protoc是能够生成各个平台语言的文件。本次 我是生成dart文件,所以需要下载一个dart的插件。$ pub global activate protoc_plugin。3、利用命令生成相应dart文件。本次我的配置如下:protoc --dart_out=…/out/ --proto_path=./ noti原创 2022-05-13 15:49:39 · 666 阅读 · 0 评论 -
记一次居家隔离android 调试环境的问题
疫情隔离在家办公。个人电脑用的openvpn连接到公司环境。不过做的是一个IM的程序。im是用的socket协议。所以需要将手机的socket5服务器代理设置为个人电脑ip。猜测openvpn应该是已经打通了socket代理。那么问题 在于如何将个人测试机设置socket5代理服务器。步骤:1、百度adb shell settings put global socket5_proxy 代理IP地址:端口号。日了狗了,测试机权限不够。android.permission.WRITE_SECURE_SET原创 2022-05-09 10:51:30 · 834 阅读 · 0 评论 -
记一次无比坑爹的编译报错Unable to find method ‘org.gradle.api.tasks.TaskInputs.property
引入一个老的工程,结果编译报这个错。搜索谷歌,有个大佬说是插件的版本跟gradle 版本不匹配。从gradle 4.0 到5.0有个巨大升级。真心吐槽。android studio搞得这个gradle真心难配置。后来把自己插件的版本都让调到最新问题解决。太难了吧。...原创 2022-04-27 19:24:35 · 2062 阅读 · 0 评论 -
记约束布局嵌套RecyclerView的坑
正常大家知道RecyclerView布局显示一般情况只会以屏幕的大小来布局,但是约束布局会打破这种平衡。比如我项目中用了pullRecyclerView,导致尾部footer显示不出来。被约束布局布局到了屏幕外。真是坑了。暂时不去距离分析原因了。大家记住,此种情况需要特别注意就是了。...原创 2022-04-15 21:47:02 · 447 阅读 · 0 评论 -
能够自定义后缀的TextView
废话不多说。此文章大部分参考了 https://github.com/TheCodeYard/EllipsizedTextView/blob/master/ellipsizedtextview/src/main/java/com/thecodeyard/ellipsizedtextview/EllipsizedTextView.kt 。改了一个小问题。废话不多说上代码。package com.example.testapplication;import android.content.Context原创 2022-04-15 10:54:04 · 1891 阅读 · 0 评论 -
记一次 git merge的骚操作
想着把master合并到功能分支,确发现confict冲突比较多。好吧还是要放弃。自己直接骚操作把本地得功能分支引用删除了,想要屏蔽本次影响。发现未果。搜索百度,发现了get merge --abort擦,发现fatal: There is no merge to abort (MERGE_HEAD missing). 心想肯定是自己把这个MERGE_HEAD 弄没了。这下进退都不知道咋弄了。继续搜索发现了一个get reset --merge。果然把这个merge信息都擦除了。问题得到解决。这还.原创 2022-03-29 11:17:09 · 3197 阅读 · 0 评论 -
android failed to initialize editor
经常由于更新的库比较多,导致android studio xml预览功能失效,提示错误:“failed to initialize editor”,不妨试试如下方法:1、File 菜单2、Invalidate Caches/Restart原创 2022-02-14 16:53:18 · 2995 阅读 · 1 评论 -
最近项目过程中踩坑记录
1、一个View就会有一个背景,ImageView也是一样的,假设你图片边缘是白色的,你背景也是白色的,你就看不到圆角效果,但是不要直接给ImageView一个背景,而是可以给ImageView的父布局来一层背景,并且给相应弧度圆角效果。下面贴出一个适用性很强的图片圆角类。public class NiceImageView extends AppCompatImageView {private Context context;private boolean isCircle; // 是否显示为圆形,原创 2021-12-31 20:43:24 · 1141 阅读 · 0 评论 -
在不编译的前提下如何debug Application的方法
实际上,你运行app程序,然后attach app程序就行了。但是Application方法或者首页闪屏方法等你attach上已经运行完毕自然无法debug上了。当然你可以重新debug 编译。如果在不编译的前提下可以如下。我们可以首先通过adb shell am set-debug-app -w ,然后再启动进程,此时应用程序会阻塞。然后你就可以attach 应用程序了。...原创 2021-11-04 13:48:42 · 234 阅读 · 0 评论 -
apk 的so包是arm平台的能够在x86的模拟器上运行么
由于我使用了android29的 模拟器结果安装就失败了,说so 架构不支持。我理所当然认为这个是不能支持的。恰好同事的安装成功了。很奇怪,不清楚是哪儿的问题。以为你pc机的虚拟化设置的原因,都开启还是不行。求助谷歌。发现这个问题还真是针对版本,google公司已经做了些支持。结论是:android 30的x86镜像是能够支持运行包含arm架构的so的apk。来看下谷歌的更新文档。https://developer.android.com/studio/releases/emulator#support_原创 2021-10-25 17:22:27 · 1685 阅读 · 0 评论 -
ScrollingViewBehavior 源码分析
代码路径位于:com.google.android.material.appbar.AppBarLayout首先看下构造方法:分为无参和有参两种类型。有参方法主要是设置了behavior_overlapTop这个值。暂时不看这个值。 public ScrollingViewBehavior() { } public ScrollingViewBehavior(Context context, AttributeSet attrs) {原创 2021-09-01 17:18:59 · 748 阅读 · 0 评论 -
SF中DispSync.cpp源码分析
源码位置位于: /frameworks/native/services/surfaceflinger/DispSync.cpp先来看下构造方法:关键是初始化了DispSyncThread线程变量,暂时不看。看下init方法。0void DispSync::init(bool hasSyncFramework, int64_t dispSyncPresentTimeOffset) {391 mIgnorePresentFences = !hasSyncFramework;392 mPr原创 2021-08-26 14:22:02 · 315 阅读 · 0 评论 -
HWComposer源代码分析
代码路径为:/frameworks/native/services/surfaceflinger/DisplayHardware/HWComposer.cpp 代码版本为android P此类跟硬件合成Vsync信号有关系。这篇文章主要跟踪下硬件合成Vsync的过程。废话不多说,先看下构造方法。可以看到构造方法传入一个Composer,然后强转为 mHwcDevice变量。目前这个就是唯一的构造传入参数。遇到了一个新的类,android::Hwc2::Composer,这个类实现在/framew原创 2021-08-26 13:41:23 · 1035 阅读 · 0 评论 -
记一次git “unable to update local ref”的经历
完整错误日志:error: cannot lock ref 'refs/remotes/origin/bugfix/ANDROID-8909': is at 9d44757e3ac45e670f3d06a7419238a7fc01a34f but expected ce63e95a1cd0a024413eb147ca1a2dc118ad72beFrom 192.168.99.68:android/biyao-app-android ! ce63e95a1c..9d44757e3a bugfix/AN原创 2021-07-29 12:07:25 · 1038 阅读 · 1 评论 -
SurfaceView源码分析
SV继承自View,但是并不是利用View的Draw来进行绘制。而是直接跟SurfaceFlinger进行通信。那么看下具体SV是怎么实现这个功能的,它的用法如何?还是先从构造方法开始看起。 public SurfaceView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes);原创 2021-06-17 21:25:59 · 383 阅读 · 1 评论 -
SurfaceFlinger系列<一>
此为SurfaceFlinger一个系列文章,旨在通过研读SurfaceFlinger源码弄清楚SF整个业务流程。好吧,废话不多说,SF相关代码位置还是从类继承关系来看看吧。class SurfaceFlinger : public BnSurfaceComposer, private IBinder::DeathRecipient,#ifdef USE_HWC2 private HWC2::Composer原创 2021-06-09 14:51:20 · 620 阅读 · 0 评论 -
Looper源代码解析<一>
代码位置位于:aosp\system\core\libutils\Looper.cpp这个类在handler机制,SurfaceFlinger中消息调度机制都起到了关键作用。先来看下这个类的构造方法。Looper::Looper(bool allowNonCallbacks) : mAllowNonCallbacks(allowNonCallbacks), mSendingMessage(false), mPolling(false), mEpollFd(-1), mEp原创 2021-06-09 11:31:28 · 463 阅读 · 1 评论 -
Android上利用epoll机制实现手机服务器?
废话不多数。先上代码。server.cpp#include <jni.h>#include <string>#include <cmath>#include <sys/epoll.h>#include <iostream>#include <sys/socket.h>#include <sys/epoll.h>#include <netinet/in.h>#include <arpa/in原创 2021-06-08 15:08:13 · 495 阅读 · 2 评论 -
如何利用android交叉编译出能够直接在手机上运行的文件?
想必每个搞android开发的都想自己造个工具能够给自己手机使用,当然我说的是native工具。假设我们会写简单的c/c++代码,那么如何编译出适应各个平台架构的elf 可执行文件呢,废话不多说直接看代码。armv7a-linux-androideabi21-clang++ test.cpp -o test -pie -fPIE -static-libstdc++armv7a-linux-androideabi21-clang++:这个是ndk的交叉编译工具,位置位于比如说我的环境:F:\ndk\a原创 2021-06-05 19:37:53 · 529 阅读 · 4 评论 -
Retrofit 网络框架学习
最初版是在有道云笔记写的。转过来格式不对了,移步有道云笔记查看吧。http://note.youdao.com/s/50oufpSb原创 2021-03-18 15:04:22 · 86 阅读 · 0 评论 -
SparseArray和ArrayMap
Java数据结构够多了吧,为了不同角度的性能又提出了SparseArray等系列。直译就是稀疏数组。实际好多同Map还有HashMap作比较实际有啥好比较的。HashMap的key可以除开基本类型的任意类型,但是SparseArray实际的key值是int,跟ArrayList这种数组才有可比性。ArrayList就是简单利用数组来做的。SparseArray 也是利用数组,不过key是一个数组,value是一个数组。为啥要这么做,为啥体现稀疏性,来看看put和get方法便知。public void p原创 2020-10-29 20:04:34 · 221 阅读 · 0 评论 -
Glide 源码分析<二>
这一篇接着上篇。主题是如果从服务器拿到数据,然后如何setImageViewDrawable。从decodeFromRetrievedData这个方法开始。它的返回是一个Resource,传入的就是拿到的result,类型为object,这里就涉及到如何解析的算法问题。中间调用 private <Data> Resource<R> decodeFromFetcher(Data data, DataSource dataSource) throws GlideExcep原创 2020-10-28 20:45:07 · 108 阅读 · 0 评论 -
android 线程池源码分析
一直觉得这块比较复杂,原因在于需要对数据结构和多线程开发比较熟悉。现在从ThreadPoolExecutor 出发。先看这个构造函数。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,原创 2020-10-27 20:26:08 · 156 阅读 · 0 评论 -
HashTable 分析
HashTable经常拿来跟HashMap比较,今天来看看HashTable的源码。从无参构造方法出发。//初始的容量为11,装载因子为0.75。跟HashMap一样。初始化时平平无奇。 public Hashtable(int initialCapacity, float loadFactor) { if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity原创 2020-10-27 19:56:54 · 139 阅读 · 0 评论 -
Okhttp再分析<二>
再分析第二篇准备讲讲CallServerInterceptor。先OkHttp的RealConnection 说起,它主要是创建链接,创建链接分为两部分。分为createTunnel(这不是直接连接服务器,是链接的代理服务器)和connectSocket 通过socket直接连接,(socket 是实现http协议的api),主要分析createSocket吧。 /** Does all the work necessary to build a full HTTP or HTTPS connection原创 2020-10-27 19:56:10 · 139 阅读 · 0 评论 -
BlockingQueue实现类<二>
这篇文章主要讲LinkedBlockingQueue。阻塞队列使用链表来完成存储,之前分析的ArrayBlockingQueue是用数组。现在看下具体实现会有什么特点,还是从构造方法出发。 public LinkedBlockingQueue(int capacity) { if (capacity <= 0) throw new IllegalArgumentException(); this.capacity = capacity; //初始化原创 2020-10-27 19:55:46 · 141 阅读 · 0 评论 -
BlockingQueue实现类<一>
这一系列主要聚焦BlockingQueue的实现类,称之为阻塞队列,到底代表什么含义,我们不打算从注释出发,从实现类出发,第一个分析ArrayBlockingQueue。从构造方法出发。 public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = new原创 2020-10-27 19:55:17 · 377 阅读 · 0 评论 -
OkHttp再分析<一>
为啥要有再次分析OkHttp呢,因为作为android 网络底层框架,它的使用范围和稳定性都是非常高的。那么我们需要对他进行充分的熟悉。我们还是从他自身的同步和异步请求方法来分析吧,因为这个是落脚方法。位于NewCall里面。 @Override public Response execute() throws IOException { //首先锁住自身,这个synchronized是一个非重入锁。如果同一线程或者别的线程想再次调用对象的execute 方法,executed 是个布尔变量,线原创 2020-10-26 20:25:25 · 117 阅读 · 0 评论 -
ValueAnimator源码解读
ValueAnimator 是属性动画的管理类,其主要是对变量值进行回调产出,然后我们利用这个回调值做一些动画效果。一般用法如下: ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 1000,1); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public原创 2020-10-26 20:24:36 · 169 阅读 · 0 评论 -
Leakcanary 源码分析<一>
首先进到LeakCanary 类里面的初始化静态方法。 public static @NonNull RefWatcher install(@NonNull Application application) { return refWatcher(application).listenerServiceClass(DisplayLeakService.class) .excludedRefs(AndroidExcludedRefs.createAppDefaults().build原创 2020-10-26 20:23:53 · 88 阅读 · 0 评论 -
ReentrantLock源码解读
RTL 是用于管理线程并发的解决方案。接下来我们从最基本的用法来分析,为什么这个类会做到线程的原子性。一般用法 ReentrantLock rtl=new ReentranLock()。实际上内部默认的是利用非公平锁来实现。 public void lock() { sync.lock(); }此方法就是NonfairSync里面的lock()。 final void lock() { if (compareAndSetState(0, 1))原创 2020-10-21 20:35:35 · 113 阅读 · 0 评论 -
LinkedHashMap 源码分析
为啥要说到这个呢,因为它是实现LRU算法的比较方便的类,同时它的实现也依赖hashmap,而hashmap是Map里面使用最频繁的类。所以分析它非常有意义。我们可以从LRU算法角度来分析LMM的基础功能。首先温习下LRU淘汰算法:lru缓存淘汰算法:该算法师根据数据的历史访问记录来进行淘汰数据,思想,如果该数据最近倍访问过,那么将来的访问率也比较高实现思想:如果该数据已经存在我们的链表中,经过一次遍历,找到到该元素,需要将该数据放到链表的头部如果该数据不在链表中,此时链表有足够的空间,将该数据放到链原创 2020-10-20 19:36:11 · 105 阅读 · 2 评论 -
Glide 源码分析<一>
Glide是android 熟知的加载图片的框架。其用法非常简单,但是内部源码可以说拓展的非常厉害。我们先从源码角度一步一步来分析吧。基础用法: Glide.with(context).load(url).apply(options).into(imageView);其实可以分为三段,这个属于链式调用。先看第一段,初始化。Glide.with(context)。首先是获取一个RequestManagerRetriever。 Glide.get(context).getRequestManagerRe原创 2020-10-16 15:57:54 · 137 阅读 · 1 评论 -
Retrofit2<三> rxJava 分析
rxJava体系比较大,为了收缩范围还是从我实际开发用的着手。private Observable request(Observable observable, int flag) { if (flag == SINGLE) { //Observable 映射 return observable .map(this.functionSingle()) .compose(schedulersTransfo原创 2020-09-24 12:09:27 · 152 阅读 · 1 评论