Android动态加载源码库

很多跨平台实现都避免不了需要加载一个so库,而so库针对不同的芯片还需要不同的编辑版本(ARM和X86).这间接得导致android APP包越来越大.例如目前cocos2d-x的6-8M,Unity5的16-18M,而这都是一张图片 一句具体代码都没写的情况下.做过游戏的都知道:

  1. 资源可以脱离APK包 采用在线更新的方式download到手机上.
  2. 脚本(Lua or Js or C#)也可以采用热更新的方式download到手机上.
  3. 甚至玩家安装了一次APK,以后的新版本APK都可以采用后台download静默安装的方式更新自身.

那现在就剩下最后两个问题:

  1. 我嫌弃更新APK麻烦,只想更新so库,那so库是否可以动态更新?
  2. 或者更变态一点,即使非常必要的时候,我依然不想更新APK,dex是否可以动态更新?

so库:android项目的C++原生拓展编译库,可被加载后执行.
dex文件:android项目中的java代码生成的可执行文件.

下面我们探讨下这第一个问题.

继续阅读“Android动态加载源码库”

浅析2DX-Lua原理(一)

  • 题外

目前我的团队正使用2DX的另一个实现quick-cocos2dx来制作下一款产品,又一次得益于开源社区.提到开源 作为受益者们 很多都缺乏对自由软件认知.下面针对安卓平台记录我的一些理解,如你有更深的认识 或者 发现我的误区欢迎指点.(以下分析可能存在谬误)

  • 题内 – android机器结构

由于2DX本质是使用C/C++编写 所以在安卓平台上必须使用到NDK,NDK是一种基于原生程序接口的软件开发工具。通过此工具开发的程序直接以本地语言运行,而非虚拟机。因此只有java等基于虚拟机运行的语言的程序才会有原生开发工具包。NDK与JAVA的关系 对比AIR来说 相当于ANE与AS.只是速度和深度他们都不在一个水平上.通过下图展示的是android整个系统的大题结构:

继续阅读“浅析2DX-Lua原理(一)”

[android逆向]活用反射机制

首先看一个简单的实现

在需要调用的地方写入一下代码:

[code lang=”java”]
try
{
sJump = Class.forName("com.rect.jumpdemo.JumpHandle");
if(sJump != null)
{
Method method =
sJump.getMethod("CallBack", new Class[] { Integer.TYPE});
if(method != null)
method.invoke(null, new Object[] { Integer.valueOf(11)});
}
}
catch (Exception e) {
// TODO: handle exception
}
[/code]

继续阅读“[android逆向]活用反射机制”

android逆向分析:如何去广告

把逆向丢了有一段时间了,总觉得有些东西应该坚持研究下去。最近一年在做移动项目的时候一直都想把整个android底层了解清楚。

直到最近有点时间空余下来。一段时间后发现android的芯片ARM的ARM汇编和x86的16,32位汇编其实原理是相通的,只是可能在语法 在硬件结构上会导致有差别。(虽然这篇文章并用不到这种东西),而相比于android的Dalvik虚拟机代码,Dalvik机器码更便于阅读。只要好好记住Dalvik的一些规则便可。

然后我们从简单的逆向开始吧。这篇我会拿一个有广告的android应用来试手,当然原理本身非常简单,当然并没有针对的意思,下面是一个简单的使用逆向技术而修改程序的过程:

使用到的工具:IDA,C32ASM,JD-gui,Notepat++,apktool,android签名工具。

需要做手术的应用:某事百科。

继续阅读“android逆向分析:如何去广告”

android的armeabi和armeabi-v7a

在ANE中如果SDK调用了so库,则需要把so库放到ANE下Android-ARM/lib/armeabi (调试模式)或者 armeabi-v7a(发行模式)下。

可以贴个ADT代码说明问题:

[code lang=”java”]
//m_configType.equals("apk") 是否是发行模式
//(hasCaptiveRuntime() 是否带运行时
if ((m_configType.equals("apk")) || (hasCaptiveRuntime()))
{
destApkDirectory = "lib/armeabi-v7a/";
}
else
{
destApkDirectory = "lib/armeabi/";
}
[/code]

 

而这个armeabi和armeabi-v7a究竟是什么意思?

有什么深意么?

为什么调试模式和发行模式adobe会选择不同的文件夹?

我在这篇记录下我对于这个小问题的理解。

  • armeabi与armeabi-v7a表示支持不同的CPU类型

armeabi是指的该so库用于ARM的通用CPU,而v7a的CPU支持硬件浮点运算。因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力,在AIR打包APK调试模式adobe选择的是通用性强的armeabi模式。

继续阅读“android的armeabi和armeabi-v7a”