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">& ...
Android开发基础总结--四大组件
认识安卓四大组件Activity创建一个新的界面的步骤1、通过Intent启动
Intent intent = new Intent(MainActivity.this,SubActivity02.class)
2、新的界面绑定.xml
setContentView(R.layout.activity_sub02)
3、清单文件注册新的Activity
<activity android:name=".SubActivity02"> <activity>
4、新的Activity要继承Activity
public class SubActivity02 extends Activity
Activity界面切换1、老方法(通过复写onActivityResult函数来接受返回结果),部分代码
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){ super.onActivity ...
Android基础6--NDK编程1
Android项目中创建Library模块步骤:项目名称右键->New->Moudle->Android Library
编译:
编译单独模块:选中模块->Build->Make Moudle
旧版本产出位置:模块\build\intermediates\packaged-classed\debug\
新版本产出位置:模块\build\intermediates\arr_main_jar\debug\
使用Android SDK中的dx工具生成dx位置:AndroidSDK根目录\build-tools\28.0.3\dx.bat
用法:dx.bat–dex–output=xx srcDir
set filename=test2.jarset srcDir=D:\__job\study20230717-pkgJar\pkgJarForLoad\mylibrary1\build\intermediates\aar_main_jar\debug\set dx="D:\Android SDK\build-tools\34.0.0\d8.bat ...
Android基础5
Binder功能简介用途:Binder是一种进程间通信的机制。
特点:虚拟物理设备驱动,像人血管一样,穿梭在各个组件和进程之间,多进程通信,采用C/S架构。
参与角色:
Client进程:使用服务的进程需等待Server注册后,再向ServiceManager获取服务。
Server进程:提供服务的进程。需先向ServiceManager进行注册。
ServiceManager进程:管理注册过的服务。
Binder驱动:负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理,数据包在进程之间的传递和交互等一系列底层支持。
优势安全优势:传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如Socket通信的IP地址是客户端手动填入,很容易进行伪造。Binder机制从协议本身就支持对通信双方做身份校验,为每个APP分配UID,进程的UID是鉴别进程身份的重要标志,从而大大提高了安全性。
性能优势:
共享内存:数据拷贝0次,但复杂且容易产生安全问题
Binder:数据拷贝1次,兼顾简单已用和安全问题
传统Socket/管道 ...