Android
文章平均质量分 83
#全家桶
这个作者很懒,什么都没留下…
展开
-
Android—HTTPS部署自签名证书
Android 作为客户端https 通信,通常需要一个SSLContext, SSLContext 需要配置一个 TrustManager,如果是双向通信,还需要一个KeyManager。KeyManager 负责提供证书和私钥,证书发给服务端校验。双向认证 TrustManager + KeyManager。TrustManager 负责校验服务端发来的证书。单向认证 TrustManager。二、Android 客户端的配置。一、生成自签名私有证书。原创 2023-02-14 18:47:06 · 1715 阅读 · 0 评论 -
Android—PMS: installPackagesLI
跟到最后发现是交给mInstaller去做的,这里的mInstaller是个Binder代理对象,具体实现在\frameworks\native\cmds\installd\InstalldNativeService.cpp。这里也去解析了资源文件等,最后都赋给了pkg这个Package对象,和Android四大组件相关的信息分别由activites、receivers、providers、services的list保存。这样,PKMS就可对外提供统一的组件信息,而不必拘泥于具体的Package。原创 2022-11-10 17:17:47 · 1376 阅读 · 0 评论 -
Android—PMS: PackageInstaller到PMS
与ActivityManager和AMS的关系类似,PMS也有一个对应的管理类PackageManager,用于向应用程序进程提供一些功能。PackageManager是一个抽象类,它的具体实现类为ApplicationPackageManager,ApplicationPackageManager中的方法会通过IPackageManager与PMS进行进程间通信,因此PackageManager所提供的功能最终是由PMS来实现的,这么设计的主要用意是为了避免系统服务PMS直接被访问。原创 2022-11-10 17:16:53 · 1878 阅读 · 0 评论 -
Android—Surface,BufferQueue
BufferQueue 是连接 Surface 和 Layer 的纽带,当上层图形数据渲染到 Surface 时,实际是渲染到了BufferQueue中的一个GraphicBuffer,然后通过Producer 把 GraphicBuffer 提交到 BufferQueue ,让 SurfaceFlinger 进行后续的合成显示工作。BufferQueueProducer通过dequeue函数来创建或获取一块可用的GraphicBuffer,并通过queue来归还绘制了数据的Graphicbuffer。..原创 2022-09-01 14:53:15 · 1380 阅读 · 0 评论 -
Android—AMS启动
我们从之前的分析知道ActivityManagerService.Lifecycle.startService传入class对象时会实例化该类对象并且调用它的onStart方法,这里我们先看ActivityManagerService.Lifecycle。可以看到AMS构造函数里面已经没有Activity相关的了,在Android10的版本已经移交给了ATMS了。将SystemServer.java中创建的SystemServiceManager对象设置到了AMS中。接下来看AMS的start()方法。..原创 2022-08-05 16:00:48 · 707 阅读 · 0 评论 -
Android—ATMS应用启动流程
应用的启动:Launcher应用点击桌面应用,应用启动。原创 2022-08-05 16:01:48 · 1189 阅读 · 0 评论 -
Android—ATMS启动
在SystemServer启动的时候会去执行run函数,函数里面有startBootstrapServices();是去启动引导级服务还有在启动这些服务之前会去启动Watchdog,它的作用就是去监听SystemServer是否发生死锁,会就把SystemServer进程杀掉。本文重点是ActivityManagerService上面是SystemServer的startBootstrapServices函数中关于ActivityManagerService的内容,......原创 2022-08-05 15:35:24 · 1026 阅读 · 0 评论 -
Android—SystemServer的启动和工作
把时间设置为1970,时区不存在,设置时区为GMT,设置system_server中binder线程的最大数量,最大值为31,准备主线程lopper,加载android_servers.so库,初始化系统上下文,创建系统服务管理--SystemServiceManager,启动引导服务,启动核心服务,启动其他服务,最后进入looper.loop。可以看到SystemServer创建了ActivityThread,并且根据ActivityThread来获取System自己的Context。......原创 2022-07-25 23:09:51 · 1303 阅读 · 0 评论 -
Android—Native层init到Java层ZygoteInit
回到上面,第二步forkSystemServer(abiList,zygoteSocketName,zygoteServer),这里面就是去创建SystemServer了,后面的文章会分析。第三步zygoteServer.runSelectLoop(abiList)主要就是去接受AMS的请求,然后会用fork创建一个新进程。我这里省略了很多addOption的调用,启动虚拟机配置了很多参数,最后JNI_CreateJavaVM参加虚拟机。所以有需要预加载的放到这个文件夹即可,不过需要考虑内存问题。...原创 2022-07-25 23:08:59 · 632 阅读 · 0 评论 -
Android—Java层与Native层对象的关联
所以javaAudioTrackFields.jniData是Java层的AudioTrack对象的mJniData属性,所以其实这里的setXXField等方法就是把Native层AudioTrack对象与Java层的AudioTrack关联到一起。可以看到这个就是一个工具类,RegisterMethodsOrDie用来动态注册JNI方法的,而FindClassOrDie和GetMethodIDOrDie就是用来获取Java层的类对象和函数对象的。我们看这个类的构造函数,这里调用了一个native方法。.原创 2022-07-22 22:22:28 · 1241 阅读 · 0 评论 -
Android_Binder—获取BpBinder到BBinder执行对应方法的过程
所以Client向ServiceManager获取了BpBinder的对象后,调用transact方法通过Client线程的IPCThreadState通信,Service进程的IPCThreadState接受到请求,进入executeCommand方法,调用BnBinder的onTransact方法(该方法具体实现在对应的BnXXService里面),onTransact方法再根据Client请求调用了对应的函数。这里调用IPCThreadState的transact方法,从前文。............原创 2022-07-18 22:57:30 · 664 阅读 · 0 评论 -
Android_Binder—BnServiceManager的作用
前文:Android—分析MediaServer解析服务的初始化和注册前文介绍了服务怎么去向BPServiceManager注册自己,BPServiceManager是一个handle值为0的BPBinder封装而成的。BPServiceManager是客户端,所以说还有服务端即BnServiceManager来获取Binder设备的这些请求数据。\frameworks\native\cmds\servicemanager\service_manager.cservice_manager主要做了三件事原创 2022-07-15 18:32:27 · 581 阅读 · 0 评论 -
Android_Binder—分析MediaServer解析服务的初始化和注册
\frameworks\av\media\mediaserver\main_mediaserver.cpp:该文件含有main函数,是可执行的文件。 初始化一个ProcessState对象 获取IServiceManager对象 调用MediaPlayerService和ResourceManagerService的instantiate方法 startThreadPool和joinThreadPool方法1.ProcessState对象以上我们注意两个重点: o原创 2022-07-12 11:03:35 · 790 阅读 · 0 评论 -
Android—多版本主要适配内容
Android 6.0(M):动态申请权限。Android 7.0(N):1.文件共享不能再使用file://这样的uri去分享访问了,会报FileUriExposedException错误(比如照片剪辑的Intent跳转),用FileProvider替代。2.Android7.0会在手机屏幕关闭的状态下,限时应用对CPU以及网络的使用。Android 8.0(O):1.引入了通知渠道。2.限制后台服务,需要声明为前台服务,即可在通知栏看到。Android 9.0(P):原创 2022-04-02 16:09:42 · 3380 阅读 · 0 评论 -
Android—WebView与JS交互
Html文件:WebView与JS交互方式:1. 前提:WebSettings webSettings = webView.getSettings();// 设置与Js交互的权限webSettings.setJavaScriptEnabled(true);webView.setWebChromeClient(new WebChromeClient(){ @Override public boolean onJsAlert(WebView view, String u原创 2021-11-24 21:49:34 · 3082 阅读 · 0 评论 -
Android—Retrofit解析
设计模式:外观模式,构建者模式,工厂模式,代理模式,适配器模式,策略模式,观察者模式Retrofit网络通信八步骤创建Retrofit实例 定义网络请求接口,并为接口中的方法添加注解 通过动态代理生成网络请求对象 通过网络请求适配器将网络请求对象进行平台适配 通过网络请求执行器,发送网络请求(call) 通过数据解析器解析数据 通过回调执行器,切换线程 用户在主线程处理返回结果@GET("/user/{user}/repos")Call<ResponseBody>原创 2021-11-24 21:41:57 · 1628 阅读 · 0 评论 -
Android—Gson原理解析
JsonElement抽象类 代表json串的某一个元素 某一个元素: JsonObject JsonArray JsonPrimitive(基本类型) JsonNull JsonElement的四个子类JsonObject、JsonArray、JsonPrimitive、JsonNullJsonPrimitive该类对Java的基本类型及其对应的对象类进行了封装。(短整长,单精双精,字符<表示为单字符字符串>,布尔)Gson对象的产生通过new G.原创 2021-11-24 21:35:02 · 2882 阅读 · 0 评论 -
Android—热修复实践
1.编译class文件点MakeProject将整个包路径还有修复好的class文件复制下来。2.class转dex我们把自己需要修复的java文件通过AS编译成class文件之后再用sdk目录下的dx.bat工具将class文件转成dex文件。打开cmd,如果你设置了环境变量,可以直接在c盘调用语句,不然你就需要把路径切换到跟dx.bat一样。比如我上面就是cdC:\Users\*****\AppData\Local\Android\Sdk\build-to...原创 2021-11-24 21:23:08 · 1350 阅读 · 0 评论 -
Android—AspectJ实践
AspectJ支持编译期和加载时代码注入Advice(通知):典型的 Advice 类型有 before、after 和 around,分别表示在目标方法执行之前、执行后和完全替代目标方法执行的代码。Joint point(连接点):程序中可能作为代码注入目标的特定的点和入口。Pointcut(切入点):告诉代码注入工具,在何处注入一段特定代码的表达式。Aspect(切面):Pointcut 和 Advice 的组合看做切面。例如,在本例中通过定义一个 pointcut 和给定恰当的...原创 2021-10-08 19:58:34 · 421 阅读 · 0 评论 -
Android—简单路由框架实践
简单路由框架实现:1.目录结构annotation和factory-compiler是两个javalibrary,分别负责接口还有APT。2.依赖关系app作为主工程依赖所有implementation project(':annotation')implementation project(':router')implementation project(':secondmodule')annotationProcessor pro...原创 2021-10-08 19:47:34 · 306 阅读 · 0 评论 -
Android—APT实践
APT可以根据注解,在编译时生成代码。1. 创建两个java library2. 依赖factory-compiler的依赖dependencies { implementation 'com.google.auto.service:auto-service:1.0-rc4' implementation project(':annotation') implementation 'com.squareup:javapoet:1.10.0' ...原创 2021-08-02 19:25:34 · 207 阅读 · 0 评论 -
Android—RecyclerView相关内容
Recycleview四级缓存mAttachedScrap(屏幕内),用于屏幕内itemview快速重用,不需要重新createView和bindView mCacheViews(屏幕外),保存最近移出屏幕的ViewHolder,包含数据和position信息,复用时必须是相同位置的ViewHolder才能复用,应用场景在那些需要来回滑动的列表中,当往回滑动时,能直接复用ViewHolder数据,不需要重新bindView。 mViewCacheExtension(自定义缓存),不直接使用,需要用户原创 2021-03-15 17:01:40 · 229 阅读 · 0 评论 -
Android—打包aar以及module依赖操作
将项目打包为aar:1、manifest文件:去掉红框内容2、Module的build.gradle文件中加上 apply plugin: 'com.android.library'3、打包:4、包位置:在其他module中导入aar包1、implementation和api的区别:api相当于之前的compile,用这种方式依赖的库,会参与编译打包过程。但是,如果第三方库以此方式依赖其他库,有可能会发生版本冲突。需要使用api("com.xxxxx.xxx..原创 2021-02-23 16:56:27 · 2828 阅读 · 1 评论 -
Android—内部存储与外部存储、保存图片到相册
内部存储:当一个应用卸载之后,内部存储中的这些文件也被删除。在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。 内部存储空间十分有限,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。Shared Preferences和SQLite数据库都是存储在内部存储空间上的。内部存储一原创 2021-01-29 14:47:55 · 4212 阅读 · 0 评论 -
Android—消息推送机制
知识点:长连接与短连接 端内与端外推送 通知与透传消息 服务保活(心跳机制)长连接和短连接消息推送需要客户端与服务端进行连接,因此分为两种方式 长连接,在TCP层握手成功后,不立即断开连接,并在此连接的基础上进行多次消息(包括心跳)交互,直至连接的任意一方主动断开连接,此过程称为一次完整的长连接。HTTP 1.1相对于1.0最重要的新特性就是引入了长连接。比如现在的即时通讯,基于XMPP、MQTT协议的消息推送。 短连接,客户端收到服务端的响应后,立刻发送FIN消息,主动释放连接原创 2021-01-16 11:44:01 · 2363 阅读 · 0 评论 -
Android—Navigation的使用
Navigation是Fragment的一个容器,用于管理Fragment。我们可以通过它实现Fragment的跳转以及传值等操作。1、先写Fragment的xml文件<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" and原创 2021-01-14 18:47:40 · 804 阅读 · 0 评论 -
Android—开发过程中的相关注意事项
查看测试机显示的内容所对应的Activity先在环境变量Path中添加sdk所在的路径。adbshelldumpsysactivity包名|findstrACTIVITYApp打包apk安装后重复启动根界面的问题设我们应用启动页面会有一个SplashActivity启动界面,经过3s跳转到主界面MainActivity。当我们点击apk文件安装app,安装完成界面点击打开按钮,点击Home键,进入系统桌面,此时app退到后台,再点击桌面上启动图标时。在bug情况下启动a......原创 2020-12-04 20:18:13 · 483 阅读 · 0 评论 -
Android—Broadcast原理
registerReceiverregisterReceiver方法有很多重载方法,但是最终的入口都是在ContextImpl中, private Intent registerReceiverInternal(BroadcastReceiver receiver, int userId, IntentFilter filter, String broadcastPermission, Handler scheduler, Context co原创 2020-11-10 13:44:13 · 457 阅读 · 0 评论 -
Android—数据持久化、SP源码
3种数据持久化:File:openFileInput(String fileName)、openFileOutput(String fileName, int mode)不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据SharedPreferences使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密,一般保存应用设置。SQLite 继承SqLiteOpenHelper类创建数据库,可以保存大量复杂的关系型数据账号密码自.原创 2020-10-30 12:22:21 · 513 阅读 · 1 评论 -
Android—Bitmap图片大小计算、压缩与三级缓存
Bitmap对象占用内存大小:bitmap.getByteCount()图片所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数。Android Bitmap使用的三种颜色格式:ALPHA_8–每个像素占1个字节,存储透明度信息,没有颜色信息。 RGB_565–每个像素占2个字节存储颜色信息,R 5位,G 6位,B 5位,能表示2^16种颜色。 ARGB_8888–每个像素占4个字节存储颜色信息,A R G B各一个字节,能表示2^24种颜色,还有一个字节存储透明度信息.原创 2020-10-26 22:08:15 · 2528 阅读 · 0 评论 -
Android—View事件分发与View子类
View的事件分发4个操作:DOWN: 当用户手指按下时 MOVE: 当用户开始滑动时 UP: 用户抬起手指 CANCEL: 取消操作,事件被无法到达时3个方法:dispatchTouchEvent() 负责将事件分发到其子View或当前View中 onInterceptTouchEvent() 仅存在与ViewGroup中,用于拦截点击事件 onTouchEvent() 完成对点击事件的处理,消耗事件。事件的传递顺序是...原创 2020-06-10 17:23:15 · 247 阅读 · 0 评论 -
Android—RxJava库知识
RXJAVA:一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。优点:异步,逻辑简洁易懂。程序要求:将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在 imageCollectorView 中。例子:new Thread() { @Override public void run() { super.run(); for (File folder : folders)转载 2020-09-17 17:42:48 · 248 阅读 · 0 评论 -
Android—Window、WindowManage、屏幕绘制及刷新
public abstract class Window { ... @Nullable public View findViewById(@IdRes int id) { return getDecorView().findViewById(id); } public abstract void setContentView(@LayoutRes int layoutResID); ...}window是一个抽象基类,它提供了一...原创 2020-08-19 14:13:48 · 1719 阅读 · 0 评论 -
Android—Binder+AIDL
BinderBinder机制优点:只需要进行一次数据拷贝,性能上仅次于共享内存。 基于C/S架构,职责明确,架构清晰,稳定性较好。 安全性好,为每个App分配UID,UID是鉴别进程身份的标志。内存映射:(一次copy的原因)Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的.原创 2020-07-15 20:08:12 · 829 阅读 · 0 评论 -
Android—ActivityThread与Handler
ActivityThreadActivityThread就是主线程或UI线程,ActivityThread的main方法是整个APP的入口。public final class ActivityThread { //... private static ActivityThread sCurrentActivityThread; public static ActivityThread currentActivityThread() { return sC原创 2020-07-14 15:52:14 · 1169 阅读 · 0 评论 -
Android—MVC、MVP、MVVM
MVC:视图(View):用户界面。 控制器(Controller):业务逻辑 模型(Model):数据保存View 传送指令到 Controller Controller 完成业务逻辑后,要求 Model 改变状态 Model 将新的数据发送到 View,用户得到反馈操作方式: 用户操作View或Controller特点:单向传输,View代码量大,业务逻辑都部署在 View。MVP:Controller改为Presenter各部分之间的通信,都是双向的。 Vie转载 2020-06-10 21:45:49 · 193 阅读 · 0 评论 -
Android—屏幕适配和卡顿优化
各自的定义:px:pixel,像素,屏幕上实际的像素点单位 dpi:dot per inch,每英寸多少点,该值越高,则图片越细腻 dp:dip,Density-independent pixel, 设备独立像素 sp:scale-independent pixel,字体大小单位。像素密度为160时,1dp = 1pxpx = dp*(dpi/160) =dp*density适配方法使用wrap_content, match_parent, weight要确保布局的灵活性并适...原创 2020-06-10 21:27:50 · 389 阅读 · 0 评论 -
Android—EventBus使用与源码分析
EventBus安卓事件发布/订阅框架事件传递既可用于Android四大组件间通讯EventBus的优点是代码简洁,使用简单,并将事件发布和订阅充分解耦在onStart进行注册,onStop进行注销。implementation 'org.greenrobot:eventbus:3.1.1'使用:定义事件Event public class MessageEvent{ public final String message; public static原创 2020-06-07 21:45:10 · 224 阅读 · 0 评论 -
Android—OkHttp同步异步请求过程源码分析与拦截器
OkHttp同步请求步骤:创建OkHttpClient,客户对象 创建Request,请求主体,在请求主体设置请求的url,超时时间等 用newCall(request)将Reuqest对象封装成Call对象,然后用Call对象的execute()发起同步请求。 execute()返回的是Response对象。可以用execute().body().toString()得到请求所返回的主体内容。val client = OkHttpClient()val request = Request.原创 2020-05-29 20:45:33 · 441 阅读 · 0 评论 -
Android—APK、JVM-Dalvik-ART
APKAPK的本质是一个zip压缩包,如果将后缀名改成.zip,就可以解压,APK 文件与 Zip 文件最大的一个不同是 APK 包含签名信息,用于保证安装包安全不被修改res文件夹:用于存放Android资源文件的目录,里面有drawable图片资源,布局文件等,这里面的文件都是被编译过的(图片除外)assets目录:用于存放需要打包到APK中的静态文件,文件没有进行编译META-INF目录:即Metadata infomation元数据(又称中介数据、中继数据,用于描述数据的数据)信息目录,原创 2020-05-28 15:16:40 · 317 阅读 · 0 评论