探究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& ...
免root使用frida
Frida自吐算法演示Java.perform(function () { function showStacks() { console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.lang.Throwable").$new() ) ); } function logOutPut(msg) { Java.use("android.util.Log").d("xiaojianbang", "frida inject: " + msg); } var ByteString = Java.use("com.android.okhttp.okio ...
objection
objection的安装
objection的使用
objection的插件