入门ndk
So中常用的Log输出#include<android/log.h>#define TAG "xiaojianbang"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
NDK多线程JavaVM每个进程中只有一份
JNIEnv每个线程中都有一份
//线程id,其实就是longpthread_t thread;//线程id 线程属性 函数 传递给函数的参数pthread_create(&thread, nullptr, myThread, nullptr);//等待线程执行完毕//默认的线程属性是joinable 随着主线程结束而结束//线程属性是det ...
android逆向基础
cmd常用快捷键新选项卡: ctrl+shift+d/t
划分窗格: alt+shift+d/加号/减号
关闭窗格: ctrl+shift+w
调整窗格: alt+shift+方向键
窗格切换: alt+方向键
Java位运算符右移>>4 -> 0000 01004 >> 1 -> 0000 0010
Hex编码1 byte = 8 bit每个十六进制数对应4个二进制位
数组初始化方法静态初始化元素类型[] 数组名 = new 元素类型[]{元素,元素,、、、}int[] arr = new int[]{1,2,3,4,5}int[] arr = {1,2,3,4,5}相当于int[] arr = new int[5]arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5
动态初始化元素类型[] 数组名 = new 元素类型[数组长度]int[] arr = new int[5]
二维数组定义 ...
frida相关API
hook方法的所有重载Java.perform(function(){ function showStacks(){ console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.lang.Throwable").$new() ) ); } var utils = Java.use("com.xiaojianbang.hook.Utils"); var overloadsArr = utils.getCalc.overloads; for(var i = 0; i < overloadsArr.length; i++){ overloadsArr[i].implementation = functio ...
自定义View
Canvas.drawXXX() 和 Paint 基础Canvas.drawColor(@ColorInt int color)颜色填充这是最基本的drawXXX()方法:在整个绘制区域涂上指定的颜色。
canvas.drawColor(Color.BLACK) //纯黑canvas.drawColor(Color.parseColor("#88880000")) //半透明红色
类似的方法还有drawRGB(int r, int g, int b) 和 drawARGB(int a, int r, in g, int b),它们和drawColor(color)只是使用方式不同,作用都是一样的。
canvas.drawRGB(100, 200, 100);canvas.drawARGB(100, 100, 200, 100); //第一个参数代表透明度,值越小越透明
drawCircle(float centerX, float centerY, float radius, Paint paint) 画圆前两个参数centerX、centerY是圆心的坐标,第 ...
frida之关键代码快速定位
HashMap的put方法Java.perform(function(){ function showStacks(){ console.log( Java.use("android.util.Log") .getStackTraceString( Java.use("java.util.Throwable").$new() ) ); } var hashMap = Java.use("java.util.HashMap"); hashMap.put.implementation = function(a,b){ if(a.equals("username")){ showStacks() console.log("hashM ...
SunnyWeather3
第三阶段手动刷新天气修改activity_weather.xml中的代码,如下所示:
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipeRefresh" android:layout_width="match_parent" android:layout_height="match_parent"> <ScrollView android:id="@+id/weatherLayout" android:layout_width="match_parent" android:layout_height="match_par ...
SunnyWeather2显示天气信息
显示天气信息实现逻辑层代码获取实时天气接口时返回的JSON数据格式,简化后的内容如下所示:
{ "status": "ok", "result": { "realtime": { "temperature": 23.16, "skycon": "WIND", "air_quality": { "aqi": { "chn": 17.0 } } } } }
那么我们只需要按照这种JSON格式来定义响应的数据模型即可。在logic/model包下新建一个RealtimeResponse.kt文 ...
SunnyWeather
第一阶段功能需求及技术可行性分析在开始编码之前,我们需要先对程序进行需求分析,想一想SunnyWeather中应该具备哪些功能。将这些功能全部整理出来之后,我们才好动手去一一实现。这里我认为SunnyWeather中至少应该具备以下功能:
可以搜索全球大多数国家的各个城市数据
可以查看全球绝大多数城市的天气信息
可以自由地切换城市,查看其他城市的天气
可以手动刷新实时的天气
虽然看上去只有4个主要的功能点,但如果想要全部实现这些功能,却需要用到UI、网络、数据、存储、异步处理等技术,因此还是非常考验你的综合应用能力的。不过好在这些技术在前面的章节中我们全部学习过了,只要你学得用心,相信完成这些功能对你来说并不难。
分析完了需求之后,接下来就要进行技术可行性得分析了。毫无疑问,当前最重要得问题就是,我们如何才能得到全球大多数国家得城市数据,以及如何才能获取每个城市的天气信息。比较遗憾的是,现在网上免费的天气预报接口已经越来越少,很多之前可以使用的接口也慢慢关闭了。为了能够给你提供功能强大且长期稳定的服务器接口,本书最终选择了彩云天气。
彩云天气是一款非常出色的天气预报App,本章中我 ...
Android高级技巧
高级技巧全局获取Context的技巧回想这么久以来我们所学的内容,你会发现有很多地方都需要用到Context,弹出Toast的时候 需要,启动Activity的时候需要,发送广播的时候需要,操作数据库的时候需要,使用通知的时 候需要……
或许目前你还没有为得不到Context而发愁过,因为我们很多的操作是在Activity中进行的, 而Activity本身就是一个Context对象。但是,当应用程序的架构逐渐开始复杂起来的时候, 很多逻辑代码将脱离Activity类,但此时你又恰恰需要使用Context,也许这个时候你就会 感到有些伤脑筋了。
例如,在第12章的Kotlin课堂中,我们编写了一个Toast.kt文件,并在这里对Toast的用法进行 了封装,代码如下所示:
fun String.showToast(context: Context, duration: Int = Toast.LENGTH_SHORT){ Toast.makeText(context, this, duration).show()}fun Int.showToast(contex ...
Jetpack
Jetpack简介Jetpack的家族还是非常庞大的,主要由基础、架构、行为、界面这4个部分组成。
ViewModelViewModel的一个重要作用就是可以帮助Activity分担一部分工作,它是专门用于存放与界 面相关的数据的。也就是说,只要是界面上能看得到的数据,它的相关变量都应该存放在 ViewModel中,而不是Activity中,这样可以在一定程度上减少Activity中的逻辑。
另外,ViewModel还有一个非常重要的特性。我们都知道,当手机发生横竖屏旋转的时候, Activity会被重新创建,同时存放在Activity中的数据也会丢失。而ViewModel的生命周期和 Activity不同,它可以保证在手机屏幕发生旋转的时候不会被重新创建,只有当Activity退出的 时候才会跟着Activity一起销毁。因此,将与界面相关的变量存放在ViewModel当中,这样即 使旋转手机屏幕,界面上显示的数据也不会丢失。ViewModel的生命周期如图13.2所示。
接下来就让我们通过一个简单的计数器示例来学习ViewModel的基本用法。
ViewModel的基本用法由于J ...