中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

為android java基礎庫插入log

發布時間:2020-06-27 21:39:54 來源:網絡 閱讀:1102 作者:sunzeduo 欄目:移動開發

近來有一個需求,是需要在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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

麟游县| 大安市| 增城市| 灵武市| 山西省| 剑川县| 德安县| 建昌县| 巴马| 许昌市| 呼和浩特市| 白山市| 美姑县| 金寨县| 江北区| 扶余县| 龙门县| 巫山县| 连平县| 肇庆市| 柯坪县| 曲阳县| 连山| 贵南县| 江阴市| 利辛县| 响水县| 建昌县| 鄂托克旗| 阿图什市| 修文县| 广水市| 阜宁县| 瓦房店市| 青河县| 田东县| 湖州市| 南城县| 瓮安县| 关岭| 新乡县|