精华内容
下载资源
问答
  • Android Native层使用opengl es渲染yuv420,通过egl绑定android的surface,直接在native层进行渲染 具体使用见http://blog.csdn.net/lidec/article/details/73732369#comments
  • Android Native Service

    2015-02-05 17:53:13
    Android Native Service
  • 主要介绍了Android Native 内存泄漏系统化解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Android native 层代码内存泄漏问题调试利器
  • Android Native

    千次阅读 2019-07-28 15:16:50
    android native层是 相对于Java 层的底层,一般用c++开发 Java框架层就是常说的Framework,这层里东西很多也很复杂,比如说主要的一些系统服务如ActivityManagerService、PackageManagerService等,我们编写的...

    android native层是 相对于Java 层的底层,一般用c++开发
    Java框架层就是常说的Framework,这层里东西很多也很复杂,比如说主要的一些系统服务如ActivityManagerService、PackageManagerService等,我们编写的Android代码之所以能够正常识别和动作,都要依赖这一层的支持。这一层也是由Java语言实现。
    Native层这部分常见一些本地服务和一些链接库等。这一层的一个特点就是通过C和C++语言实现。比如我们现在要执行一个复杂运算,如果通过java代码去实现,那么效率会非常低,此时可以选择通过C或C++代码去实现,然后和我们上层的Java代码通信(这部分在android中称为jni机制)。又比如我们的设备需要运行,那么必然要和底层的硬件驱动交互,也要通过Native层。

    展开全文
  • Android Native Goodies PRO v1.7.0.unitypackage
  • Android Native开发总结

    2020-03-23 11:15:38
  • 安卓Native服务Demo

    2018-03-30 00:03:36
    安卓Native原生服务Demo, 内有使用说明,已在三星NOTE3测试成功
  • xCrash 能在 App 进程崩溃时,在你指定的目录中生成一个 tombstone 文件(格式与安卓系统的 tombstone 文件类似)。并且,不需要 root 权限或任何系统权限。
  • Hello Camera2是播放预览的Android Camera2示例。 它通过NDK camera2 API控制相机设备,该设备成为Android N中的之一。 先决条件 带有 (> = r12)捆绑包的Android Studio 2.1+。 屏幕截图 触摸屏幕时,会切换一个...
  • 基于Rust的Android Native内存分析方案

    千次阅读 2021-01-15 11:51:42
    背景:高德地图车机版运行的车载系统环境绝大部分都是基于安卓的定制系统,且高德车机版底层代码均为C/C++ Native代码。因此,在安卓上需要有一种通用的Native内存性能分析方案。内...

    背景:高德地图车机版运行的车载系统环境绝大部分都是基于安卓的定制系统,且高德车机版底层代码均为C/C++ Native代码。因此,在安卓上需要有一种通用的Native内存性能分析方案。内存塔(MemTower)是一个基于开源项目memory-profiler并移植安卓且优化改进后的方案,解决了之前方案存在的痛点问题,满足了通用Native内存性能分析需求。该项目采用Rust语言编写,并利用了Rust的一些特性来完成对Native内存访问的Hook.

    1. Android Native内存分析痛点与诉求

    这一节主要介绍我们为什么要做这件事以及对于这件事我们期望达到什么样的目标。

    1.1 现有工具缺陷

    Android在Java层面有很完善的性能分析工具,但是在Native层面没有完整的解决方案。主要表现在:

    • 不支持Android 4.x,线上统计数据显示4.x版本的车机仍占有较大比重,因此这点成为了无法忽视的问题。

    • 安卓自带的malloc_debug功能在不同的版本上行为不同,而且车机安卓系统大多经过了系统厂商的定制,不能保证这些功能可用。

    因此, 无法基于Android系统自有的功能做到Native内存性能分析。

    我们团队之前也在这方面做出了一些成果,但还是存在下面几个问题:

    • 通过修改编译参数对Native代码函数入口/结束位置插桩来进行Hook,导致了性能严重下降;

    • 由于是侵入式分析,对内存问题分析需要单独编译出包分析,解决效率大幅降低,一个内存泄漏问题的排查成本按天计算。

    • 缺少精准内存使用数据。

    1.2 打造一套完整的Native内存性能分析方案

    结合上门的问题痛点,我们希望能够有一套完整的Native内存性能分析方案。具体诉求表现在下面几点:

    1. 支持安卓4.x在内的绝大多数安卓系统。

    2. 无侵入式分析,内存问题的发现与精准定位同时完成。

    3. 性能优异,overhead低。

    4. 支持长时间内存泄漏压测。包括车厂客户在内的研发团队都会对导航进行压测,需要能够支持长时间的压测并定位内存泄漏问题。

    5. 函数级内存使用数据。原先的方案重点在于解决内存泄漏的问题,获取的内存使用数据不够精确。而我们希望新的方案能够获得详细的内存使用数据,用来支持内存性能优化。

    2. 内存塔(MemTower)方案

    本节主要介绍memory-profiler项目的实现和内存塔(MemTower)方案在移植该项目至Android平台上的过程和对原方案的改进。阐述我们是如何实现并满足上述的诉求。

    2.1 选择Rust & Memory-profiler

    针对上门的诉求,期望能够找到一种新的解决方案。当时正好在研究Rust,因此在GitHub上结合关键字搜索便发现了memory-profiler(以下简称mp)项目,作者koute是前Nokia工程师。接着才有了后面的内存塔。本节主要阐述mp如何结合Rust实现内存Profile的相关原理和功能。

    2.1.1 Hook实现

    通常对Native内存性能分析使用的方案是Hook mallocfree 等内存调用请求。mp的原理也是如此,利用LD_PRELOAD 预加载自定义库实现对内存操作函数的Hook。这种方案最大的问题是容易引发循环malloc调用。如下图,Hook了程序内存请求后,Hook业务自身的内存请求也会触发内存请求,从而造成了malloc循环调用,引发栈崩溃。

    mp的做法利用了Rust的可自定义内存分配器(Allocator)的特性,将曾经的Rust默认内存分配器jemalloc作为自定义分配器,并在jemalloc-sys的c代码中将最终的内存申请mmap替换成自定义的函数入口(从而也区分应用和自身的mmap调用),最终调用mmap系统调用。

    将Rust内存请求转发给系统调用后,还需要将应用的内存请求继续传递给系统libc. mp的做法是通过Rust的feature开关,可以自行选择两种方式处理应用内存请求,这两种方式都是通过在Rust中指定link_name 属性实现:

    1. 直接通过__libc_malloclink_name将应用内存请求转发给libc

    2. 通过指定成jemallocator的函数入口 _rjem_malloc,使应用和Rust共用jemalloc.

    最终可以使Hook业务使用完整的Rust语言功能而不用担心Rust自身代码引起的循环调用崩溃。

    2.1.2 高性能堆栈反解

    除了利用Rust系统编程语言特性避开内存循环调用之外,作者还利用Rust的高性能特点实现了几种高性能堆栈反解。

    1. 利用ELF的.eh_frame 节(C++异常处理机制)提供的栈回溯信息。

    2. 基于.ARM.exidx + .ARM.extab的栈回溯,这个是ARM提供的unwind table.

    具体实现可以看作者的这个Crate not-perf。这里选择第二种做说明,如图下,对每个线程的堆栈都用线程局部存储维护了一套栈帧缓存,这个缓存来自于ELF文件中的unwind table信息,当堆栈的帧在缓存未命中时会把对应二进制的unwind表被加载到内存,而命中的时候,就不需要去读取文件。通常二进制被加载后它的地址空间就不会发生变化,所以缓存的效率很高。缺点是每个线程都有一套完整的缓存。从系统层面看占用的内存overhead很大。

    2.1.3 强大的数据分析功能

    从mp的页面可以看到它除了内存Profile外,还有一个对应的数据分析Server端,采用actix-web框架,且具备一个非常强大的分析功能。主要特性有下面几点:

    1. 内存使用量和泄漏两种视角的时序曲线非常直观。

    2. 搭配了一个非常强大的过滤器,可以实现针对内存生命周期、函数、时间等多维度做过滤查询及其对应的内存火焰图功能。

    3. 所有功能具备RESTful API接口,可以非常容易的实现定制。

    详细的使用说明这里不做过多的介绍。

    2.2 移植

    了解完mp的基本原理后,本节我们主要阐述在移植安卓平台过程中遇到的各种问题(坑)。

    2.2.1 自定义Allocator

    mp的Hook方案在Android平台上存在较多问题,主要体现在下面几点:

    1. Jemalloc本身也才是Android 5.0开始引入安卓,mp自带的jemalloc-sys会导致一个应用里存在两个jemalloc,最终表现为在不同的版本上有着各种各样的异常崩溃,问题排查成了阻碍。

    2. __libc_malloc是glibc提供的malloc函数入口别名,但在Android平台没有对应这类实现。

    因此,我们采用最原始的dlsym 方法获取内存相关函数入口,再将其封装成Rust Allocator. 应用的内存请求也使用这些函数地址。如下图,最终所有内存请求都传给libc,这样Rust的业务代码对libc来说是透明的。

    2.2.2 栈回溯

    栈回溯这块同样有一些移植修改。上面说到作者提供了基于C++异常处理机制的栈回溯方法,但是这个方案要求依赖C++库。而C在Android 8.0之后才会成为默认依赖。这要求在8.0之前的版本运行时应用必须也依赖C++库。因此我们移除了这个栈回溯方案,舍去了这个依赖。

    2.2.3 地址空间重载

    在程序启动或调用dlopen/dlclose时链接器会加载(或卸载)ELF文件,相应的,程序的地址空间会发生变化,这时候栈回溯缓存里的地址空间就可能会失效,需要重新加载(reload),reload操作扫描整个地址空间的变更,这个成本很高。与此同时还需要一种低成本获取地址空间变化的方式. mp的实现主要有两种方式:

    1. libc提供的接口dl_iterate_phdr. Android API_LEVEL低于21(即5.0之前)没有,5.0之后这个函数的结构体和在高版本Android的实现不同。所以Rust定义的单一C结构体格式会导致读取到脏数据作为reload依据,导致非常高频繁地reload.;

    2. Perf的 PERF_RECORD_MMAP2 事件,这个要求内核版本大于3.16。因此这在Android 4.x上也不具备。

    实际运行过程中程序在加载完所有依赖ELF后,地址空间几乎很少再变。因此,我们修改为只有在新的ELF被加载时才进行地址空间重载。火焰图结果显示可以大幅降低Hook时的计算成本。

    2.3 改进

    到目前为止, 内存塔已经可以在支持 LD_PRELOAD 的Android版本上正确运行了(含4.x)。但是上面诉求中还有一点无法满足:长时间内存泄漏压测。而且在数据分析过程中,我们希望有更多维度的信息。因此,本小节主要介绍我们对内存塔的改进。

    2.3.1 内存泄漏压测

    mp原先的定位正如它的名称表述,是一款内存性能分析工具,它记录的是全量内存信息。这点决定了它的数据量规模。在长时间压测一小时的多个业务场景中,根据内存使用量不同,生成的采样数据文件有1GB~7GB之多。这样的数据量无法满足业务的需要。

    因此,我们增加了内存泄漏检测模式(ONLY_LEAKED),这个模式的原理如下:

    1. 将记录到内存开辟的每一层栈帧记录到一个字典树(Trie Tree)中,同时记录开辟的内存大小。

    2. 内存释放时更新字典树对应的节点信息。当前泄漏是否达到某个阈值(如100MB), 是则停止采样。

    3. 在结束采样时把整个字典树存储的未释放内存记录写入文件。

    这种模式的优点是最终的数据量非常的小,实际压测一小时数据文件大小在100~200MB之间。再进过mp自带的postprocess 子命令压缩后,大小不足100MB。不足之处是内存塔需要在内存中缓存一个全量的堆栈历史数据,当没有新的栈帧记录出现后这个内存增长才会趋于稳定。

    2.3.2 增强分析过滤器

    导航的业务模块划分和线程很多,因此增加了按线程和库正则筛选过滤器选项。

    2.3.3 内存火焰图完善

    mp原方案的内存火焰图是以内存大小(allocated)作为火焰图维度,在分析内存性能时内存开辟次数(allocations)也是一个很重要的指标,因此加入内存开辟次数火焰图。这是当初最早改进的功能,而且火焰图的形状类似塔状,就把该项目重命名为:内存塔(MemTower)。

    最后一点是原方案的火焰图信息没有以线程为单位划分,我们把堆栈信息按线程区分后会更加直观。

    分配次数火焰图

    分配大小火焰图

    3. 内存塔的能力及更多可能

    最后一节介绍下内存塔提供了什么样的能力、收益以及还有哪些可能。

    3.1 能力

    内存塔(MemTower)在Android 8.0以下依赖setprop wrap.com.xxx.xxx  和 root权限的能力,8.0以上版本如果没有root权限还可以通过配置Android项目wrap.sh来加载内存塔库。另外,由于mp原生支持Linux的原因,我们也成功适配了奔驰戴姆勒这类嵌入式Linux项目车机。

    • 支持平台:Android 4.x、5.1.1和7或更高以上版本(5.0和6系统存在Bug, 无法设置setprop ). Linux x86_64, AArch64, Arm.

    • 采样方式: 非侵入式. 非Root设备可选侵入式方式。

    • 采样模式: 常规性能分析模式和内存泄漏压测模式。

    • 特点: 高性能堆栈反解、完善的内存分析Insight体验(多维度过滤器分析、内存火焰图等)。

    原先发现内存泄漏问题重新出包二次压测分析,再推断可能泄漏点的流程耗费时间按天计算。利用内存塔(MemTower)做一遍测试后几分钟即可解析出精细化数据,大幅降低了内存性能问题分析成本。mp提供的这套Hook思路和高性能堆栈反解其实可以不仅仅局限在内存方面的分析,还可以针对IO性能分析或其它问题上。

    招聘

    阿里巴巴高德地图工程技术中心长期招聘Java、Golang、Python、Android、iOS 前端资深工程师和技术专家,职位地点:北京。欢迎投递简历到 gdtech@alibaba-inc.com,邮件主题为:姓名-应聘团队-应聘方向。

    展开全文
  • android 用C语言 实现android的系统服务,包含了java层调用服务的范例
  • 如何顺滑地查看 Android Native 代码

    千次阅读 2019-10-22 09:56:52
    使用 Android Studio 查看 Android Framework 代码体验非常好,无论是索引还是界面都让人很满意,但是当你跟踪代码,发现进入 native 逻辑时,就会发现 Android Studio 对 native 代码的支持非常不好,不能索引不...

    1. 简介

    使用 Android Studio 查看 Android Framework 代码体验非常好,无论是索引还是界面都让人很满意,但是当你跟踪代码,发现进入 native 逻辑时,就会发现 Android Studio 对 native 代码的支持非常不好,不能索引不支持符号搜索不能跳转等,这些让人非常抓狂。那么如何能在 IDE 愉快地查看 native 代码呢?在 Windows 上,Source Insight 的表现也很好,但苦于只有 Windows 平台支持且界面不好,经过一番折腾,还真是找到了方法,下面我们将一步一步打造丝滑的 native 代码阅读环境。

    先看一下效果:

    2019-10-11-15-02-40.gif

    2. CMake

    能让 IDE 正确地建立索引,我们需要让 IDE 能正确地知道源文件、头文件、宏定义等各种数据,庆幸的是,我们发现 AOSP 在编译过程中,可以帮我们生成这些数据,详见:http://androidxref.com/9.0.0_r3/xref/build/soong/docs/clion.md

    通过文档我们可知,只需要按照以下步骤完成一次编译,即可自动生成各模块对应的 CMake 文件。至于 Cmake 文件是什么,这里就不做赘述了,大家可以自行了解。

    1. 打开以下两个开关,CMakeLists.txt 就会根据编译环境自动生成
    export SOONG_GEN_CMAKEFILES=1
    export SOONG_GEN_CMAKEFILES_DEBUG=1
    
    1. 启动编译
    make -j16
    

    或者只编译你需要的模块

    make frameworks/native/service/libs/ui
    

    生成的文件存放在 out 目录,比如刚刚编译的 libui 模块对应的路径为:

    out/development/ide/clion/frameworks/native/libs/ui/libui-arm64-android/CMakeLists.txt
    
    1. 合并多个模块

    生成了 CMake 后,我们发现,CMake 文件是按模块生成的。这样的话,会导致 IDE 只能单独导入一个模块,而我们平时不可能只看一个模块的代码,如果把多个模块都 include 进来呢?
    我们可以在 out/development/ide/clion 路径新建一个 CMakeLists.txt 文件,并添加一下内容:

    # 指定 CMake 最低版本
    cmake_minimum_required(VERSION 3.6)
    # 指定工程名,随意
    project(aosp)
    # 把你需要的模块通过 add_subdirectory 添加进来,注意子目录必须也包含 CMakeLists.txt 文件
    add_subdirectory(frameworks/native)
    #add_subdirectory(frameworks/base/core/jni/libandroid_runtime-arm64-android)
    

    这样,我们就把多个模块合并在一起了,用 IDE 去打开这个总的 CMake 文件即可

    3. 导入 IDE

    只要生成 CMake 文件后,剩下的事情就好办了,现在能识别 CMake 工程的 IDE 非常多,大家可以根据个人喜好选择,如:

    • CLion
    • Eclipse
    • Visual Studio

    这里以 CLion 为例讲一下如何导入

    1. 打开 CLion
    2. 选择「New CMake Project from Sources」
    3. 指定包含 CMakeLists.txt 的目录,如我们在上一个步骤中说的 out/development/ide/clion(这个目录的 CMakeLists.txt 包含了多个模块,还记得吗?)
    4. 选择「Open Existing Project」
    5. Enjoy your journey …

    当然,CLion 也有一个缺点,收费!!如何能免费使用就看大家各显神通了

    4. 遇到的一些问题

    • 生成的 CMakeLists.txt 里指定路径可能会使用绝对路径,如: set(ANDROID_ROOT /Volumes/AndroidSource/M1882_QOF7_base),这里大家要注意,如果把 CMakeLists.txt 拷贝到别的工程使用,记得修正一下路径
    • Mac 用户留意,如果你的 CMakeLists.txt 是从 linux 平台生成拷贝过来的,生成的 CMakeLists.txt 里指定的 c++ 编译器 set(CMAKE_CXX_COMPILER "${ANDROID_ROOT}/prebuilts/clang/host/linux-x86/clang-3977809/bin/clang++") 这里指定的是 linux-x86 的编译器,记得替换成 darwin-x86,如果对应目录下没有 clang++,那就从 AOSP 源码拷一个吧
    • 如果 CMake 中列出的源文件在工程中找不到,会导致 CLion 停止索引,如果出现不一致的时候,移除 CMake 中源文件的声明即可

    如果使用遇到其他问题,欢迎联系告知,谢谢

    5. 总结

    所谓工欲善其事,必先利其器。通过这种方法建立的索引包含了 AOSP 所有模块,最重要是它还会根据编译环境,把相关 FLAGS 和宏都设置好。

    展开全文
  • Android Native Exception

    2017-08-20 20:46:39
    Android Native Exception
  • Android native绘图

    2019-05-21 18:24:36
    Android native绘图canvas绘图硬件加速绘图surface上绘图 canvas绘图 思路:继承View,在onDraw获取到canvas,并把改canvas设置到native,在native用java的canvas获取java的canvas中保存的native canvas句柄;绘图...
  • Android Native开发入门之JNI

    千次阅读 2019-01-23 15:53:24
    JNI是Java Native Interface(Java本地接口)的缩写,JNI不是Android专有,而是从Java继承而来。Android作为一种嵌入式操作系统,大量个驱动、硬件相关的功能底层功能都必须在native层实现,JNI的作用和重要性大大...
  • 安卓native崩溃处理

    2018-12-21 17:31:07
    安卓调用native方法崩溃的时候,一般是不会直接给出代码错误的地方,而是报一个内存地址,而且光看locat是不能直接拿到地址,这时候就需要借助breakpad来获取崩溃日志 ,demo我已经上传到github ...
  • Android Native内存泄漏诊断

    千次阅读 2017-09-25 15:08:23
    Android Native内存泄漏诊断1、基础诊断方法特点:操作简单,但只能判断是否有泄漏,但需使用者自行判断泄漏在哪里命令行方式adb shell dumpsys meminfo vStudio.Android.Camera360 -d结果如图: Android Studio1、...
  • 在Adroi系统使用socket在Jva层和native之间数据通信 Andrid是基于linux的系统,系统底层机制基本上是相同的,因为分本地代码和jv代码并且是ja代码通过jni调用本地代码执行 因为DP报文发送是有局限的,局限就是当发送方...
  • 记一次android native 内存泄漏分析

    千次阅读 2019-05-25 16:36:33
    最近有客户反馈,使用平台的SDK,进行扫码时,使用几...这个大家伙,有java,有native. 通过的抓取2分钟时间内dumpsys meminfo差异 : 主要在Native Heap增加。 好吧,确认是Native Heap出现内存泄漏无疑。 Nat...
  • Unity3d Android Native Plugin

    热门讨论 2014-04-02 13:23:30
    Unity3d Android Native Plugin,用c++ 做u3d开发安卓运用的插件!
  • Android Native 程序中输出 LOG

    千次阅读 2017-05-16 14:06:42
    尽管是在 Linux Kernel 层开发,但有时还是需要接触一些 Android Native 层代码,查看相关 Log。这篇文章主要是介绍 Android 下与 Log 相关工具的用法,以及在 Native 层模块里,如何去打印 Log。 1 Liblog 库 ...
  • Android Native Goodies PRO 1.3.0,安卓手机上的设置,分享,截图,日历,闹钟,等等
  • 最近在做android native layer的三种加密代码书写,可惜我的c和c ++实现太烂,只能去github上找找资源,md5和base64的加密比较简单,自己梳理了一下,完美运行起来了。就是sha256实现起来有点烦,折腾了好几天,找了...
  • Android native memory leak detect (Android native泄露检测) 简介 Android应用中,经常会有业务需要使用到Native实现。比如加密,音视频播放等。也就是常见的二进制文件xxx.so 这部分代码,申请的内存不走...
  • Flutter与Android Native进行混合开发

    千次阅读 2019-06-25 17:05:20
    原生项目集成Flutter 创建Flutter module 添加Flutter module依赖 ...首先在你的Native项目的上一级目录,运行如下代码 flutter create -t module flutter_module 这样,就会创建一个flutter模块 ...
  • Android Native程序crash的一些定位方法简介经常,避免不了,我们的代码会崩溃。如果crash在native代码上,Android会和其他Linux一样,生成一份core dump,将程序运行时的内存,寄存器状态,堆栈指针,内存管理信息...
  • 首先使用 find_library( # Sets the name of the path variable. android-lib # Specifies the name of the NDK library that # you want CMake to locate.
  • android native 程序崩溃的调试方法使用arm-eabi-addr2line工具跟踪Android native程序调用堆栈: 编译带调试的so 库 交叉工具链 跟踪定位错误位置 编译可调试的so 库 修改 Android.mk,添加: LOCAL_CFLAGS := -g...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,130
精华内容 75,252
关键字:

安卓native