真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

為androidjava基礎(chǔ)庫插入log

近來有一個(gè)需求,是需要在android java基礎(chǔ)庫中插入一些log信息,完成這個(gè)工作需要的前置條件有
編譯好的android源碼

具體android源碼如何編譯,這里筆者推薦使用cm的android源碼,里面的驅(qū)動(dòng)都已經(jīng)有相應(yīng)的分支,可以支持大多數(shù)的主流機(jī)型,關(guān)于如何編譯cm的android源碼,可以參考我以前寫的博文,在android system目錄中。

10年積累的做網(wǎng)站、網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先制作網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有華陰免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

android 4.0以后的源碼中關(guān)于 java基礎(chǔ)類庫的代碼在
libcore/luni/src/main/java
這個(gè)目錄下

首先找到你要插入log的java基礎(chǔ)文件,比如 java.io.File 這個(gè)文件為例子,我們想在

public File(String path)
    public File(String path) {
    Log("cheatecore","File String path = " + path);
        this.path = fixSlashes(path);
    }

插入這條log,來記錄所有的apk對文件操作的記錄,由于android.util.Log 這個(gè)類并沒有定義在java基礎(chǔ)類庫中所以需要通過jni調(diào)用的方式來完成這個(gè)任務(wù)。

步驟1在File.java 這個(gè)文件中添加下面的語句

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
這個(gè)文件中對于 println_native 這個(gè)函數(shù)的實(shí)現(xiàn),其實(shí)這個(gè)文件就是
/Frameworks/base/core/java/android/util/Log.java 這個(gè)java文件的
本地化實(shí)現(xiàn),里面自然有 println_native 這個(gè)函數(shù)的實(shí)現(xiàn),這里我們需要拷貝
這個(gè)函數(shù)到 /luni/src/main/native/java_io_File.cpp這個(gè)文件中

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動(dòng)態(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));
}

最后一步,編譯,可以進(jìn)入到 libcore 這個(gè)目錄下使用 mm命令編譯,前提是你已經(jīng)完成的編譯過一邊android源碼,如果對此還不熟悉可以參考網(wǎng)絡(luò)或者看看我以前寫的博文。


編譯生成兩個(gè)文件,一個(gè)是 core.jar,一個(gè)是 libjavacore.so,
具體位置如下

out/target/product/maguro/system/lib/libjavacore.so
out/target/product/maguro/system/framework/core.jar

ok 這個(gè)時(shí)候?qū)⒆约旱氖謾C(jī)以recovery模式啟動(dòng),將這兩個(gè)文件在 /system/lib 和 system/framework/下替換掉即可

然后再開機(jī),發(fā)現(xiàn)系統(tǒng)里面的apk凡是用到j(luò)ava File類的地方都出現(xiàn)了插入的log


分享文章:為androidjava基礎(chǔ)庫插入log
轉(zhuǎn)載來源:http://weahome.cn/article/ipjpij.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部