Android apk打包流程,混淆,差分包的生成和合并新的apk

本文详细介绍了Android应用APK的打包流程,包括使用各种工具如aapt、javac、dx等进行编译、混淆、签名及对齐等步骤。同时,深入解析了差分包的生成与合并过程,提供了bsdiff工具和BigNews库的具体使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android apk打包流程:

  1. 通过aapt工具,将manifest文件编译后,生成manifest.java文件,为res目录下的资源生成R.java文件
  2. 并使用aidl工具,将aidl文件生成相应的java文件
  3. 通过javac工具,将项目中的业务逻辑的java文件,和前面生成的java文件编译成class文件
  4. proguard混淆,同时生成proguardMapping.txt文件,这一步可选
  5. 通过dx工具将所有class文件(包括第三方库的class),生成dex文件
  6. 还是使用aapt工具,将res目录下的资源,assets目录下是文件打包成一个.ap_ 文件
  7. apkbuilder将所有的dex文件,manifest.xml文件、 .ap_文件、so文件打包为一个未签名apk文件
  8. 通过jarsign工具,配合Debug or Release Keystore文件,对unsigned.apk进行签名生成signed.apk文件
  9. 通过zipalign工具,将signed.apk文件进行对齐操作,方便加载到内存时,少占用内存空间。

下面是官方给出的生成apk的流程图
在这里插入图片描述
下图是生成apk的详细流程图:
在这里插入图片描述

apk混淆规则:

  1. R.java文件不能混淆,如果混淆,反射后无法获取资源
  2. support v4,v7包中的类不能混淆,这些类是系统的提供的,如果混淆后,系统也许无法调用了
  3. 泛型
  4. 自定义控件
  5. 实现Serializable的类不能混淆,防止反序列化时出错
  6. 四大组件和Application要在manifest中声明,所以也不能混淆

差分包生成与合并:

方式一:使用bsdiff工具,这个工具下载地址 https://github.com/cnSchwarzer/bsdiff-win
将bsdiff工具下载到本地后,打开可以看到可以看到如下两个工具:
在这里插入图片描述
通过cmd,打开命令行窗口,将预先准备好的old.apk和new.apk两个文件复制到bsdiff.ext所在的目录下,进入到bsdiff.ext所在的目录,然后执行如下命令:
bsdiff old.apk new.apk patch.diff
在这里插入图片描述
输入完上面的命令后,点击回车键,变生成了patch.diff文件,这个生成的文件,文件名称和文件类型可以随意定义。下图红框中的patch,diff便是生成的new.apk和old.apk的差分包。
在这里插入图片描述
以上便是演示,如何根据两个不同版本的apk,来生成差分包。下面继续介绍,如果将old.apk和patch.diff文件进行合并,形成新的apk。这次,要将old.apk和patch.diff文件复制到bsdiff.exe程序所在的目录下,如下图所示:
在这里插入图片描述
接着打开命令行窗口,进入bsdiff.exe程序所在的目录,输入如下命令
bspatch old.apk new.apk patch.diff
点击回车键后,如下图所示:
在这里插入图片描述
可以看到,bsdiff.exe目录下,生成了一个new.apk的文件,这个文件就是old.apk和patch.diff文件合成的新的apk文件。
以上便是使用差分包和老的版本的apk,合成新版本的apk的过程。平时开发项目,新版本的apk的合成,是在客户端(也就是用户的手机上)完成的,所以,上面采用bsdiff工具这种方式是不适合的,下面介绍另外一个中方式:采用BigNews这个库,下载地址 https://github.com/ha-excited/BigNews,根据这个库的使用说明集成这个库,准备好old.apk和差分包patch.diff文件即可。
在项目根build.gradle添加代码:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

你项目模块内的build.gradle添加代码,然后Gradle Sync:

  dependencies {
        compile 'com.github.ha-excited:BigNews:0.1.2'
    }

调用方法:

合并: 从差分包/升级包和老安装包合并升级到新安装包,新安装包放在newApkPath。

/**

  • oldApkPath: 老安装包路径
  • newApkPath: 新安装包路径(输出)
  • patchPath: 升级/差分包路径
  • return: 成功返回true,否则为false。
    */
    BigNews.make(oldApkPath, newApkPath, patchPath);
    差分: 将新安装包和老安装包的差异打包为差分包/升级包,输出到patchPath。

/**

  • oldApkPath: 老安装包路径
  • newApkPath: 新安装包路径
  • patchPath: 升级/差分包路径(输出)
  • return: 成功返回true,否则为false。
    */
    BigNews.diff(oldApkPath, newApkPath, patchPath);

一般我们使用make方法进行差分包和老的安装包的合成。

当然还有其它的库,比如 ApkPatchLibrary,具体使用大家可以自己去看看这个库的具体使用介绍。

### 关于单文件APK生成 单文件APK是指将所有的资源、代码以及依赖库打包成一个独立的APK文件,而不是通过动态加载外部模块或其他方式实现功能扩展。以下是关于单文件APK构建的一些核心概念技术细节。 #### 1. 使用Gradle配置生成单文件APKAndroid开发中,默认情况下,Gradle会自动处理项目中的所有依赖项并将它们打包到最终的APK中。如果希望确保生成的是单文件APK,则需要确认以下几点: - **移除未使用的依赖**:减少不必要的第三方库可以降低复杂度并简化APK结构。 - **禁用Split APKs**:默认情况下,某些配置可能会启用分包策略(如ABI分离)。可以通过修改`build.gradle`来关闭这些设置[^1]: ```gradle android { ... splits { abi { enable false // 禁用ABI拆分 } } } ``` #### 2. 手动创建APK流程 对于更深入的理解或者特殊需求场景下的手动操作,可以参考Java环境下的APK生成过程[^2]。具体步骤如下所示: - 编译源码为`.class`文件; - 将编译后的类转换为Dalvik字节码(使用dx工具或将命令替换为现代版本中的d8工具); - 创建资源表并通过aapt/aapt2工具打包res/assets/manifest等静态数据; - 合并上述两部分成果,并利用zipalign优化压缩效率; - 对齐后的归档施加签名算法完成身份验证环节。 注意,在实际执行过程中可能还需要额外考虑ProGuard混淆选项的应用以保护知识产权不受侵犯等问题。 #### 示例代码片段 下面展示了一个简单的脚本用于演示如何从零开始制作基础版别的APK文件(假设已具备相应输入素材): ```bash #!/bin/bash # 定义变量路径 SOURCE_DIR="path/to/source" OUTPUT_APK="output.apk" # 步骤一: 编译 Java 源程序至 DEX 格式 javac $SOURCE_DIR/*.java -d ./classes/ d8 --release ./classes/*.class --output=./dex/ # 步骤二: 处理 AndroidManifest.xml 其他资源 aapt package -f \ -M $SOURCE_DIR/AndroidManifest.xml \ -S $SOURCE_DIR/res \ -I ~/Library/Android/sdk/platforms/android-30/android.jar \ -F unaligned.apk.dexedresources.dex # 步骤三: 添加 dex 文件进入 apk 中 zip -r9 unaligned.apk ./dex/classes.dex # 步骤四: 进行对齐调整 ~/Library/Android/sdk/build-tools/latest/zipalign -p 4 unaligned.apk aligned.apk # 步骤五: 数字证书签署 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore aligned.apk alias_name mv aligned.apk ${OUTPUT_APK} rm -rf classes/ dex/ *.apk.unaligned ``` 以上仅为理论框架示意,请依据实际情况调整参数适配不同平台异。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值