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

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,具体使用大家可以自己去看看这个库的具体使用介绍。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值