持久化技术
持久化技术持久化技术简介数据持久化就是指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或计算机关机 的情况下,这些数据仍然不会丢失。保存在内存中的数据是处于瞬时状态的,而保存在存储设 备中的数据是处于持久状态的。持久化技术提供了一种机制,可以让数据在瞬时状态和持久状 态之间进行转换。
文件存储文件存储是Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,所有数 据都是原封不动地保存到文件当中的,因而它比较适合存储一些简单的文本数据或二进制数 据。如果你想使用文件存储的方式来保存一些较为复杂的结构化数据,就需要定义一套自己的 格式规范,方便之后将数据从文件中重新解析出来。
将数据存储到文件中Context类提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。接收两个参数:第一个参数是文件名,不能包含路径;第二个参数是文件的操作模式,主要有MODE_PRIVATE和MODE_APPEND两种模式可选,默认是MODE_PRIVATE,表示当指定相同文件名的时候,所写入的内容将会覆盖原文件中的内容,而MODE_APPEND则表示文件已 ...
探究BroadcastReceiver
BroadcastReceiver广播机制简介Android中的每个应用程序都可以对自己 感兴趣的广播进行注册,这样该程序就只会收到自己所关心的广播内容,这些广播可能是来自 于系统的,也可能是来自于其他应用程序的。而接收广播的方法则需要引入一个新的概念—— BroadcastReceiver。
BroadcastReceiver的具体用法将会在下一节介绍,这里我们先来了解一下广播的类型。 Android中的广播主要可以分为两种类型:标准广播和有序广播。
标准广播(normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的 BroadcastReceiver几乎会在同一时刻收到这条广播消息,因此它们之间没有任何先后顺 序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播(ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻 只会有一个BroadcastReceiver能够收到这条广播消息,当这个BroadcastReceiver中的 逻辑执行完毕后,广播才会继续传递。所以此时的BroadcastRecei ...
探究Fragment
FragmentFragment是什么Fragment是一种可以嵌入在Activity中的UI片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用得非常广泛。
Fragment的使用方式首先创建一个平板模拟器,接着新建一个FragmentTest项目
Fragment的简单使用方法先写一个最简单的Fragment实例来练练手。在一个Activity当中添加两个Fragment,并让这两个Fragment平分Activity的空间
新建一个左侧Fragment的布局left_fragment.xml,代码如下
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> < ...
UI开发的点点滴滴
UI开发常用控件的使用方法TextView下面我们就来看一看TextView的更多用法,将activity_main.xml的代码改成如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:text ...
Activity
ActivityActivity是什么Activity是最容易吸引用户的地方,它是一种可以包含用户界面的组件,主要用于和用户进行交 互。一个应用程序中可以包含零个或多个Activity,但不包含任何Activity的应用程序很少见, 谁也不想让自己的应用永远无法被用户看到吧
Activity的基本使用方法到现在为止,你还没有手动创建过Activity呢,因为第1章中的MainActivity是Android Studio 自动帮我们创建的。手动创建Activity可以加深我们的理解,因此现在是时候自己动手了。选择“Add No Activity”
手动创建Activity现在右击com.example.activitytest包→New→Activity→Empty Activity,会弹出一个创建 Activity的对话框,我们将Activity命名为FirstActivity,并且不要勾选Generate Layout File 和Launcher Activity这两个选项
勾选Generate Layout File表示会自动为FirstActivity创建一个对应的布局文件, ...
kotlin
变量valval(value的简写)用来声明一个不可变的变量,这种变量在初始赋值之后就再也不能重新赋 值,对应Java中的final变量。
varvar(variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再被重新 赋值,对应Java中的非final变量。
fun main(){ val a=10 println("a = " + a)}
显示的进行变量声明val a: Int = 10
函数语法规则fun methodName(param1: Int, param2: Int): Int{ return 0}
函数名后面紧跟着一对括号,里面可以声明该函数接收什么参数,参数的数量可以是任意多个,例如上述示例就表示该函数接收两个Int类型的参数。参数的声明格式是“参数名: 参数类型”,其中参数名也是可以随便定义的,这一点和函数名类似。如果不想接收任何参数,那么写一对空括号就可以了
参数括号后面的那部分是可选的,用于声明该函数会返回什么类型的数据,上述示例就表示该函数会返回一个Int类 ...
so
枚举各种
通过枚举导入表,可以得到出现在导入表中的函数地址
var imports=Module.enumerateImports("libxiaojianbang.so");for(let i=0;i<imports.length;i++){ console.log(JSON.stringify(imports[i]));}
通过枚举导出表,可以得到出现在导出表中的函数地址
var exports=Module.enumerateExports("libxiaojianbang.so");for(let i=0;i<exports.length;i++){ console.log(JSON.stringify(exports[i]));}
通过枚举符号表,可以得出出现在符号表中的函数地址
var symbol=Module.enumerateSymbols("libencryptlib.so");for(let i=0;i<symbol.length; ...
密码学进阶
MD5MD5对明文的处理C实现MD5算法的使用MD5.h#pragma once//// Created by Administrator on 2021-07-28.////在一些情况下,反斜杠 \ 可以用作行连接符,用于将代码行连接在一起。换句话说,如果你想在一行代码上换行而不终止该行,可以在行末添加一个反斜杠。#ifndef HOOKDEMO_MD5_H#define HOOKDEMO_MD5_Htypedef struct { unsigned int count[2]; unsigned int state[4]; unsigned char buffer[64];} MD5_CTX;#define F(x,y,z) ((x & y) | (~x & z))#define G(x,y,z) ((x & z) | (y & ~z))#define H(x,y,z) (x^y^z)#define I(x,y,z) (y ^ (x | ~z))#define ROTATE_LEFT(x,n) ((x <&l ...
NDK开发
NDK介绍
NDK与Java工程的区别
第一个NDK工程
so中常用的Log输出
NDK多线程简介
JNI_OnLoad
JavaVM
JNIEnv
so相关的几个概念
so函数注册
so之间的相互调用
so路径的动态获取
通过jni创建Java对象
//1、找类//2、得到方法id//3、创建对象jclass clazz = env->FindClass("com/xiaojianbang/ndk/NDKDemo");jmethodID methodID = env->GetMethodID(clazz,"<init>","()V");jobject ReflectDemoOjb = env->NewObject(clazz,methodID);LOGD("ReflectDemoObj %p",ReflectDemoObj);
通过jni访问Java属性
jmethodID methodID = env->GetMethodID(clazz,"<in ...
密码学
h5App的逆向
PC端的谷歌浏览器进入chrome://inspect/#devices
hook修改WebView为可调试Java.perform(function(){ var WebView = Java.use('android.webkit.WebView'); WebView.$init.overload('android.content.Context').implementation = function(a){ console.log("WebView.$init is called!"); var retval = this.$init(a); this.setWebContentsDebuggingEnabled(true); return retval; } WebView.$init.overload('android.content.Context& ...