Smali
Smali汇编了解安卓虚拟机Dalvik虚拟机JIT(Just-In-Time Compile 即时编译),高频率使用代码空闲时间编译好并存储到内存
Art虚拟机AOT(Ahead-Of-Time 预先编译) 一次编译好,oat文件
头文件定义与接口实现(“<>”表示可选)
.class作用:定义类,包括包名和类名
格式:.class <访问权限> [关键修饰字] <完整类名> (“<>”表示可选)
.super作用:定义所属父类
格式:.super <父类完整类名>
.source作用:指定该smail代码所属java源文件
格式:.source <java源代码名称>
.implements作用: 声明实现接口类名称
格式:.implements <接口类名>
静态变量作用:相当于全局变量,跟类实例没关系,属于类
格式:.field <访问权限> static [修饰词] <字段名> : <变量类型>
.field <访问权限> stat ...
ELF
定义Linux平台的一种可执行文件格式,Executable and Linkable Format(可执行 和 可链接 格式 )
的文件
特点C/C++语言编译生成,动静态。x86汇编、arm汇编。执行速度快,逆行成本高。
生成方式//call ndk-build.cmd NDK_PROJECT_PATH=. NDK_APPLICATION_MK=jni\\Application.mk//Application.mk、 Android.mk、xx.c源文件gcc test.c -c test.o && gcc test.c -o test
Main.java
package com.pediy.test;public class Main { public static void main(String[] args) { String soPath = "so/libhello-jni.so"; ParseSo parseSo = new ParseSo(soPath); ...
Dex完整代码解析
DexFile.h/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND ...
Dex代码解析1
代码解析Dex文件Android源码:http://androidxref.com/6.0.1_r10/xref/frameworks/base/core/java/android/app/ActivityThread.java
Android文档:https://source.android.com/docs/core/runtime/instruction-formats?hl=zh-cn
搜索DexHeader
try、catch、finally三个语句的执行顺序
如果 try 块中没有异常抛出,程序会直接跳过 catch 块,执行 finally 块。如果 try 块中有异常抛出,并且有匹配的 catch 块处理该异常,先执行匹配的 catch 块,然后执行 finally 块。如果 try 块中有异常抛出,但没有匹配的 catch 块处理该异常,先执行 finally 块,然后将异常抛出至上层调用栈。
System.arraycopy 方法
//System.arraycopy 是 Java 中用于复制数组内容的方法。它的签名如下:public static void a ...
Dex文件基本结构
Dex文件基本结构Dex文件介绍含义:专门位移动端开发的一种可执行文件格式
优点:比class文件体积小,真内存小,加载速度快,堆栈加载速度快,类查找快等,更适合手机
生成://javac c\b\a\HelloWorld.java
//dx –dex –output = c\b\a\HelloWorld.dex c\b\a\HelloWorld.class//这是旧版本的Android SDK写法
反编译smali
https://source.android.com/docs/core/runtime/instruction-formats?hl=zh-cn
https://source.android.com/docs/core/runtime/dex-format?hl=zh-cn
其他名词解释:
odex(5.0引入)、oat(elf,包含 odex内容)、vdex(8.0引入)
png文件格式的
生成代码如下图
注意下生成.dex的代码:1、要根据Android SDK的版本选择不同的命令
...
APK基本结构
APK文件构成没有aidl文件的解决方法:在build.gradle中添加如下代码:
android{ buildFeatures { aidl = true }}
DexClassLoader
DexClassLoader(参数1,参数2,参数3,参数4);参数1:要加载的Jar的路径参数2:缓存目录参数3:Native目录,可以为空参数4:父类加载器
静态资源文件不需要编译的文件夹:assets
assets目录的添加方法:
MainActivity.java,部分代码
findViewById(R.id.btn_startLoad).setOnClickListener(new View.OnClickListener(){ AssetManager assetManager = MainActivity.this.getAssets();//通过获取MainActivity实例的AssetManager对象,使我们能够访问和管理Android应用程序中包含的原始资产文件。 ...
Android开发基础练习--四种方式遍历SDCard
四种方式遍历SDCard一、java语言首先都要在清单文件中申请读、写、管理SDCard的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.INTERNET"/>
activity_main.xml,部分代码
<Button android:id="@+id/btn_start" android:layout_width=& ...
Android开发基础总结--NDK编程
NDK定义:NDK编程指的是使用Android Native Development Kit(NDK)进行开发,它允许开发者使用C和C++等原生编程语言来编写Android应用的部分代码,通常是处理性能要求高或者需要直接访问设备硬件的功能
JNI函数命名规则Java + 包名 + 类名 + 函数名(以_间隔),Eg:Java_a_b_c_ndk_MainActivity_getLength
Java_a_b_c_ndk_MainActivity_getLength(JNIEnv *env, jobject thiz, jstring param){}/*每个参数的含义JNIEnv env:JNIEnv 是一个指向JNI环境的指针,它提供了一系列的JNI函数和数据结构,用于在Java虚拟机(JVM)中操作Java对象、调用Java方法、异常处理等。通过 env 参数,本地代码能够与JVM进行交互,执行JNI操作。jobject thiz:jobject 是JNI中的一个泛型类型,表示一个Java对象的引用。在本例中,thiz 参数代表了调用本地方法的Java对象的引用 ...
Android开发基础总结--Binder
Binder服务端在清单中申请权限
application外
<uses-permission android:name="android.permission.IINTERNET"></uses-permission>
application内
<service android:name=".MyService" android:exported="true" android:enabled="true"//用于指定一个组件是否启用(可用)。它通常用于表明组件是否可以响应用户交互操作,如点击或者触摸等。 android:process=":server">//android:process 是一个用于指定组件应该运行的进程名称的属性。在 Android 中,默认情况下,所有的组件(活动、服务、接收器等)都在应用的主进程中运行。这意味着它们共享同一个进程空间和资源。通过设置 android:process 属性 ...
Android开发基础总结--sdcard && Binder
读写SDCardAndroid高版本不能使用http协议,需要在清单文件中添加(application内)
android:usesCleartextTraffic="true"<!--这个属性用于指示应用是否允许使用明文网络流量,即未加密的网络请求,比如 HTTP 请求。-->
在清单文件里面申请使用网络权限、读SD卡的权限、写SD卡的权限、管理SD卡的权限
<uses-permission android:name="android.permisson.INTERNET"></uses-permission><uses-permission android:name="android.permisson.READ_EXTERNAL_STORAGE"></uses-permission><uses-permission android:name="android.permisson.WRITE_EXTERNAL_STORAGE">& ...