Android简单回顾

Android简单回顾

 Android runtime包括一些核心库和虚拟机。另外Android的进程间通信通过binder。像一些插件就在application Framework层作文章。

组件与application

Activity:通常一个Activity就是一个单独的屏幕
BroadcastReceive:广播接收器没有用户界面
Service:具有较长的生命周期,没有用户界面,一般用于后台任务
Content Provider:用于数据共享
通过Intent进行数据传递和交互

 

Android系统自动会为每个程序运行时创建一个Application类的对象且只创建一个,即单例模式
Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期
Application onCreate方法作为程序“真正的入口点”(这里简单理解)
自定义程序的Application只需要修改AndroidManifest.xml Application标签name即可

如果观察打印日志发现函数调用顺序:

2019-06-17 15:58:19.801 18226-18226/com.example.applicationandjni I/MF: Application attachBaseContext Call
2019-06-17 15:58:19.813 18226-18226/com.example.applicationandjni I/MF: Application onCreate Call
2019-06-17 15:58:19.969 18226-18226/com.example.applicationandjni I/MF: Hello from static Method C
2019-06-17 15:58:19.969 18226-18226/com.example.applicationandjni I/MF: Hello from static Method CPP
2019-06-17 15:58:19.969 18226-18226/com.example.applicationandjni I/MF: Hello from Method C
2019-06-17 15:58:19.969 18226-18226/com.example.applicationandjni I/MF: Hello from Method CPP

说明先application的attachbaseContext再调用activity的onCreate,所以比如对activity得一些做操作,比如加密密码等加固之类的,就可以放在application。

关于修改程序加载这些组件时间,对这些顶级组件中的Context功能做延迟初始化(delay init)的处理可以参考

http://blogs.360.cn/post/proxydelegate-application.html

NDK

通过JNI(Java Native Interface)接口即能实现Dalvik虚拟机与底层的交互,参数的传递和数据的访问修改则按照接口Bridge函数进行访问控制。

C/C++通过NDK编译成.so,然后由java加载调用,so就是在application和android runtime这两层交互。

所以可以提高程序性能,但是不再跨平台,native层动态内存使用不当会泄露。

Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod。

public static native String testStaticC();

比如这样,JNI就要写耦合,怎么能将jva函数在c++描述清楚,还有比如java的类包含包名类名都要说清楚。

定义如下:
typedef struct {
const char* name;            /*Java中函数的名字*/        
const char* signature;      /*描述了函数的参数和返回值*/
void* fnPtr;               /*函数指针,指向C函数*/,真正的函数
 } JNINativeMethod;
其中比较难以理解的是第二个参数,例如
"()V”
"(II)V"
 "(Ljava/lang/String;Ljava/lang/String;)V”



实际上这些字符是与函数的参数类型一一对应的。"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func();
 "(II)V" 表示 void Func(int, int);
字符   Java类型     C类型
V      void         void
Z      jboolean     boolean
I      jint         int 
J      jlong        long 
D      jdouble      double 
F      jfloat       float
B      jbyte        byte 
C      jchar        char
S      jshort       short

要返回值因为是要先返回给虚拟机。

另外如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z”这个就是我们把他叫做内部类。

Native方法声明

JAVA层声明

public static native/public native

Native方法的调用方式与普通方法一致,但
一定要在调用前对方法注册
eg:
public static native String testStaticC(); //声明
System.loadLibrary(“test_c”); //加载Native库

注册的方法分为2中,隐式注册和显示注册

隐式注册Java_包名_类名_方法名,就是不显示填写上面的结构体。

动态注册JNI_OnLoad函数注册

static{
		System.loadLibrary("test_c");
		System.loadLibrary("test_cpp");
	}
	
	public static native String testStaticC();
	public static native String testStaticCPP();
	public native String testC();
	public native String testCPP();

一般会在static块加载c库。通过ndk-bulid编译,先配好环境变量。

c++注册的话区别于c的就是方法要extern "C"导出C语言默认导出。不然就会把参数编译到函数名里面,导致找不到,还要注意JAVA数组等j开头对象除了基本类型,都需要通过方法getobjectfield或者setobjectfield操作。动态注册一定要先把函数注册好。

APK包结构

├── AndroidManifest.xml  // manifest 文件,存放一些权限信息。
├── META-INF
│  ├── CERT.RSA           //  证书信息
│  ├── CERT.SF
│  └── MANIFEST.MF
├── classes.dex              // android java 的代码
├── lib(native的代码)
│  ├── armeabi
│  │  ├── gdbserver
│      └── libhello-jni.so  // android 的so代码

AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。
classes.dex是java源码编译后生成的Davik字节码文件
resources.arsc编译后的二进制资源文件
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全
Lib目录包含Native库文件

相关工具

Apktool: 解包/重打包APK文件
解包:java -jar apktool.jar d xxx.apk –o xxx
解包Debug: java -jar apktool.jar d –d xxx.apk –o xxx
打包:java -jar apktool.jar b xxx –o xxx.apk
注:解包Debug用于无源码smali汇编调试

比如解包一个apk就会得到

original是原始的manfest和签名信息。

Baksmali:单独解包dex/odex文件
java -jar baksmali.jar xxx.dex –o xxx
Smali:单独打包xxx.smali文件成xxx.dex
java -jar smali.jar xxx –o xxx.dex

之后要做签名。

AXMLPrinter2:反编译二进制xml文件
java -jar AXMLPrinter2.jar xxx.xml > 重定向到文件
签名:对APK文件进行签名
java -jar signapk.jar platform.x509.pem platform.pk8 xxx.apk xxx_signed.apk

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值