Android 7.0 APP存取log和prop行為變更


根據Android官方文件
https://developer.android.com/about/versions/nougat/android-7.0-changes.html?hl=zh-tw
Android 7.0後非系統APP, 需要使用log和prop要使用NDK開放的API, 不再提供如libcutils和libutils的存取, 在啟動APP時候會發生
dlopen failed: cannot locate symbol "__system_property_get" referenced by ...
像是下面兩個log標頭檔就應該要修改
#include<utils/Log.h>
#include<cutils/log.h>

log函數使用包含在liblog內的函數
#include<android/log.h>
int __android_log_print(int prio, const char *tag, const char *fmt, ...);
AOSP實作和定義分別在
system/core/liblog/logger_write.c
system/core/include/android/log.h

和以前用ALOG以及LOG系列函數不一樣的點在於需要自己寫priority, 因為實在太麻煩, 所以自己寫了一個AndroidLog.h方便使用
#ifndef __ANDROIDLOG_H__
#define __ANDROIDLOG_H__
#include <android/log.h>
#if LOG_NDEBUG
#define LOGV(...) ((void)0)
#else
#define LOGV(...) ((void)__android_log_print(ANDROID_LOG_VERBOSE,LOG_TAG,__VA_ARGS__))
#endif
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__))
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN,LOG_TAG,__VA_ARGS__))
#endif

prop函數使用包含在libc內的函數
#include <sys/system_properties.h>
int __system_property_get(const char *name, char *value);
int __system_property_set(const char *key, const char *value);
AOSP實作和定義分別在
bionic/libc/bionic/system_properties.cpp
bionic/libc/include/sys/system_properties.h
和之前使用的差異在於參數數目不一樣,不再有預設value的參數
以及prop key和value長度限制的Macor名稱變成了PROP_NAME_MAX和PROP_VALUE_MAX
#define PROP_NAME_MAX   32
#define PROP_VALUE_MAX  92


留言