Android native开发:systeom/core/libcutils

这篇具有很好参考价值的文章主要介绍了Android native开发:systeom/core/libcutils。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. android_filesystem_config.h

定义了很多AID_xxx的宏,build/tools/fs_config用来生成Android文件的。

#define AID_ROOT 0
#define AID_DAEMON
#define AID_BIN 2
#define AID_SYSTEM 1000

2. android_get_control_file.h

获取init管理的文件,path是init.rc中的文件路径,返回fd。参见klog.cpp

int android_get_control_file(const char* path);

3. android_reboot.h

通过设置property,请求init进程重启、关闭系统。

int android_reboot(unsigned cmd, int flags, const char* arg);

4. ashmem.h

封装共享内存相关函数。

	int ashmem_valid(int fd);
	int ashmem_create_region(const char *name, size_t size);
	int ashmem_set_prot_region(int fd, int prot);
	int ashmem_pin_region(int fd, size_t offset, size_t len);
	int ashmem_unpin_region(int fd, size_t offset, size_t len);
	int ashmem_get_size_region(int fd);

5. atomic.h

atomic相关的一些函数,遗留代码,不推荐使用。

6. bitops.h

对__builtin_popcount的封装,计算二进制中1的个数。

static inline int popcount(unsigned int x);

7. compiler.h

定义CC_LIKELY/CC_UNLIKELY宏,封装__builtin_expect。

#define ANDROID_API __attribute__((visibility("default")))

8. config_utils.h

对配置文件的解析、处理。

	void config_load(cnode *root, char *data);
	void config_load_file(cnode *root, const char *fn);
	cnode* config_node(const char *name, const char *value);
	cnode* config_find(cnode *root, const char *name);
	int config_bool(cnode *root, const char *name, int _default);
	const char* config_str(cnode *root, const char *name, const char *_default);
	void config_set(cnode *root, const char *name, const char *value);
	void config_free(cnode *root);

9. fs.h

文件、目录相关方法

如果path不存在,则创建。
如果path存在,加查mode和owners,如果不符合,则修改。
extern int fs_prepare_dir(const char* path, mode_t mode, uid_t uid, gid_t gid);
同上,如果不符合,不修改参,返回-1extern int fs_prepare_dir_strict(const char* path, mode_t mode, uid_t uid, gid_t gid);
extern int fs_prepare_file_strict(const char* path, mode_t mode, uid_t uid, gid_t gid);

从文件中读写一个整数。
extern int fs_read_atomic_int(const char* path, int* value);
extern int fs_write_atomic_int(const char* path, int value);

创建path指定的各级目录。
如果最后不是'/'结尾,最后一级会被当做文件名,忽略。
extern int fs_mkdirs(const char* path, mode_t mode);

10. hashmap.h

自定义Hashmap及相关操作函数。

11. iosched_policy.h

设置/获取io schedule policy。

extern int android_set_ioprio(int pid, IoSchedClass clazz, int ioprio);
extern int android_get_ioprio(int pid, IoSchedClass *clazz, int *ioprio);

12. klog.h

提供/dev/kmsg的写log方法。

void klog_set_level(int level);
void klog_write(int level, const char *fmt, ...) __attribute__ ((format(printf, 2, 3)));
void klog_writev(int level, const struct iovec* iov, int iov_count);

13. list.h

自定义list及相关操作函数。

14. log.h

#include <log/log.h>

15. memory.h

为GLIBC和WIN32声明方法:

size_t strlcpy(char *dst, const char *src, size_t size);

16. misc.h

把文件fn加载到内存中,大小为file-size + 1,通过sz返回内存大小。

extern void *load_file(const char *fn, unsigned *sz);

UID范围。

#define FIRST_APPLICATION_UID 10000
#define LAST_APPLICATION_UID 99999

17. multiuser.h

封装了user id, app id, uid, cache_gid, ext gid, ext cache gid, shared gid, share app gid获取和转换函数。

18. native_handle.h

定义native_handle结构体,以及相关创建、删除等操作函数。
native_handle定义中使用了C99扩展,可变长度数组(0长度数组zero-length-array)。根据numFds和numInts实际值,保存对应个数的data数组。

typedef struct native_handle
{
    int version;        /* sizeof(native_handle_t) */
    int numFds;         /* number of file-descriptors at &data[0] */
    int numInts;        /* number of ints at &data[numFds] */

    int data[0];        /* numFds + numInts ints */
} native_handle_t;

int native_handle_close(const native_handle_t* h);
native_handle_t* native_handle_init(char* storage, int numFds, int numInts);
native_handle_t* native_handle_create(int numFds, int numInts);
native_handle_t* native_handle_clone(const native_handle_t* handle);
int native_handle_delete(native_handle_t* h);

19. partition_utils.h

检测source指定的设备,前4096字节是否全0或者全0xff。

int partition_wiped(const char* source);

20. properties.h

操作property函数。

intproperty_get(const char* key, char* value, const char* default_value);
int8_t property_get_bool(const char *key, int8_t default_value);
int64_t property_get_int64(const char *key, int64_t default_value);
int32_t property_get_int32(const char *key, int32_t default_value);

int property_set(const char *key, const char *value);
int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);

21. qtaguid.h

对libnetd_client.so库几个方法的封装。

extern int qtaguid_tagSocket(int sockfd, int tag, uid_t uid);
extern int qtaguid_untagSocket(int sockfd);
extern int qtaguid_setCounterSet(int counterSetNum, uid_t uid);
extern int qtaguid_deleteTagData(int tag, uid_t uid);
extern int qtaguid_setPacifier(int on);

22. record_stream.h

几个辅助函数,提供从stream中读取固定大小的record功能。

struct RecordStream {
    int fd;
    size_t maxRecordLen;

    unsigned char *buffer;

    unsigned char *unconsumed;
    unsigned char *read_end;
    unsigned char *buffer_end;
};
extern RecordStream *record_stream_new(int fd, size_t maxRecordLen);
extern void record_stream_free(RecordStream *p_rs);
extern int record_stream_get_next (RecordStream *p_rs, void ** p_outRecord, 
                                    size_t *p_outRecordLen);

23. sched_policy.h

kernel CPUSETS/SCHEDTUNE 功能设置。

#include <processgroup/sched_policy.h>

24. sockets.h

获取init.rc中名为name的socket,返回fd。

int android_get_control_socket(const char* name);

封装常用socket函数。

cutils_socket_t socket_network_client(const char* host, int port, int type);
int socket_network_client_timeout(const char* host, int port, int type,
                                  int timeout, int* getaddrinfo_error);
int socket_local_server(const char* name, int namespaceId, int type);
int socket_local_server_bind(int s, const char* name, int namespaceId);
int socket_local_client_connect(int fd, const char *name, int namespaceId, int type);
int socket_local_client(const char* name, int namespaceId, int type);
cutils_socket_t socket_inaddr_any_server(int port, int type);
int socket_close(cutils_socket_t sock);
int socket_get_local_port(cutils_socket_t sock);
ssize_t socket_send_buffers(cutils_socket_t sock,
                            const cutils_socket_buffer_t* buffers,
                            size_t num_buffers);

25. str_parms.h

利用自定义Hashmap实现str_parms及相关操作。
TODO: 不知道干什么用的。

26. threads.h

废弃:
1)gettid -> android::base::GetThreadId
2)thread_store -> _Thread_local © or thread_local (C++)

// syscall(__NR_gettid);
extern pid_t gettid();

extern void*  thread_store_get(thread_store_t*  store);
extern void   thread_store_set(thread_store_t*          store,
                               void*                    value,
                               thread_store_destruct_t  destroy);

27. trace.h

atrace相关函数,以及ATRACE_TAG_xxx系列宏定义。

void atrace_setup();
void atrace_update_tags();
void atrace_set_debuggable(bool debuggable);
void atrace_set_tracing_enabled(bool enabled);

#define ATRACE_INIT() atrace_init()
#define ATRACE_GET_ENABLED_TAGS() atrace_get_enabled_tags()

void atrace_init();
uint64_t atrace_get_enabled_tags();

#define ATRACE_ENABLED() atrace_is_tag_enabled(ATRACE_TAG)
static inline uint64_t atrace_is_tag_enabled(uint64_t tag)

#define ATRACE_BEGIN(name) atrace_begin(ATRACE_TAG, name)
static inline void atrace_begin(uint64_t tag, const char* name)

#define ATRACE_END() atrace_end(ATRACE_TAG)
static inline void atrace_end(uint64_t tag)

#define ATRACE_ASYNC_BEGIN(name, cookie) atrace_async_begin(ATRACE_TAG, name, cookie)
static inline void atrace_async_begin(uint64_t tag, const char* name, int32_t cookie)

#define ATRACE_ASYNC_END(name, cookie) atrace_async_end(ATRACE_TAG, name, cookie)
static inline void atrace_async_end(uint64_t tag, const char* name, int32_t cookie)

#define ATRACE_INT(name, value) atrace_int(ATRACE_TAG, name, value)
static inline void atrace_int(uint64_t tag, const char* name, int32_t value)

#define ATRACE_INT64(name, value) atrace_int64(ATRACE_TAG, name, value)
static inline void atrace_int64(uint64_t tag, const char* name, int64_t value)

28. uevent.h

封装netlink ipc函数。文章来源地址https://www.toymoban.com/news/detail-490832.html

int uevent_open_socket(int buf_sz, bool passcred);
ssize_t uevent_kernel_multicast_recv(int socket, void *buffer, size_t length);
ssize_t uevent_kernel_multicast_uid_recv(int socket, void *buffer, size_t length, uid_t *uid);
ssize_t uevent_kernel_recv(int socket, void *buffer, size_t length, bool require_group, uid_t *uid);

到了这里,关于Android native开发:systeom/core/libcutils的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • android native hook简介

    Android中的 Native Hook是一个非常吸引人的技术节点,诱使开发人员产生绚烂多彩的想法,并带来精彩的体验。在软件调试、逆向、安全等场景中得到采用,各大知名软件公司如byte dance、baidu、tencent等都有自己的开源注入和hook项目。 本文代码来自github,只做了适当的剪裁和优化

    2024年02月11日
    浏览(42)
  • 【React Native】第一个Android应用

    Windows -- Android 你可以使用任何编辑器来开发应用(编写 js 代码),但你仍然必须安装 Android Studio 来获得编译 Android 应用所需的工具和环境 Node 版本请保持在: NodeJs 16.0 请下载 Java SE Development Kit (JDK): JDK \\\\\\\\ 安装完 NodeJs 请尽量切换 npm 镜像源 \\\\\\\\ 或使用科学上网工具 \\\\

    2024年02月03日
    浏览(43)
  • Android 13添加自定义native服务

    欢迎加入我的知识星球Android系统开发指南 欢迎关注微信公众号 无限无羡 欢迎关注知乎账号 无限无羡 native服务就是用c++写的系统服务,通过init进程启动,可以实现binder接口供client调用。 下面我们以实现一个beanserver的后台服务为例: 首先需要写一个rc文件 写服务的main函数

    2024年02月12日
    浏览(45)
  • Android Native crash触发原理及处理

    当程序执行以下操作,会触发native crash: 1)程序自己调用 abort() 函数触发,用于表示出现严重的错误或异常情况,需要终止程序执行 2)内存对齐错误或非法地址访问 3)零除错误(除数为零),浮点溢出或下溢出等 4)使用了非法的机器指令或指令参数不当而导致 5)进程试

    2024年01月15日
    浏览(31)
  • Android OpenGL 教程——Native 工程初始化

    NDK 的适用场景官方给出三点: 平台间的 App 移植 复用现有库 对软件性能要求较高的场合比如游戏等 有两种方式可以实现 native activity。 native_activity.h android_native_app_glue 由于第二种方法启用另一个线程处理回调和输入事件,NDK 的例子中就采用了这个实现方式。       NDK 工程

    2024年02月16日
    浏览(39)
  • 【React Native】运行Android时发生Required for building and installing your app on Android

    Android SDK - Required for building and installing your app on Android Versions found: N/A Version supported: 33.0.0 查看gradle-wrapper.properties内的gradle版本是否存在 可以配置为本地路径 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists distributionUrl=file:///D:/Deve

    2024年02月03日
    浏览(63)
  • Android使用WebView与Native交互的三种方式 ( 附源码 )

    javascript.html: jsToAndroid.html jsToAndroid2.html 1.JS与Native的交互 一.Android调用JS的方法 目前学习了俩种方法:1. 调用webview的loadUrl 2.调用webview的evaluateJavascript 方法说明: 1. webView.loadUrl(“javascript:callJS()”); 参数是一个字符串,说明调用了javascript中的 callJS方法 webview.evaluateJavascript(

    2024年02月11日
    浏览(60)
  • Android 内存分析(java/native heap内存、虚拟内存、处理器内存 )

    1.jvm 堆内存(dalvik 堆内存) 不同手机中app进程的 jvm 堆内存是不同的,因厂商在出厂设备时会自定义设置其峰值。比如,在Android Studio 创建模拟器时,会设置 jvm heap 默认384m , 如下图所示: 当app 进程中java 层 new 对象(加起来总和)占用的堆内存达到jvm heap 峰值时,就会抛出OOM 。

    2024年02月14日
    浏览(50)
  • Android TextView动态地加载资源文件,避免Native 层内存泄漏或内存溢出

    在 Android 中,如果使用 TextView 的 setBackgroundResource() 方法设置背景,可能会导致 Native 层内存增长。这是因为 setBackgroundResource() 方法会将资源文件(例如图片)加载到内存中,如果频繁地调用该方法,就会导致内存泄漏或内存溢出。 为了避免这种问题,可以使用 TextView 的 s

    2024年02月09日
    浏览(45)
  • 【Android】 频繁刷新 RecyclerView导致View 对象引用过多引起的Native 内存占用过大解决办法

    在 RecyclerView 中,如果频繁刷新 RecyclerView,可能会导致 Native 内存中有大量的 TextView 对象,从而导致内存占用过多的问题。以下是一些可能导致该问题的原因和解决方法: 使用 ViewHolder 在 RecyclerView 中,使用 ViewHolder 可以避免频繁创建和销毁 View 对象,从而减少内存占用。可

    2024年02月08日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包