`
rain_2372
  • 浏览: 676277 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

apk打包

阅读更多
什么是apk文件
APK是Android Package Kit的缩写,即Android安装包。APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。APK文件结构为:

1
2
3
4
5
META-INF:Jar文件中常可以看到
res:存放资源文件的目录
AndroidManifest.xml:程序全局配置文件
classes.dex:Dalvik字节码
resources.arsc:编译后的二进制资源文件
Android在运行一个程序时首先需要UnZip,再通过dexdump命令可以反编译,这样做对于程序的保密性和可靠性不是很高但符合发展规律。Dalvik Vm的执行文件被打包为apk格式,最终运行时,加载器会解压apk并获取编译后的androidmanifest.xml文件中的permission中相关的安全访问。

如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的,android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。但第三方程序并不是安放在这个文件夹的。

apk的打包
在Eclipse中,编译好的android project,在该project的bin目录下会自动生成一个apk文件,与J2ME不同,无需手动打包。只要代码有改动就自动build,build出来的apk是签过名的,也可以在project右键菜单的Andoid Tools菜单下export签名的或未签名的apk。如果使用adb shell rm手工删除过应用,此时在Eclipse中运行Android项目时会出错,你可以选择Project-Clean…菜单来清空项目,然后再运行Android项目时就会重新编译安装了。

将apk安装到android simulator中
通过tools/emulator启动模拟器。这里要注意,这个命令只有在avd配置好后才可以使用,例如我有一个名为android3的avd,所以我要用如下方法启动emulator:emulator –avd android3

将要安装的apk文件copy到tools目录下;

cmd进入命令行输入,进入到tools目录下,输入命令:adb install ***.apk安装应用到模拟器中。

apk破解之dexdump反编译Android程序
反编译Android程序目前没有什么好的方法,但是在Android/platforms/android-2.0.1/tools中可以找到一个名为dexdump的程序,通过dexdump可以查看出apk文件中的dex执行情况,ophone8.com粗略分析出原始java代码是什么样的和Dot Net中的Reflector很像。android编译器生成的java class相关内容都放到了dex文件中,为什么要反编译apk文件呢? 就目前来看Android开放度还很低,很多东西只有反编译官方的app才可以了解一些底层的东西。

对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。模拟器自带了一个dexdump,有兴趣的网友可以先了解下,同时以及有关APK文件的汉化,我们将在下一次做详细的分析,因为这里主要是修改的不是dex而是资源文件,使用类似UltraEdit这样的工具以字节对齐的方式逐个替换即可,最终再签名下即可使用,这样的行为可以算作是非法修改,不过目前这样的方法在国内很流行,Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

首先要把apk的class.dex dump出来,具体步骤:

1
2
3
4
用winrar或者winzip打开apk,直接拖出来;
用android sdk1.1版本以上的一个dexdump工具把class.dex文件dump成文本;
把刚才的class.dex文件放在和dexdump工具同目录;
用命令窗口执行:dexdump -d classes.dex > spk.dump.txt,意思是将classes.dex dump出来形成一个txt文件;
下一步就要读懂这个txt文件了,先从header中可以看清楚这个应用的总体信息,有几个类,包括内部类 ,header只是了解概况。要详细去分析下面的每一个class才能真正理解这个软件的设计过程。最好的方法是一边研究里面的opcode一边打开api来查看里面调用到的类和方法,减少误解的机率。opcode就是介于高级编程语言和二进制代码之间的一层中间码,operation
code叫操作码。读懂opcode主要是熟悉里面的逻辑跳转以及一些个别助记符的含义。

通过opcode你就可以清晰的知道里面每个方法资源的调用过程和逻辑跳转过程。做过的例子都有点复杂,就不举例了。当然,要破解整个apk最好是翻译opcode和应HexWorkShop查看资源文件相结合比较合理和轻松,尤其是ManiFest.xml这个文件,一定要看清楚里面的activity和service receiver,permissions 这几个部分的信息,这可能会成为整个破译流程的关键部分。

能够说的经验暂时就只有这么多,正着手写一个工具专门用来翻译opcode成java代码。这是一个复杂的过程,普通的资源调用只需要匹配相关的文本就能翻译过来,但是一些复杂的跳转和个别特殊表达式需要费时费力去想想。

反编译dex文件的命令和参数解释:

1
2
3
4
5
6
adb shell dexdump -d -f -h /data/dalvik-cache/data@app@com.superdroid.list@classes.dex > code.text
-d : disassemble code sections
-f : display summary information from file header
-h : display file header details
-C : decode (demangle) low-level symbol names
-S : compute sizes only
non-IDE开发android
如果不使用Eclipse的ADT组件开发Android,必须要熟悉Android SDK提供下面几个工具:

android (android工具)
创建/更新Android工程和创建/移动/删除Android虚拟设备,使用android命令创建的工程中会自动生成build.xml的ant编译文件,使用它可以将项目编译成.apk文件。

Android Emulator (emulator工具)
Android的应用程序需要在模拟的Android平台上运行

Android Debug Bridge (adb工具)
连接模拟器或者设备(安装应用程序,进入设备的shell,发出命令等等)。

除了上面这些Android SDK提供的工具外,还需要下面的几个开源的第三方工具:

Ant
把项目编译并组建成可安装的.apk文件

Keytool
创建一个密钥证书存储文件和一个私钥,用来为.apk文件签名

Jarsigner (类似的签名工具)
用Keytool产生的私钥为.apk文件签名

创建一个Android工程:如果创建一个Android工程,必须使用android工具,它会产生一个含有默认的程序文文件,存根文件,配置文件和一个组建文件的目录。

android的用法:
android create project --target <targetID> --path <projectPath> --activity <activityName> --package <packageName>

参数:
target 与创建工程使用的Android平台库有关,使用android list target命令可以查看所有的可用target.
path 是工程的存储位置
activity 是Activity类的名字.它被创建的位置在<工程文件路径> /src/<包路径> .
package 是项目的包名,符合java的规范

例如:
android create project --target 1 --path ./nonIDEProject --activity nonIDEProjet --package nonIDEpackage

运行这个命令之后就会生成以下几个文件或者目录:
AndroidManifest.xml 应用程序的manifest文件,与制定的Activity类保持同步.
build.xml Ant的编译文件
default.properties   组件系统的默认属性信息,一般不要修改这个文件.
build.properties   自定义的组件系统属性信息,可以修改这个文件覆盖Ant使用的默认组建配置信息.
src/package_path/ActivityName.java   创建项目时产生的Activity类.
bin/   ant脚本的输出目录.
gen/  保存Ant生成的文件.
libs/  保存私有库.
res/    保存工程资源
tests/  保存上面所有文件的副本,做测试用
为应用程序提供数字签名:每一个Android应用程序必须要有数字签名才能安装.有两种方法:一种是使用调试密钥(可以在模拟器或者设备上做调试时使用),还有一种就是私钥(为应用程序发布用).当组建Adriod应用程序时组建工具会自动为应用程序提供签名,但是如果想发布应用程序的时候,必须使用自己的私钥.

有两种方法编译应用程序,一种是调试模式,在组建的时候系统会自动加上签名;另一种是发布模式,需要手工添加签名.只有有签名的应用程序才可以安装.这里以调试模式举例:

ant debug  # 或者ant release发布模式
之后会在bin目录下生成名字为<acvitityName>-debug.apk,因为是以调试模式编译的,所以系统已经自动加上了签名。

运行应用程序:运行应用程序,必须经过以下步骤:

创建一个模拟器
要创建一个模拟器,要提供一个target参数,命令android list targets可以列出可用的所有target:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$ android list targets
Available Android targets:
id: 1
     Name: Android 1.1
     Type: Platform
     API level: 2
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2
     Name: Android 1.5
     Type: Platform
     API level: 3
     Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 3
     Name: Google APIs
     Type: Add-On
     Vendor: Google Inc.
     Description: Android + Google APIs
     Based on Android 1.5 (API level 3)
     Libraries:
      * com.google.android.maps (maps.jar)
          API for Google Maps
     Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P

#使用下面的命令创建模拟器:
android create avd --name <avdName> --target <targetID>
接下来会提示是否自定义配置硬件配置信息,如果选择yes,会被继续提示选择配置的各个选项让你选择,如果选择no(默认),就会使用默认的配置信息。

运行模拟器
使用下面的命令运行模拟器:

1
emulator -avd <avdName>
这时候就会出现模拟器的运行画面:)

安装应用程序
1
adb install /appPath/apps.apk
这时,如果安装成功的话,就可以在模拟器的主菜单上看到安装的应用了,点击就可以运行:)

总结:
说了这么多,其实创建一个非Eclipse IDE的android项目就一下几个步骤,使用几个工具:

创建项目:android create project
编写程序
编译,创建应用程序(添加数字签名):ant debug 或者 ant release
运行模拟器:emulator -avd
安装应用程序:adb install
运行程序
注意事项
所有运行的命令都在Linux shell或者Windows命令提示符下运行,所以必须设置好各种环境变量,包括JDK的path变量,JAVA_HOME变量,classpath变量,Android的bin目录和Ant工具也要加入path路径中,否则必须在运行命令时指明完整路径。值得一提的是,jdk的安装路径默认是c:\program files\java,由于空格的原因,可能会导致Ant编译失败。
来自http://gooss.org/apk-package/
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics