- 博客(173)
- 收藏
- 关注
原创 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
1946
原创 Flutter: 倒计时组件
import 'dart:async';import 'dart:math';import 'package:flutter/animation.dart';import 'package:flutter/material.dart';/// 倒计时typedef DownTimeEndListener = void Function();class DownTimeWidget extends StatefulWidget { Color clors; double widt.
2021-08-27 16:05:02
853
原创 Android:Gradle 依赖相关
一:依赖配置目前 Gradle 版本支持的依赖配置有:implementation、api、compileOnly、runtimeOnly 和 annotationProcessor1)implementation:会将依赖打包到输出(aar或apk),在编译时不会将依赖的实现暴露给其他module,也就是只有在运行时其他module才能访问这个依赖中的实现。2)api :会将依赖打包到输出(aar 或apk),这个依赖可以传递,其他 module 无论在编译时和运行时都可以访问这个依赖的实现。
2021-07-22 21:23:53
1897
2
原创 Android:自动注册组件
参考文章:https://github.com/luckybilly/AutoRegister/什么叫自动注册组件?一开始我也没有明白,现在我来解释下。组件化完成后,为了减少代码耦合,我们可以使用动态生成代码的方式写一些重复代码。什么是自动注册:当我们项目有多个moudle的时候,app作为主工程,会有多个业务moudle。我们想要将每一个业务moudle下的 XXInterface 的实现类放到一个全局的数组之中,我们应该怎么处理呢?第一个办法就是在app module下创建全局数组,.
2021-07-19 21:09:47
592
3
原创 Android:路由的实现
路由的用途使用路由是因为项目实现了组件化,组件化一般分三层,app主层,业务层,基础组件层,层层之间是向下依赖,平级之间不进行依赖,保证了分层隔离,避免代码的耦合。路由分为三个级别:初级路由,中级路由,高级路由一:初级路由:通过map保存所有的activity页面,跳转时候通过key获取对应的Activity,然后进行跳转。1)首先我们需要在基础层model里,写Router:public class MyRouter { private final static HashM...
2021-07-19 09:29:30
873
原创 Android:开机流程
流程顺序:开机 -> BootLoader(引导芯片) -> Linux Kernel -> init进程 -> JVM和SystemServer等 -> Binder线程池 和 SystemServerManager -> Launcher思维导图:口述表达:整个的开机流程,分为两个阶段,第一阶段为Linux的启动过程,第二个阶段为android的启动流程。Linux的启动过程:1)首先是用户点击开机键,芯片开始执行ROM中的预...
2021-07-04 17:13:02
1964
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
184
原创 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
147
原创 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
1824
原创 flutter:EventChannel 原生发送通知给flutter端
原生调用: EventChannelManager.onBackPressed();package com.example.flutterdemo;import java.util.HashMap;import java.util.Map;import io.flutter.plugin.common.BinaryMessenger;import io.flutter.plugin.common.EventChannel;/** * Created by malei on 5/
2021-05-17 14:38:52
1106
原创 Flutter:混合开发 MethodChannel 消息通道
1 首先我们需要再flutter端写代码(向原生发通知)Map map = new Map();map['a'] = 1;map['b'] = 1;NativeCallUtils.getNativeReslut(params : map).then((value) { setState(() { result = "${map['a']} +${map['b']} = ${value}"; });});import 'package:flutter/s
2021-05-17 14:33:45
491
原创 Flutter : 创建底部导航栏
import 'package:flutter/cupertino.dart';import 'package:flutter/material.dart';import 'package:flutter_module/FindPage.dart';import 'HomePage.dart';/** * 主页 */class MainPage extends StatefulWidget { @override _MainPageState createState() =>.
2021-02-24 14:08:00
196
1
原创 Flutter:常用组件总结
alibaba/flutter_boost:路由 install_plugin 2.0.0#app下载更新插件audio_recorder: any #录音、播放flutter_sound: ^1.1.5#录音dropdown_menu: ^1.1.0#下拉菜单simple_permissions:#权限获取easy_alert:#弹框amap_location: any #高德地图location: any #gogle位置获取barcode_scan 0.0.8#二维码识别qr_mo.
2021-02-24 11:17:59
417
原创 Flutter : Native调用flutter方法
首先,我们需要在android 代码中添加相关的逻辑package com.example.flutterhybrid;import android.os.Bundle;import android.os.StrictMode;import android.widget.Toast;import io.flutter.embedding.android.FlutterActivity;import io.flutter.plugin.common.MethodCall;import i
2021-02-24 11:14:59
661
原创 Flutter:调用原生方法,并获取返回值
首先第一步是在android的代码中,使用 MethodChannel 进行注册import android.os.Bundle;import android.os.StrictMode;import androidx.annotation.Nullable;import io.flutter.embedding.android.FlutterActivity;import io.flutter.plugin.common.MethodCall;import io.flutter.plu
2021-02-24 10:33:23
1981
原创 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
1247
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
1927
原创 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
444
原创 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
927
原创 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
1046
原创 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
297
原创 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
1512
原创 Android:注解反射+APT 的使用
前言:当我们需要对一段代码进行拦截修改的时候,我们有很多方案,最常见的是通过反射。但是反射是在运行时的工作,对性能有很大的影响,所以提出了APT技术,该技术可以在编译期对代码进行拦截,并进行修改,生成新的可执行的类。注解反射当我们使用注解的时候,大部分都是配合反射一起使用,通过反射可以轻易获取到注解上的类或者属性,然后在对该属性进行代码修改。现在让我们通过反射注解的方式对组件进行初始化工作。//通过注解生成View; private void getAllAnnotation.
2020-09-14 18:06:41
444
原创 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
745
原创 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
973
原创 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
235
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
1089
原创 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
207
原创 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
1640
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
327
原创 Rxjava的基本总结
知识问答:Observable和Flowable 的区别? Observable不支持背压,而Flowable支持背压Single和Completable的区别? 如果你使用一个单一连续事件流,即只有一个onNext事件,接着就触发onComplete或者onError,这样你可以使用Single。如果你的观察者连onNext事件都不关心,你可以使用Completable,他只有onComplete和onError两个事件:利用Actions来简化观察者。 https://.
2020-05-25 18:05:45
166
原创 Freocso的使用
Fresco库报告介绍Fresco 是一个强大的图片加载组件。使用它之后,你不需要再去关心图片的加载和显示这些繁琐的事情! 支持 Android 2.3 及以后的版本。Image Pipeline(管道)Fresco 中设计有一个叫做Image Pipeline的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2...
2020-04-07 13:13:18
273
原创 建造者模式
public class PingbackModuleNew { private HashMap<String, String> mMap = new HashMap<>(); public Builder newBuilder() { return new Builder(this); } pu...
2020-01-08 14:25:45
162
原创 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
956
原创 android 获取html标签中的内容
当我们通过webView加载一个h5页面的时候,需要获取h5页面的标签内容时候,我们需要js的工作。webview.getSettings().setJavaScriptEnabled(true); //启动jswebview.addJavascriptInterface(new InJavaScriptLocalObj(), "local_obj");这样我们就可以使用js功能了,h...
2019-12-18 09:52:27
2002
原创 网络日志打印处理
第一步:引入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
376
原创 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
161
原创 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
649
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人