替換Android中VM 載入動態庫方式

2021-08-27 16:40:07 字數 1323 閱讀 4021

android 載入動態庫的**在 dalvik/vm/native.cpp ( froyo 中是 native.c),載入的方式就是呼叫 libdl 中 dlopen, dlsym 這些函式

應該可以在這些函式中做些手腳,dlsym 替換為 my_dlsym 這樣就可以呼叫自己的函式

下面舉乙個例子,通常 dlopen, dlsym 使用如下

#include void* handle = dlopen("./hello.so", rtld_lazy);

typedef void (*hello_t)();

hello_t hello = (hello_t) dlsym(handle, "hello");

hello();

dlclose(handle);

我們把在另外乙個 hello1.so 提供 hello1()

#include void* handle = dlopen("./hello1.so", rtld_lazy);

typedef void (*hello_t)();

hello_t hello = (hello_t) dlsym(handle, "hello1");

hello();

dlclose(handle);

使用者依然可以得到他想要 hello 指標

同理 在 native.c 中定義

extern void *my_dlopen(const char *filename, int flag);

extern char *my_dlerror(void);

extern void *my_dlsym(void *handle, const char *symbol);

extern int my_dlclose(void *handle);

並把 native.c 相關函式,加上字首 my_, 就完全改變了 vm load 動態庫的方式

這種方式可以有多種應用方式,下面舉個栗子

比如你想做 profiling, 比如 func()

my_func()

而後在 my_dlsym 把對 symbol "func" 的呼叫替換為 my_func(), 就可以了

也許你說可以直接改 func(); 但當函式多的時候,可以在 my_dlsym中構造陣列更方便解決

也許你可以把對 bionic 呼叫,全部替換為 glibc 的,但要注意傳遞引數的 data struct 定義略有不同,還有 inline 和 巨集定義 的處理

android中webView 載入資料

可以使用loadurl 載入乙個url位址,也可以使用loaddata 或loaddatawithbaseurl 載入一段html 片段。loadurl 的使用大家應該都沒有什麼問題,但是loaddata 和loaddatawithbaseurl 在使用上的差異可能有些人還不太清楚。首先,從方法的定...

Android中的非同步載入

案例原始碼 asynctaskbythread.rar案例原始碼 整體思路 1 首先在oncreate方法中new newsasynctask 2 將url傳入,實現對此url的非同步訪問 3 先將url獲取的資料封裝到newsbean物件中,4 然後在newsasynctask類中將其設定到lis...

android中listview分頁載入資料

首先說下listview的優化方案,這也是面試中常考的題目。優化方案有三種 1,如果自定義介面卡,那麼在getview方法中判斷contentview是否為空,如果為空建立contentview並返回,如果不為空直接返回contentview。這樣能盡可能少建立view。2.給contentview...