四大组件
Activity:面向用户应用组件或者用户操作可视化界面,基于Activity基类,底层由ActivityManager统一管理,也负责处理应用内或应用间发送的Intent消息
Broadcast Receiver:接受并过滤广播信息的组件,应用想显示的接收广播信息,需在Manifest清单文件中注册一个receiver,用Intent filter过滤特定类型的广播信息/应用内通过registerReceiver在运行时动态注册
Service:通常用于处理后台耗时逻辑,用户不直接与Service对应的应用进程交互,通过IPC机制接收和发送Intent。使用Service必须在Manifest清单注册,Service可以通过Intent进行启动,停止,绑定。
Content Provider:应用程序间数据共享的组件。
APK文件结构
目录名 | 文件 | 解释 |
---|---|---|
mainfest.mf | 清单文件 | |
meta-inf目录 | cert.rsa | 应用签名文件 |
cert.sf | 资源列表及对应的SHA-1签名 | |
armeabi | 所有ARM处理器相关文件 | |
armeabi-v7a | ARMv7及以上处理器相关文件 | |
lib目录 | arm64-v8a | 所有ARMv8处理器下的arm64相关文件 |
(又称库目录) | x86 | 所有x86处理器相关文件 |
x86_64 | 所有x86_64处理器相关文件 | |
mips | MIPS处理器相关文件 | |
res目录 | 没有编译至resources.arsc中的其他资源文件 | |
assets目录 | 能通过AssetManager访问访问到的资源文件 | |
AndroidManifest.xml | Android组件清单文件,包括应用名称,版本,权限等信息,以二进制XML文件格式存储,通过apktool,AXMLPrinter2等工具转换成XML明文格式 | |
classes.dex | Android运行时可执行文件 | |
resources.arsc | 包含编译好的部分资源文件 |
Dex文件格式
Dex文件包含该可执行文件所有Java代码
hearder部分包含文件大小,校验码,各数据类型表的偏移和大小等数据
string表:每一表项都指向一个string数据偏移。string数据由两部分组成,起始位置为uleb128算法编码的变长string长度,后面紧跟string具体数据,由'\0'结尾
type表:存储各type在string表中的索引
proto表:每项包含3个元素,分别为函数原型简写,返回类型索引,参数偏移,参数偏移处第一个元素类型为uint,表示参数个数
field表:每个表项用3个元素描述一个变量,分别为该变量所属的类,该变量所属类型和该函数名字
method表:每个表项用3个元素描述一个函数,分别为该函数所属类,该函数原型和该函数名
class表:每个表项用8个元素来描述一个函数,分别为类名,类属性access flag,父类偏移,接口偏移,源文件索引,类注释,类数据偏移,静态变量偏移
maps表:保存上述各表大小和起始偏移,系统能够通过该表快速定位到各表
Java代码演示
Android编程语言由Java,在2017年5月修改为Kotlin,Android入口函数为onCreat函数,
AndroidMainfest.xml文件包括该应用的入口,权限,可接受参数,最低支持API版本和编译使用API版本
public class MainActivity extends ActionBarActivity{
/** Called when the activity is first created. */
public void onCreat(Bundle savedInstanceState){
super.onCreat(savedInstanceState);
setContentView(R.layout.activity_main);
Log.i("CTF","Hello world Android");
}
}
AndroidMainfest.xml
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package = "com.ctf.test">
<user-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<user-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:supportRtl = "true"
android:theme = "@style/AppTheme">
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
<intent-filter>
</activity>
</application>
</manifest>
标签:文件,string,Base,偏移,处理器,Android,函数
From: https://www.cnblogs.com/N1ng/p/18471123