跨系统的录音格式兼容性问题: iOS Android

iOS/ OS X支持的可播放的Audio Format与Android支持的有些不一样。因此可能出现在Android设备上面使用MediaRecorder录制出来的音频文件在iOS上面不可用。当然也可能iOS上面录制的audio file在Android上面无法playback。 如果在iOS和Android上面开发类似微信这样的待遇语音交流的软件,那么就需要考虑iOS和Android上面录制出来的音频的跨系统的兼容性。 音频文件的基础知识 这方面涉及到下面几个方面: 采样率 比特率 声音通道 编码格式:指压缩方法 存储容器:即压缩后使用什么方式存储 对于这些可以看文章:How to convert between (most) audio formats

Continue reading »

Android中Native ELF的反汇编与破解的一些经验

工具选择与使用 一般Android运行的HW有: 32Bit的ARM 64Bit的ARM64 X86 X64 对于Intel/AMD的X86/X64, 可选的工具比较多, 因为ELF运行的Host是Android, 使用静态反汇编工具Hopper Disassemble与IDA是比较好的选择. 对于32位ARM的ARM, IDA与Hopper Disassemble都可以完成, 但是对于ARM64就只有Hopper Disassemble了, 当然最新的IDA Pro也可以,但是一般难以获取得到. 剩下的方式就是用readelf +

Continue reading »

LineageOS 14.1(CM14.1)的快速下载与编译

代码的快速下载 Cyanogenmod OS或者说后来的Lineage OS的代码都是分为两个部分: cm团队自己或者社区开发的代码: 主要是适配设备, 例如vendor相关,放在github上面 aosp代码: google的AOSP代码, 作为base 因为本地有一份AOSP的Mirror,所以这部分AOSP代码就不需要再从google去下载了, 直接从本地获取即可.  local mirror的建立可以参考AOSP的repo 与get source相关文档. 关于repo与如何快速使用本地代码可以参考前面的博客: 使用本地AOSP镜像快速获取Android代码 repo详解与如何更改manifest快速获取和复用AOSP代码 修改步骤

Continue reading »

如何减少Android源码size并打包与切割上传共享

源码很大的原因 repo sync下Android的代码, 然后编译后,一般size都在60GB左右, 主要是因为代码中包含了out编译结果产物目录, 以及版本相关的.git与.repo目录, 如果不打包这两个目录, 那么常规的Android 6.0代码压缩后大概为6GB左右. 打包 可以使用类似下面的命令来排除非必须代码和目录以及压缩Android source code, 假设Android源码位于/home/dev/android目录, 那么可以这样子做:     cd /home/dev     tar

Continue reading »

Ubuntu中Mirror Android屏幕

Droid@screen 找了一圈,最后找到一个能用的,而且不需要配置的Droid@screen 主页位于:http://droid-at-screen.org/installation.html 虽然官方没有说可以用于Linux,但是看到使用的是java这个cross platform的language写的,同时还看到需要指定adb,可以才想得到用的是adb的screenshot来不停的截图做的。当然这样的话会很慢,不过能用再说。 使用 下载了jar包后,直接使用java -jar运行即可。 然后会弹出adb指定: 这个位置使用which命令即可得到。 然后是效果图 同时这个可以使用鼠标点击来模拟input。

Continue reading »

Android中使用”hacker”方式解决ServiceManager的权限限制问题(1)

缘由 有一个系统,需要我们的解决方案,但是却没有提供BSP的源码。 我们的方案有一个So文件,并在其中有注册service,但是启动后发现service并没有注册成功,查询log发现是:

看起来是我们不具备权限,然后确定了一下SElinux的状态,发现是没有开启的,而servicemanager对添加service的权限的检查是位于其代码中的。 关于ServiceManager是如何检查权限的可以参考一下stackoverflow中的答案,或者自己看看servicemanager的源码。 参考的链接为这个,从这里面我们可以得知权限的检查写死在了对应的source code中(Android 4.4),暂时没有配置文件,这个和SeLinux不一样。 判断逻辑 ServiceManager的判断逻辑为: 1. uid判断是否为system 2. 是否在可信任的表格中 如果两个都不是,那么就认为没有权限,然后打印出前面的话来。这个对应的代码为:

另外这个allowed的数组为:

从里面的注释可以看出,以后这个可能会变成使用通配符方式,或者是配置文件的方式,但是现在还是直接写死了。

Continue reading »

S5P4418与S5P6618的Android boot.img的解压与压缩, Sparse ext4文件系统

文件类型 4418的boot.img是由kenrel + uramdisk组成的ext4 并且是sparse形式的image, 这里面的sparse是紧凑的意思,即将ext4文件系统中的内容为zero的地方“压缩”起来, 从而减少size。 制作 这种类型的image,使用make_ext4fs, 并使用-s选项制作而成,例如在4418中(其他Android或者文件系统也是类似),命令如下:

  其中-a为lable,最后的参数是制作到文件系统中的目录,因此,制作完成后,可以看到file工具识别到的是data 数据文件:

转化 对此我们可以使用simg2img工具来转换成标准的ext4文件系统的文件:

此时file工具即可识别:

Continue reading »

原生Android系统的第一次开机google验证的解决

网络访问问题 作为Android系统开发者,编译AOSP是无法避免的,下载Nexus系列的AOSP image来使用也是无法避免的。如果是我们自己编译AOSP的话,我们可以选择eng版本,从而省去这些验证步骤,同时也没有各种权限问题,当然SeLinux还是有问题的,但是我们可以很容易的关闭。 如果我们需要下载,或者使用product版本的aosp image,那么一般在第一次开机后,Android系统需要连接google网站,然后让我们选择登录google帐号,如果无法连接到google,那么其实我们是无法进入系统的。因此问题就在于,如何连接到google。 方法 方法有多重,根据个人的开发环境各异,但是一般不外乎下面这两种: 1. 路由器直接有SS可以访问网络 2. 使用代理 如果路由器已经可以访问google,那么也就容易了,但是对于大多数开发者而言,使用第二种方式较为实用和普遍也非常的容易实现。 准备 要使用第二种方式,我们需要下面这些东西: 1. Wifi热点,笔记本自带的一般就可以,也可以使用路由器 2. SS帐号密码,可以到淘宝卖SS的地方找一个试用的来暂时使用,最好是自己的SS Server 步骤

Continue reading »

Freescale IMX6 Android (7): Android启动动画死循环 Home界面不出来与pid XXX exit 可能的原因汇总

或许你某一次编译了整个Android,然后烧进去,结果屏幕中一直显示Android Bootanimation,Home界面一直不出来。对此,可能有以下五类原因,往这几个方向考虑与调查可能可以提供一些线索。前面两类是属于软件的,后面两类属于硬件。最后一类属于软件硬件都相关。 第一类:binder相关

这一类的问题,一般都是因为某个进程退出了,因此binder消息无法发送过去了,因此和下面第二类比较类似。 第二类:pid XXX exit 这类log会不断输出,表现为某个或者某几个线程不断的重启。为何会不断的重启,因为这个是系统关键的线程,可能是守护进程。 那么就需要调查程序为什么会退出,这一般有三种可能的原因: 进程需要的资源无法获得 进程程序有问题 有其他进程在不断的kill(发信号)这个进程 这几类都遇到过,下面举例说明。 进程需要的资源无法获得 有可能是某个分区坏了,而这个线程一定需要在这个分区创建某个文件并写入数据才能执行。 有一些Service可能需要某个属性的值变成特定的值才能运行。 进程程序有问题 在前面的博客:Freescale IMX6

Continue reading »

Freescale IMX6 Android (6): 向SystemServer中添加Service

简述 前面的博客中,我们直接添加C lib到APK中,然后使用LoadLibrary加载这个库,同时添加一个class来作为中间层,直接使用这个C库中的native函数来控制硬件,这种做法将硬件与APK牢牢绑定,如果有多个APP来访问同一个硬件就会出现问题,代码也会有很多的重复,在Android中,我们使用Android的SystemServer向ServiceManager来将硬件的功能添加为一个服务,这样当一个APP需要使用硬件的时候就向SystemServer发出请求service服务,然后由ServiceMnager统一提供服务,提供统一的接口与硬件控制,即相当于多添加了一层,从而实现解耦。 详细原理 先看下图(图片来源于韦东山的Android视频资料)中的③②①,按照顺序: SystemServer会加载Cpp lib 在JNI_OnLoad中注册各个Service,SystemServer向ServiceManager添加服务 这些service就包括像串口/LED等硬件相关的服务 而使用的时候,就是7~5步骤: AddService:SystemServer向ServiceManager添加服务addServeice getservice:通过getservice来从SystemServer注册了的service中获取服务所具有的功能,例如ledctrl 使用Service的方法:APP使用一个Interface(即以i开头的对象)来使用service提供的功能,将服务请求到SystemServer去 APP/SystemServer/ServiceManager三者都是通过Bindler来通讯。 添加Service与使用Service的步骤 添加serviceAIDL文件,生成Interface java文件 因为系统中其他都aidl文件都放在frameworks/base/core/java/android/os下,所有我们也参考其他的文件添加一个ILedService.aidl:

可以看到这个interface前面有个@hide的修饰,表明是个hide

Continue reading »