![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
android
文章平均质量分 60
BunnyCoffer
现在就开始吧
展开
-
anr / anr.txt文件
----- pid 4135 at 2022-02-24 23:24:42 -----Cmd line: com.example.demo066Build fingerprint: 'google/sdk_gphone_arm64/emulator_arm64:11/RSR1.201216.001/7036879:userdebug/dev-keys'ABI: 'arm64'Build type: optimizedZygote loaded classes=15748 post zygote .原创 2022-02-25 00:04:12 · 1917 阅读 · 0 评论 -
Android:Gradle 依赖相关
一:依赖配置目前 Gradle 版本支持的依赖配置有:implementation、api、compileOnly、runtimeOnly 和 annotationProcessor1)implementation:会将依赖打包到输出(aar或apk),在编译时不会将依赖的实现暴露给其他module,也就是只有在运行时其他module才能访问这个依赖中的实现。2)api :会将依赖打包到输出(aar 或apk),这个依赖可以传递,其他 module 无论在编译时和运行时都可以访问这个依赖的实现。原创 2021-07-22 21:23:53 · 1826 阅读 · 2 评论 -
Android:自动注册组件
参考文章:https://github.com/luckybilly/AutoRegister/什么叫自动注册组件?一开始我也没有明白,现在我来解释下。组件化完成后,为了减少代码耦合,我们可以使用动态生成代码的方式写一些重复代码。什么是自动注册:当我们项目有多个moudle的时候,app作为主工程,会有多个业务moudle。我们想要将每一个业务moudle下的 XXInterface 的实现类放到一个全局的数组之中,我们应该怎么处理呢?第一个办法就是在app module下创建全局数组,.原创 2021-07-19 21:09:47 · 573 阅读 · 3 评论 -
Android:路由的实现
路由的用途使用路由是因为项目实现了组件化,组件化一般分三层,app主层,业务层,基础组件层,层层之间是向下依赖,平级之间不进行依赖,保证了分层隔离,避免代码的耦合。路由分为三个级别:初级路由,中级路由,高级路由一:初级路由:通过map保存所有的activity页面,跳转时候通过key获取对应的Activity,然后进行跳转。1)首先我们需要在基础层model里,写Router:public class MyRouter { private final static HashM...原创 2021-07-19 09:29:30 · 863 阅读 · 0 评论 -
Android:开机流程
流程顺序:开机 -> BootLoader(引导芯片) -> Linux Kernel -> init进程 -> JVM和SystemServer等 -> Binder线程池 和 SystemServerManager -> Launcher思维导图:口述表达:整个的开机流程,分为两个阶段,第一阶段为Linux的启动过程,第二个阶段为android的启动流程。Linux的启动过程:1)首先是用户点击开机键,芯片开始执行ROM中的预...原创 2021-07-04 17:13:02 · 1940 阅读 · 6 评论 -
Android: 手写butterKnifer
手写butterKnifer使用了 apt 技术。APT 是一种处理注解工具,他对项目源代码进行扫描,获取注解。然后通过注解处理器对注解进行操作,生成新的class文件。apt技术使用三个技术点:annotation模块(Java Library) 该模块存放的是我们自定义的注解,是一个Java Librarycompiler模块 (Java Library) 依赖annotation模块,处理注解并自动生成代码等,同样也是Java Library。butterKnife模块 (Android...原创 2021-06-22 14:55:20 · 173 阅读 · 0 评论 -
Android:手写butterKnifer
1. gradle插件的作用:gradle插件可以在.class->.dex 对代码进行操作。可以用来加快Gradle插件打包,可以用于可重用的构建逻辑片段,可以用于做代码注入,可用于许多不同的项目和构建。Gradle官方提供了各式各样的插件,常见的就是apply plugin: ‘com.android.application’ 和 apply plugin: ‘com.android.library’,分别用于构建application和library。除了官方提供的插件,Gradle也提供了原创 2021-06-22 14:43:43 · 134 阅读 · 0 评论 -
Android:不同XML文件定义同一个组件ID会怎样?
如果两个xml布局文件,main.xml 和 two.xml :如下main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match...原创 2021-06-11 17:14:54 · 1789 阅读 · 0 评论 -
Android:判断组件是否在屏幕中可见
/** * Created by malei on 2020/12/3 * Describe:专门检查指定组件是否在屏幕内 */public class ViewCheckUtils { public static Boolean checkIsVisible(Context context, View view) { // 如果已经加载了,判断广告view是否显示出来,然后曝光 int screenWidth = getScreenMetrics(con.原创 2021-01-21 15:51:13 · 1231 阅读 · 2 评论 -
Android: 使用Rxjava处理多个串行的接口的操作方式
private void buyQidouToTicketVote(String monthTicketCount) { showLoading(); HashMap<String, String> map = ComicUtil.getCommonRequestParam(); map.put("monthTicketCount", monthTicketCount); mServerApi.rechargeUserMonthT.原创 2021-01-06 20:38:33 · 1885 阅读 · 0 评论 -
Android: 对集合的操作
public class CollectionUtils { public static boolean isNullOrEmpty(Collection<?> collection) { return collection == null || collection.size() == 0; } public static <T> boolean isNullOrEmpty(Collection<T> collection,.原创 2020-11-23 10:03:58 · 434 阅读 · 0 评论 -
Android:dex文件的创建和执行流程
javac Hello.java // 生成class文件java Hello.class //执行class文件dx --dex --output=Hello.dex Hello.class //将calss文件生成 dex文件adb push Hello.dex /sdcard/ //将dex文件推送到sd卡上adb shell dalvikvm -cp /sdcard/Hello.dex Hello //执行dex文件的对应的类首先需要...原创 2020-09-27 17:13:06 · 907 阅读 · 0 评论 -
Android : 通过ASM进行所有方法的执行时长统计 (gradle插件开发)
ASM技术的介绍:java文件会先转化为class文件,然后在转化为dex文件。而通过Gradle插件提供的Transform API,可以在编译成dex文件之前得到class文件。得到class文件之后,便可以通过ASM对字节码进行修改,即可完成字节码插桩。全局方法执行时长:首先我们需要创建一个gradle插件:第一步:修改build.gradleapply plugin: 'groovy'apply plugin: 'maven'dependencies { .原创 2020-09-17 16:52:32 · 1017 阅读 · 0 评论 -
Android:AOP之javaPoet技术
javapoet是可以快速的根据注解,然后动态生成代码的技术。首先我们需要创建一个java lib 包,然后把想要扫描的注解注册上:@Target(ElementType.METHOD)@Retention(RetentionPolicy.CLASS)public @interface MyAnnotation { int action() default 0;}第二步:创建一个java lib包,进行代码的扫描添加工作:首先 build.gradle 中需要依赖两个库:原创 2020-09-15 14:42:15 · 286 阅读 · 0 评论 -
Android:AOP 技术问题 -- AutoService注解无法生成META-INF文件
在写注解处理器时,首先就是要继承AbstractProcessor,并且按照如下步骤声明:需要在 processors 库的 main 目录下新建 resources 资源文件夹; 在 resources文件夹下建立 META-INF/services 目录文件夹; 在 META-INF/services 目录文件夹下创建 javax.annotation.processing.Processor 文件; 在 javax.annotation.processing.Processor 文件写入注原创 2020-09-15 13:56:12 · 1489 阅读 · 0 评论 -
Android:注解反射+APT 的使用
前言:当我们需要对一段代码进行拦截修改的时候,我们有很多方案,最常见的是通过反射。但是反射是在运行时的工作,对性能有很大的影响,所以提出了APT技术,该技术可以在编译期对代码进行拦截,并进行修改,生成新的可执行的类。注解反射当我们使用注解的时候,大部分都是配合反射一起使用,通过反射可以轻易获取到注解上的类或者属性,然后在对该属性进行代码修改。现在让我们通过反射注解的方式对组件进行初始化工作。//通过注解生成View; private void getAllAnnotation.原创 2020-09-14 18:06:41 · 436 阅读 · 0 评论 -
Android:使用AspectJ 检查项目中的方法执行时间
首先需要集成AspectJ1)在项目gradle中添加依赖dependencies { classpath "com.android.tools.build:gradle:3.5.2" classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.6' //aspectj }2) 在app gradle中添加配置apply plugin: 'com.android.applic原创 2020-08-19 16:11:07 · 729 阅读 · 0 评论 -
Android:代码混淆反混淆
当我们的线上代码crash的时候,获取到的crash信息是混淆后的, 我们可以通过android 自带的工具对混淆crash信息进行反混淆。可以使用<SDK目录>\tools\proguard\bin下的proguardgui.bat脚本将Crash堆栈信息还原到混淆前的状态运行proguardgui.bat脚本,然后点击ReTrace 选择mapping.txt文件,位于<module目录>/build/outputs/mapping/release 拷贝混淆后出.原创 2020-08-17 17:33:49 · 950 阅读 · 0 评论 -
Android:自定义Gradle插件(1)
1. 自定义gradle插件的意义打包流程大致分为:aapt把资源文件生成R.java文件,JavaCompiler把java文件编译成class文件,dex工具又把class文件搞成.dex文件。apkbuilder会把上述的文件打包成一个未签名的apk包。然后使用jarsinger和zipalign对apk进行签名和对齐。自定义插件以后就可以对app的打包流程进行动态的干涉。比如:自动化签名、多渠道打包。再如:编译时注解(ButterKnife,Digger)、无痕埋点等等的事情都可以干涉或者干原创 2020-07-21 16:34:35 · 226 阅读 · 1 评论 -
Android : 搭建本地和使用Maven仓库
当我们创建一个module 插件的时候,可以将该目录下的代码上传到maven仓库中。远程的仓库需要申请域名,这就不说了,我们现在创建一个本地的maven仓库。1)我们有个项目 twomodule插件工程:2)我们需要将该插件上传到本地maven仓库中,首先,我们需要在该插件的.gradle文件中,使用gradle提供的上传工具apply plugin: 'maven' //在module的gradle中,添加maven依赖//maven 上传 ( implementation 'co原创 2020-07-20 18:35:24 · 1065 阅读 · 0 评论 -
Toast的使用
public class QyToast { private static Toast mToast; /** * 仅显示最后一次的toast * @param msg */ public static void showToast(String msg){ if(mToast != null){ mToast.cancel(); } mToast = Toast.makeTe.原创 2020-07-14 16:42:47 · 198 阅读 · 0 评论 -
SimpleDraweeView 动态设置宽高
private void showView(ViewHolder holder, final ReaderComicBitmapBean.EpisodesBean.EpisodePictureBean readerItemData) { String imageURI = readerItemData.getImageUrl() + ""; int imageWidth = readerItemData.getWidth(); int imageHeig.原创 2020-07-01 10:29:25 · 1614 阅读 · 1 评论 -
沉浸式开发
//沉浸式状态栏 (状态栏需要显示,但是不占位) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Window window = getWindow(); View decorView = window.getDecorView(); int option = View.SY.原创 2020-06-30 17:16:49 · 315 阅读 · 0 评论 -
Rxjava的基本总结
知识问答:Observable和Flowable 的区别? Observable不支持背压,而Flowable支持背压Single和Completable的区别? 如果你使用一个单一连续事件流,即只有一个onNext事件,接着就触发onComplete或者onError,这样你可以使用Single。如果你的观察者连onNext事件都不关心,你可以使用Completable,他只有onComplete和onError两个事件:利用Actions来简化观察者。 https://.原创 2020-05-25 18:05:45 · 160 阅读 · 0 评论 -
Freocso的使用
Fresco库报告介绍Fresco 是一个强大的图片加载组件。使用它之后,你不需要再去关心图片的加载和显示这些繁琐的事情! 支持 Android 2.3 及以后的版本。Image Pipeline(管道)Fresco 中设计有一个叫做Image Pipeline的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2...原创 2020-04-07 13:13:18 · 265 阅读 · 0 评论 -
android studio查看依赖关系
原创 2020-03-18 15:25:18 · 534 阅读 · 0 评论 -
建造者模式
public class PingbackModuleNew { private HashMap<String, String> mMap = new HashMap<>(); public Builder newBuilder() { return new Builder(this); } pu...原创 2020-01-08 14:25:45 · 149 阅读 · 0 评论 -
android - Room的使用教程
room的集成添加依赖api 'androidx.room:room-runtime:2.2.3'annotationProcessor 'androidx.room:room-compiler:2.2.3'第一步:首先创建一个表结构:/** * Created by malei on 2019-12-20 * Describe: */@Entity(tableNa...原创 2019-12-20 15:32:00 · 946 阅读 · 0 评论 -
android 获取html标签中的内容
当我们通过webView加载一个h5页面的时候,需要获取h5页面的标签内容时候,我们需要js的工作。webview.getSettings().setJavaScriptEnabled(true); //启动jswebview.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");这样我们就可以使用js功能了,h...原创 2019-12-18 09:52:27 · 1975 阅读 · 0 评论 -
网络日志打印处理
第一步:引入Loggerapi 'com.orhanobut:logger:2.1.1'然后在application中添加初始化工作Logger.addLogAdapter(new AndroidLogAdapter());第二步:在okhttp中添加拦截机package com.example.netlib.Interceptor;import android.ut...原创 2019-12-09 14:54:00 · 362 阅读 · 0 评论 -
Toast的工具类
/** * Created by malei on 2019-12-03 * Describe:toast 弹出,每次只会弹一个,将上一个取消 */public class ToastUtil { private static SoftReference<Toast> mToast; private static Context mContext ; ...原创 2019-12-09 10:38:10 · 153 阅读 · 0 评论 -
Dialog的统一管理
首先我们需要创建一个基类Dialog,方便子dialog进行统一集成package com.example.commonlib.dialog;import android.annotation.SuppressLint;import android.app.Dialog;import android.content.Context;import android.content.C...原创 2019-12-09 10:06:58 · 623 阅读 · 0 评论 -
适配8.0的Notifaction
public class NotificationHelper { private static final String CHANNEL_ID = "qy_channel_id"; //通道渠道id private static final String CHANEL_NAME = "qy_chanel_name"; //通道渠道名称 private static ...原创 2019-12-05 15:37:59 · 207 阅读 · 0 评论 -
对URI进行切割处理办法
//这个方法可以将uri中的参数,保存到bundle中 private void gotoComicScheme(Uri uri) { try { Bundle bundle = new Bundle(); Set<String> keys = uri.getQueryParameterNames...原创 2019-11-29 17:45:08 · 393 阅读 · 0 评论 -
as 快捷键
快捷键:1)抽取成方法:⌘⌥M2)去除无效引用:^⌥O3)格式化代码:⌘⌥L4)历史打开过的文件:⌘E5)查找与替换:⌘F,⌘R6)大小写转换:⌘⇧U7)复制整行:⌘D8)删除整行:⌘⌫9)查找类 :Command + O10)全局搜索:Command + Shift + F11)打开调用层级结构:Control + Option + H12)快...原创 2019-11-25 09:46:40 · 233 阅读 · 0 评论 -
Mac-as-flutter环境配置
第一步下载代码:git clone -b beta https://github.com/flutter/flutter.git第二步配置路径在 .bash_profile 下如果没有该文件就创建:touch .bash_profile在打开该文件:open .bash_profile(然后添加futter/bin路径到其中 export PATH=/Users/malei/flutt...原创 2019-11-13 16:10:39 · 474 阅读 · 0 评论 -
MultiTypeAdapter 复杂的列表视图解决方案
1.集成implementation 'me.drakeet.multitype:multitype:3.3.0'2.简单布局示例使用MultiTypeAdapter 是没有适配器的,我们直接继承 ItemViewBinder这个类,在其中处理布局和数据的填充工作。public class TitleViewBinder extends ItemViewBinder<Ti...原创 2019-11-04 16:43:06 · 1138 阅读 · 0 评论 -
moduleProject needs to be converted to androidx.* dependencies
在创建module时,由于studio版本过高导致出现Project needs to be converted to androidx.* dependencies的问题。提供以下解决方案:方法一:把整个项目升级到AndroidX方法二:项目不升级到AndroidX步骤一:gradle.properties下添加:android.useAndroidX=trueandroid....原创 2019-11-04 10:08:35 · 7844 阅读 · 2 评论 -
项目改造 -- 多个module放在一个目录下
1)工程目录下新建librarys包2)将moudle移动到librarys包下3)修改工程目录下的settings.gradle,添加include ':app',':librarys:imageurl'//原来的应该为 include ':app', ':imageurl'4) 修改app目录下的build.gradledependencies { ...原创 2019-11-01 18:47:55 · 384 阅读 · 0 评论 -
git 的使用
第一步:我们需要设置账号的姓名和邮政号:$ git config --global user.name"xxx"$ git config --global user.email "xxxx@163.com"第二步:执行生成公钥和私钥的命令:ssh-keygen -t rsa 。 会在一个文件夹里面生成一个私钥 id_rsa和一个公钥id_rsa.pub。将公钥上传至GitHub,这样...原创 2019-10-18 23:39:36 · 134 阅读 · 0 评论