基于Netty实现服务端与客户端通信
个人博客
http://www.milovetingting.cn
基于Netty实现服务端与客户端通信前言本文介绍基于Netty实现的服务端与客户端通信的简单使用方法,并在此基础上实现一个简单的服务端-客户端指令通信的Demo。
Netty是什么
Netty是一个NIO客户端-服务器框架,可以快速轻松地开发网络应用程序,例如协议服务器和客户端。它极大地简化了网络编程,例如TCP和UDP套接字服务器的开发。提供一个异步事件驱动的网络应用程序框架和工具,以快速开发可维护的高性能和高可扩展性协议服务器和客户端。
以上内容摘选自https://netty.io/wiki/user-guide-for-4.x.html
Netty具有以下特点:
适用于各种传输类型的统一API-阻塞和非阻塞套接字
更高的吞吐量,更低的延迟
减少资源消耗
减少不必要的内存复制
完整的SSL / TLS和StartTLS支持
以上内容摘选自https://netty.io/
使用入门Netty的使用,可以参照Netty的官方文档,这里以4.x为例来演示Netty在服务端和客户端上使用。文档地址: ...
Gradle自定义插件发布到Maven
个人博客
http://www.milovetingting.cn
Gradle自定义插件发布到Maven前言日常开发中,我们可能会用到一些别人开发的插件,通常我们是这样引入插件的
在项目根目录下的build.gradle增加配置:
123456789101112131415161718192021buildscript { repositories { //... maven { url 'https://dl.bintray.com/milovetingting/maven' } //... } dependencies { //... classpath 'com.wangyz.plugins:ShellPlugin:1.0.0' //... }}allprojects { repositories { //.. ...
Android应用加固的简单实现方案(二)
个人博客
http://www.milovetingting.cn
Android应用加固的简单实现方案(二)前言上一篇文章介绍了基于dex加固方案的两种具体实现。相对于手动加固,基于gradle实现的加固方案效率有了进一步提升。但是,还是需要在壳Module中增加util相关工具类的引用,为进一步减少代码侵入性,在前面方案的基础上,进一步完善插件的功能。
实现原理为了避免在壳Module中引入脱壳相关的工具类,可以在aar生成后,利用ASM生成需要的class文件,然后修改aar中的classes.jar文件,将我们生成的class文件加入到classes.jar中。而壳Module的启动Application也需要在编译后修改attachBaseContext方法,加入脱壳代码的引用。这块都可以通过修改class中的方法来实现。而脱壳后,实质上还是运行apk中的代码,因此,apk中也需要对应修改以上两处。
基于以上思路,实现可以加固的一个简单插件。
源码地址:https://github.com/milovetingting/Shell
使用步骤
新建项目,再新建一个Andro ...
Android应用加固的简单实现方案
个人博客
http://www.milovetingting.cn
Android应用加固的简单实现方案概述Android应用加固的诸多方案中,其中一种就是基于dex的加固,本文介绍基于dex的加固方案。
原理:在AndroidManifest中指定启动Application为壳Module的Application,生成APK后,将壳Module的AAR文件和加密后的APK中的dex文件合并,然后重新打包签名。安装应用运行后,通过壳Module的Application来解密dex文件,然后再加载dex。
存在的问题:解密过程,会还原出来未加密的原dex文件,通过一些手段,还是可以获得未加密的dex。
实现APK和壳AAR的生成新建工程,然后新建一个Module,作为壳Module,名字随意,这里命名为shell。
在壳Module中新建继承自Application的ShellApplication,重写attachBaseContext方法,在这个方法加载原来的dex
12345678910111213141516171819202122232425262728293031323 ...
Android中ANR的触发机制-BroadcastReceiver篇
个人博客
http://www.milovetingting.cn
Android中ANR的触发机制-BroadcastReceiver篇上一篇分析了Service中的ANR触发机制,这一篇来分析BroadcastReceiver的ANR触发机制。
触发机制分析附上时序图
注册过程要分析BroadcastReceiver的ANR机制,先来看BroadcastReceiver的register过程,静态注册这里不作分析。
不管Activity还是Service中的registerReceiver,最终都是调用ContextWrapper中的registerReceiver方法
12345@Override public Intent registerReceiver( BroadcastReceiver receiver, IntentFilter filter) { return mBase.registerReceiver(receiver, filter); }
看下ContextImpl的registerRece ...
Android中ANR的触发机制-Service篇
个人博客
http://www.milovetingting.cn
Android中ANR的触发机制-Service篇概述ANR,即Application Not Responding,应用程序不响应。在Android系统中,对于事件的处理,都需要在一定的时间内完成,如果处理超时的话,就会触发ANR,弹出不响应的界面,让用户选择等待或是立即结束应用。ANR机制的简单流程:在事件发给应用处理前,会先发一个延时消息到系统的Looper中,如果应用在规定的时间内执行完成,则会移除掉延时消息。如果没有在规定时间内执行完,就会在处理延时消息中,触发ANR。
ANR主要场景:
Service
BroadcastReceiver
ContentProvider
Input:包括输入和触摸
触发机制分析下面对Service进行源码分析,源码为Android9.0。
首先从Service的启动来分析。这里只分析startService的模式,bindService模式暂时不分析。
附一张时序图
不管是通过Activity的startService还是非Activity的Context中 ...
Application中以标准模式启动Activity报错的原因分析
个人博客
http://www.milovetingting.cn
Application中以标准模式启动Activity报错的原因分析在Android中,启动的Activity都会运行在相应的任务栈中。如果直接在Application中以标准模式启动Activity,则会报出以下错误(Android7、Android8除外,后面会分析):
1234Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?at android.app.ContextImpl.startActivity(ContextImpl.java:912)at android.app.ContextImpl.startActivity(ContextImpl.java:888)at android.content.ContextWrapper.startActivity(ContextWrapper.jav ...
Android中插件化的简单实现:启动未注册的Activity
个人博客
http://www.milovetingting.cn
Android中插件化的简单实现:启动未注册的Activity前言本文介绍在Android中启动未在AndroidManifest中注册的Activity的一个解决方案。主要需要掌握以下知识点:
反射
类加载
Activity的启动过程
Resource加载过程
启动应用内未注册的ActivityActivity默认都需要在AndroidManifest中注册,未注册的应用无法启动。AMS在启动应用时,会检测是否已经注册。因此,如果想要启动未注册的Activity,那么需要在Activity前,替换启动应用的Intent为已经注册过的Activity,因此可以新建一个Activity,用于占位。在检测通过后,真正启动Activity前再替换回需要启动的未注册的Activity。
获取替换Intent的Hook点调用startActivity方法后,最后都会在Instrumentation的execStartActivity方法中调用AMS的远程方法进行处理。Android6.0及以下和Android6. ...
Android中网络框架的简单封装
个人博客
http://www.milovetingting.cn
Android中网络框架的简单封装前言Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能。访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库。由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架。如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做。
封装网络框架在架构设计中,面向接口和抽象,是解耦的一个重要原则。本文将基于这一原则,实现一个简单的网络框架封装。
定义网络访问的接口抽取出不同网络框架的共同方法,定义成接口方法。
123456789101112131415161718192021public interface IHttpLoader { /** * GET方式请求 * * @param url * @param params * @param ca ...
使用APT实现Android中View的注入
个人博客
http://www.milovetingting.cn
使用APT实现Android中View的注入前言APT是Annotation Processing Tool的简写,通过在Java编译时期,处理注解,生成代码。APT在ButterKnife、Dagger2等框架中都有应用。下面通过使用APT,实现一个类似ButterKnife的简单的View注入的框架。(参考Jett老师的课程)
ButterKnife的实现原理既然准备实现类似ButterKnife的框架,那么我们就需要了解ButterKnife的实现原理。
ButterKnife的使用是从ButterKnife.bind()开始的:
12345@NonNull @UiThread public static Unbinder bind(@NonNull Activity target) { View sourceView = target.getWindow().getDecorView(); return bind(target, sourceView); }
可以看到, ...