您好,登錄后才能下訂單哦!
近來有一個需求,是需要在android java基礎庫中插入一些log信息,完成這個工作需要的前置條件有
編譯好的android源碼
具體android源碼如何編譯,這里筆者推薦使用cm的android源碼,里面的驅動都已經有相應的分支,可以支持大多數的主流機型,關于如何編譯cm的android源碼,可以參考我以前寫的博文,在android system目錄中。
android 4.0以后的源碼中關于 java基礎類庫的代碼在
libcore/luni/src/main/java
這個目錄下
首先找到你要插入log的java基礎文件,比如 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基礎類庫中所以需要通過jni調用的方式來完成這個任務。
步驟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 這個函數的實現,其實這個文件就是
/Frameworks/base/core/java/android/util/Log.java 這個java文件的
本地化實現,里面自然有 println_native 這個函數的實現,這里我們需要拷貝
這個函數到 /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動態注冊中
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命令編譯,前提是你已經完成的編譯過一邊android源碼,如果對此還不熟悉可以參考網絡或者看看我以前寫的博文。
編譯生成兩個文件,一個是 core.jar,一個是 libjavacore.so,
具體位置如下
out/target/product/maguro/system/lib/libjavacore.so out/target/product/maguro/system/framework/core.jar
ok 這個時候將自己的手機以recovery模式啟動,將這兩個文件在 /system/lib 和 system/framework/下替換掉即可
然后再開機,發現系統里面的apk凡是用到java File類的地方都出現了插入的log
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。