Chendd's Blog

世界上没有什么事情是一行代码不能解决的。如果有,那就两行。

Android中的内存管理和正确的使用方式

概述

       从操作系统的角度来说,内存就是一块数据存储区域,属于可被操作系统调度的资源。现代多任务(进程)的操作系统中,内存管理尤为重要,操作系统需要为每一个进程合理的分配内存资源,所以可以从两方面来理解操作系统的内存管理机制。

第一:分配机制。为每一个进程分配一个合理的内存大小,保证每一个进程能够正常的运行,不至于内存不够使用或者每个进程占用太多的内存。

第二:回收机制。在系统内存不足打的时候,需要有一个合理的回收再分配的机制,以保证新的进程可以正常运行。回收的时候就要杀死那些正在占有内存的进程,操作系统需要提供一个合理的杀死这些进程的机制,以保证更少的副作用。

而作为一个多进程的操作系统,Android系统对内存的管理,也是有一套自己的方法的。跟PC不一样的是,Android作为一个移动操作系统,一般情况下,内存资源会比PC更少,所以就需要更加谨慎的管理内存。

MVP模式和RxAndroid结合例子

MVP是什么

       在MVC框架中,View是可以直接读取Model模型中的数据的,Model模型数据发生改变是会通知View数据显示发生相应的改变。 而在MVP中Model和View之间的没有任何联系,是两个完全独立的模块,当Model模型发生数据改变时,通过Presenter通知View视图发生相应的UI改变。 根据单一职责原则,Activity主要起到用户交互作用,也就是接收用户输入,显示请求结果。因此可以通过MVP框架模式来减轻Activity的职责。

参考博客:框架模式MVP在Android中的使用

RxAndroid是什么

       RxAndroid可以简单高度概括为“异步”。 异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。 Android 创造的 AsyncTask 和Handler ,其实都是为了让异步代码更加简洁。RxJava 的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。

Github:ReactiveX/RxAndroid
参考博客:给 Android 开发者的 RxJava详解

关于微信小程序的一些看法

       自从微信9.21公布小程序内侧,这几天各大网站论坛都在如火如荼的讨论。腾讯想做微信生态的想法已是路人皆知,但有能不能做大做好还是未知数,像腾讯之前推出的web qq桌面也是火了几天,后来又归于平静。此番腾讯在微信身上推出的小程序又有点类似百度之前推出的轻应用,即通过web的形式在微信内部打开,不需要下载安装,即开即用,不用就关闭。

       出于好奇根据微信官方的教程,搭了个hello world demo看了下,简直就是把webapp用微信打开的样子,内部还是基于webview实现的,只不过微信把他们封装了,方便调用微信相关接口进行用户管理。虽然webapp这些年一直在改进优化,但其本身的缺陷还是比较明显的,微信小程序还是拜托不了webapp的劣根性。

Android Hook框架Xposed进阶

       上一篇《Android Hook框架Xposed入门》,我们对xposed进行简单的介绍并hook自己写的登录app。这次我们对xposed进行深入的了解并hook系统应用和第三方应用。

一.API说明

  • IXposedHookLoadPackage.java
    • 方法: handleLoadPackage,这个方法用于在加载应用程序的包的时候执行用户的操作
    • 参数说明: final LoadPackageParam lpparam 这个参数包含了加载的应用程序的一些基本信息

Android Hook框架Xposed入门

一.基础知识

       Xposed是Android平台上较为出名的一个开源框架。在这个框架下,我们可以加载很多插件App,这些插件App可以直接或间接操纵普通应用甚至系统上的东西。Xposed原理上是Hook Android 系统的核心进程Zygote来达到修改程序运行过程和结果。讲到这里,可能有人会问什么是Hook?什么是Zygote?

深入了解android平台的jni(五)

注册native函数有两种方法:静态注册和动态注册。

1、静态注册方法

       根据函数名找到对应的JNI函数:Java层调用函数时,会从对应的JNI中寻找该函数,如果没有就会报错,如果存在则会建立一个关联联系,以后在调用时会直接使用这个函数,这部分的操作由虚拟机完成。 静态方法就是根据函数名来遍历java和jni函数之间的关联,而且要求jni层函数的名字必须遵循 特定的格式,其缺点在于:

  • 1)javah生成的jni层函数特别长;
  • 2)初次调用native函数时要根据名字搜索对应的jni层函数来建立关联联系,这样影响效率。

深入了解android平台的jni(四)

一、jni调用java对象

       JNI提供的功能之一是在本地代码中使用Java对象。包括:创建一个java类对象和通过函数传递一个java对象。创建一个java类对象,首先需要得到得到使用FindClass/GetObjectClass函数得到该类,然后使用GetMethodID方法得到该类的方法id,然后调用该函数。 Java 和 Native 代码之间函数调用时,如果是简单类型,也就是内置类型,比如 int, char 等是值传递(pass by value),而其它 Java 对象都是引用传递(pass by reference),这些对象引用由 JVM 传给 Native 代码。

在本地方法中调用Java对象的方法的步骤:

  • 1)获取你需要访问的Java对象的类 FindClass通过传java中完整的类名来查找java的class GetObjectClass通过传入jni中的一个java的引用来获取该引用的类型。 他们之间的区别是,前者要求你必须知道完整的类名,后者要求在Jni有一个类的引用。
  • 2)获取MethodID,调用方法 GetMethodID 得到一个实例的方法的ID GetStaticMethodID 得到一个静态方法的ID
  • 3)获取对象的属性 GetFieldID 得到一个实例的域的ID GetStaticFieldID 得到一个静态的域的ID JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数。

深入了解android平台的jni(三)

一、涉及到的jni编程知识

       Java基本类型的数组,在JNI中都是jArray的类型格式。具体类型如下:
typedef jarray jbooleanArray;
typedef jarray jbyteArray;
typedef jarray jcharArray;
typedef jarray jshortArray;
typedef jarray jintArray;
typedef jarray jlongArray;
typedef jarray jfloatArray;
typedef jarray jdoubleArray;
typedef jarray jobjectArray;

深入了解android平台的jni(二)

       Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名、引用的头文件目录、需要编译的.c/.cpp文件和.a静态库文件等。要掌握jni,就必须熟练掌握Android.mk的语法规范。

深入了解android平台的jni(一)

       android中很多Java类都具有native接口,这些接口由本地实现,然后注册到系统中。
主要的JNI代码放在以下的路径中:frameworks/base/core/jni/,这个路径中的内容被编译成库 libandroid_runtime.so,被放置在目标系统的/system/lib目录下。此外,android还有其他的 JNI库。JNI中的各个文件,实际上就是普通的C++源文件. 如果要深入了解android framework层,则必须Android Native层运行及开发机制. 这里先介绍一些native的基础知识