Android N的限制

Fri 08 July 2016

Android N的限制

因为研究Android插件化的缘故,所以对新系统对插件化的影响很关注。

classloader-namespace问题

N早期的预览版存在这样一个问题:

04-13 14:32:46.073 25571-25571/? W/System.err: java.lang.UnsatisfiedLinkError: dlopen failed: library "/data/user/0/com.xxx.yyy/files/storage/com.aaa.bbb/version.1/lib/libxxx.so" is not accessible for the namespace "classloader-namespace"

很庆幸这个问题在最新的preview版里面已经修正了。这问题的原因大概如下:

Java的代码在执行System.load(...)时,系统会检查代码所属的ClassLoader是否有该so路径的加载权限。ClassLoader能加载so的路径,在ClassLoader构造的时候就已经指定了。

如果你直接newDexClassLoader去执行System.load(...),加载你指定路径里面的so不存在任何问题。

但是如果你自己实现一个ClassLoader,该ClassLoaderfindClass再转给其他ClassLoader就会出现这个classloader-namespace的问题。

这应该是一个bug,并且Google已经意识到了。

Elf Section Header完整性问题

Android N之前so的加载只需要ELF头的program header,对section header则完全无视。但新的linker现在开始改变规则了。

普通的开发者对于自己编译出的so完全不用担心兼容性问题。但对于使用第三方SDK就要小心了。

Android NDK编译出来的so,ELF section header和program header都是完整的。但一些聪明的家伙发现修改section header或者抹去section header不会影响so的加载,还能起到保护so的目的(其实很有限)。

修改section header的好处是增加so逆向的难度,一个具体的例子:把so拖进IDA的时候直接报错退出。

Category: Android Tagged: Android

comments


在Mac OS X上编译Android ROM

Sun 06 December 2015

在Mac OS X上编译Android ROM

在Linux上编译Android的文章已经很多了,但Mac上编译的却很少。本文完整的演示如何在Mac OS X上编译出一个给Galaxy Nexus使用的4.3.1的ROM出来。使用的Mac系统版本是10.11

背景

我们在编译Android源码的时候,可以编译出3种类型的版本:

  1. Eng: 工程版, 有root权限,可以调试任意进程, adb调试默认开启
  2. User: 编译final release版本使用
  3. UserDebug: 和User版差不多, 可以调试任意进程, adb调试默认开启

我们选择Eng版进行编译,模拟器默认就是这个版本。编译这个版本的目的为了debugActivityThread和系统服务。

准备

  1. 准备文件系统
  2. 下载代码和二进制文件
  3. 安装必要的软件

准备文件系统

Android的编译需要 大小写敏感 的文件系统, 而Mac用户通常使用的是大小写不敏感的。如果自己有USB3.0或者Thunderbolt接口的外置存储,可以在外置存储上分出一个卷来格式化成Mac的日志式大小写敏感的文件系统。如果没有的话,我们利用稀疏文件创建出一个虚拟的磁盘。下面介绍后者:

hdiutil …

Category: Android Tagged: Android Mac ROM Framework

comments

Read More

谈谈Android的进程

Sun 01 November 2015

谈谈Android的进程

原创内容转载请注明源地址: http://jksoftcn.com/

Android的底层虽然是Linux,但是它的进程管理机制和Linux还是有些差异的。

传统层面的进程

传统层面的进程规则还是和Linux一样

init是1号进程,这是Linux内核启动的第一个应用层程序,其他进程都是1号进程的子孙。 进程可以fork出自己的子进程。这意味着你使用JNI在APP中调用fork函数fork出子进程。

Android层面的进程

APP进程虽然本质上是Linux进程,但这个层面的游戏规则不一样了

所有正常启动的APP进程都是zygote创建出来的子进程。因为zygote已经创建好虚拟机了,并且预加载了framework,由zygote fork可以让其他APP进程直接使用zygote创建好的虚拟机环境,省了很多事。

一个APP可以拥有多个进程,即:不同的组件运行在不同的进程。但同一个APP的不同进程间是平级的,没有从属关系,父进程都是zygote。看了下面的内容,应该能理解这么设计的意图。

APP默认的进程名是APP的包名,可以指定组件运行在:xxx这样相对命名进程里面,实际上是packageName:xxx

不同的APP …

Category: Android Tagged: Android Linux Process

comments

Read More

Android源码镜像站的操作

Mon 12 October 2015

Android源码镜像站的操作

制作镜像站

本文假设你已经阅读过Android官方的Downloading the Source。 假设机器是www.jksoftcn.com,一台Ubuntu的Linux, 下面的操作在root用户下面操作

先准备好代理服务器:

如果你用的是shadowsocks,可用这样启动一个本地的代理:

sslocal -s 服务器 -p 端口 -b 127.0.0.1 -l 1080 -k 密码 -t 600 -m 加密算法 &

让git也可用使用这个socks5代理:

cat << EOF > ./proxy.sh
#!/bin/bash

export HTTP_PROXY=socks5://127.0.0.1:1080
export HTTPS_PROXY=socks5 …

Category: Android Tagged: Android 源码 Linux

comments

Read More

ACDD使用教程

Thu 01 October 2015

ACDD使用教程

ACDD项目原名为OpenAtlas, taobao的Android客户端使用的动态部署(插件化)方案。

获取ACDD

git clone https://github.com/jiangfengbing/ACDD.git
git clone https://github.com/jiangfengbing/ACDDExtension.git

我的仓库是从bunnyblue的github fork来的,在开发分支有我修正bug的commit

ACDD的仓库包含两个项目:

  • ACDDCore: ACDD的核心库
  • ACDDLauncher: 加载插件的宿主APP

ACDDExtension的仓库包含的内容:

  • 插件资源分组架构图: Architecture/images/Architecture.001.jpg
  • 编译好的demo: Dist/ACDDLauncher.apk
  • 插件demo: Samples
  • 针对机型的测试报告: TestReport
  • 编译: buildTools
  • aapt: 修改过的appt, 增加对versionName的处理 …

Category: Android Tagged: Android 插件化

comments

Read More

Android和Linux的关系

Thu 01 October 2015

Android和Linux的关系

引导

GRUB vs Bootloader

Linux主流引导程序是grub,以grub2为例,如果GRUB是安装在MBR上,BIOS加载MBR执行GRUB,GRUB寻找/boot分区, 按grub.cfg的内容显示系统列表。 grub2引入了模块的概念,原因是:识别设备,文件系统靠all in one的程序已经搞不定了。grub2加载Linux内核和initrd系统,操作系统真正开始执行。

Android没有硬盘,没有GRUB,CPU加电后执行flash上的Bootloader,Bootloader加载Linux内核。过程和GRUB类似,不同的是Bootloader位于flash的起始位置,kernel是接在kernel后面的一个固定位置。每个SoC厂商的bootloader一般是不一样的,而GRUB是通用的。

文件系统

ext4目前都很受欢迎

system分区, data分区都在flash(NAND)上:

shell@android:/ $ ls -al /dev/block/platform/omap/omap_hsmmc.0/by-name
lrwxrwxrwx root     root …

Category: Android Tagged: Android Linux

comments

Read More
Page 1 of 1