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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章