近來有一個需求,是需要在android java基礎(chǔ)庫中插入一些log信息,完成這個工作需要的前置條件有
編譯好的android源碼
具體android源碼如何編譯,這里筆者推薦使用cm的android源碼,里面的驅(qū)動都已經(jīng)有相應(yīng)的分支,可以支持大多數(shù)的主流機型,關(guān)于如何編譯cm的android源碼,可以參考我以前寫的博文,在android system目錄中。
android 4.0以后的源碼中關(guān)于 java基礎(chǔ)類庫的代碼在
libcore/luni/src/main/java
這個目錄下
首先找到你要插入log的java基礎(chǔ)文件,比如 java.io.File 這個文件為例子,我們想在
public File(String path)
public File(String path) {
Log("cheatecore","File String path = " + path);
this.path = fixSlashes(path);
}
插入這條log,來記錄所有的apk對文件操作的記錄,由于android.util.Log 這個類并沒有定義在java基礎(chǔ)類庫中所以需要通過jni調(diào)用的方式來完成這個任務(wù)。
步驟1在File.java 這個文件中添加下面的語句
private static final int LOG_ID_MAIN = 0; private static final int DEBUG = 3; public static int Log(String tag,String msg) { return println_native(LOG_ID_MAIN,DEBUG,tag,msg); } private static native int println_native(int bufID, int priority,String tag,String msg);
步驟2 參考 /Frameworks/base/core/jni/android_util_Log.cpp
這個文件中對于 println_native 這個函數(shù)的實現(xiàn),其實這個文件就是
/Frameworks/base/core/java/android/util/Log.java 這個java文件的
本地化實現(xiàn),里面自然有 println_native 這個函數(shù)的實現(xiàn),這里我們需要拷貝
這個函數(shù)到 /luni/src/main/native/java_io_File.cpp這個文件中
static jint android_util_Log_println_native(JNIEnv* env, jobject clazz, jint bufID, jint priority, jstring tagObj, jstring msgObj) { const char* tag = NULL; const char* msg = NULL; if (msgObj == NULL) { jniThrowNullPointerException(env, "println needs a message"); return -1; } if (bufID < 0 || bufID >= LOG_ID_MAX) { jniThrowNullPointerException(env, "bad bufID"); return -1; } if (tagObj != NULL) tag = env->GetStringUTFChars(tagObj, NULL); msg = env->GetStringUTFChars(msgObj, NULL); int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg); if (tag != NULL) env->ReleaseStringUTFChars(tagObj, tag); env->ReleaseStringUTFChars(msgObj, msg); return res; }
步驟3 /luni/src/main/native/java_io_File.cpp 文件中加入 jni動態(tài)注冊中
static JNINativeMethod gMethods[] = { { "println_native", "(IILjava/lang/String;Ljava/lang/String;)I", (void*) android_util_Log_println_native }, NATIVE_METHOD(File, listImpl, "(Ljava/lang/String;)[Ljava/lang/String;"), NATIVE_METHOD(File, readlink, "(Ljava/lang/String;)Ljava/lang/String;"), NATIVE_METHOD(File, realpath, "(Ljava/lang/String;)Ljava/lang/String;"), NATIVE_METHOD(File, setLastModifiedImpl, "(Ljava/lang/String;J)Z"), }; void register_java_io_File(JNIEnv* env) { jniRegisterNativeMethods(env, "java/io/File", gMethods, NELEM(gMethods)); }
最后一步,編譯,可以進入到 libcore 這個目錄下使用 mm命令編譯,前提是你已經(jīng)完成的編譯過一邊android源碼,如果對此還不熟悉可以參考網(wǎng)絡(luò)或者看看我以前寫的博文。
編譯生成兩個文件,一個是 core.jar,一個是 libjavacore.so,
具體位置如下
out/target/product/maguro/system/lib/libjavacore.so out/target/product/maguro/system/framework/core.jar
ok 這個時候?qū)⒆约旱氖謾C以recovery模式啟動,將這兩個文件在 /system/lib 和 system/framework/下替換掉即可
然后再開機,發(fā)現(xiàn)系統(tǒng)里面的apk凡是用到j(luò)ava File類的地方都出現(xiàn)了插入的log
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。