`
rain_2372
  • 浏览: 682981 次
  • 性别: 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/
分享到:
评论

相关推荐

    apk打包解包工具

    1. **APK打包**:APK打包过程是将Android应用的所有资源(如Java代码、图片、布局文件等)编译、优化并整合到一个可执行文件中。这个过程通常由Android Studio完成,包括编译源码、生成Dalvik字节码(DEX文件)、...

    android apk打包工具

    在Android应用开发中,APK打包是发布应用的最后步骤,它将编译后的代码、资源文件、配置信息等组合成一个可安装的文件。"Android APK打包工具"旨在简化这个过程,尤其对于需要批量打包或者针对不同渠道进行个性化...

    Android 360apk 美团apk打包工具.zip

    360apk打包工具MCPTool使用方法1. 将apk文件放到MCPTool目录下2. 将apk文件拖拽到MCPTool.bat上3. 执行完成后会在当前目录下生成各个渠道的apk文件美团apk打包工具1.将需要打包的apk放在本目录下2.在本目录下进入...

    APK打包解包工具

    APK打包解包工具,这个是手机版本,完全可以完美打包以安装apk

    android应用APK打包签名方法文档

    ### Android应用APK打包签名方法详解 #### 一、引言 在Android开发过程中,APK的打包与签名是一项至关重要的环节。无论是开发者在本地测试应用,还是将应用提交到Google Play商店,都需要确保APK文件正确地进行了...

    apk打包工具

    在Android开发过程中,APK打包工具是至关重要的环节,它能将开发者编写的代码、资源文件等合并成一个可安装的APK应用包。本文将详细介绍"apk打包工具"及其在修改Android应用图标方面的应用。 首先,APK是Android...

    apk打包工具(java)

    APK打包工具则是用于将开发者编写的代码、资源文件、库等整合成一个可安装的APK文件的关键环节。Java版的APK打包工具提供了一种在命令行环境下或者集成到自动化构建流程中创建APK的方式。下面我们将深入探讨这个主题...

    图形化apk打包解包签名工具apktool.rar

    《图形化apk打包解包签名工具apktool详解》 在Android应用开发中,APK文件是应用程序的载体,它的打包、解包、反编译以及签名等操作是开发者日常工作中必不可少的环节。为了使这些过程更为便捷,出现了许多工具,...

    APK打包解包签名工具集

    在Android应用开发中,APK打包、解包和签名是至关重要的步骤,这些操作涉及到应用程序的构建、调试和发布流程。下面将详细解释这些概念及其重要性。 首先,我们要了解APK是什么。APK(Android Package)是Android...

    APK反编译、APK打包

    在APK打包过程中,签名是至关重要的一步。Android系统要求每个APK都必须由开发者私有的数字证书签名,以验证应用的身份和完整性。如果没有正确的签名,APK将无法在设备上安装。对于开发环境,可以使用自签证书;而...

    apk打包解包签名工具apktool

    【标题】"apk打包解包签名工具apktool"是一个针对Android应用(APK)的工具,主要用于APK的打包、解包以及反编译过程。它为开发者和逆向工程师提供了一个图形化的用户界面,使得操作更为直观和简便,无需在命令行中...

    AndroidAPK打包工具

    "Android APK打包工具"就是一款专为此目的设计的实用工具,它简化了APK签名的过程,使得开发者可以更快速、更方便地完成打包任务。下面将详细介绍这个过程及其相关知识点。 首先,我们需要理解APK是什么。APK...

    Unity多Apk打包工具

    "Unity多Apk打包工具"就是为了满足这种需求而存在的。 这个工具提供了两种打包方式:工具类型和代码类型。工具类型更适合不熟悉编程的用户,只需将所需的资源和配置文件拖拽到指定的界面或工具中,点击打包按钮,...

    将assets下的APK打包

    该类目的在于将多个assets下面的APK打包到SD卡中,该类解决了将多个APK打包成一个APK的问题

    图形化apk打包解包签名工具apktool.exe 不用安装

    "图形化apk打包解包签名工具apktool.exe"就是为了简化这些操作而设计的工具。 Apktool是一款非常实用的开源工具,它主要用于APK文件的反编译和重新打包。在传统的方法中,这些操作通常需要开发者通过命令行执行一...

    APK打包需知.doc

    APK打包是发布应用程序的关键步骤,它涉及到多个环节,包括编译、签名、优化和对齐等。下面将详细阐述在打包APK时需要注意的一些关键知识点。 首先,APK的签名对于应用的分发和更新至关重要。在描述中提到,APK必须...

    Android_apk打包签名

    在Android开发过程中,APK打包签名是一个至关重要的环节,它涉及到应用的安全性和可分发性。本文将详细讲解Android APK的打包和签名过程,以及如何使用Eclipse、IntelliJ IDEA等工具进行签名操作。 首先,理解签名...

Global site tag (gtag.js) - Google Analytics