android-apk解包打包

article/2025/9/23 5:34:01

title: android-apk解包打包
categories: Android
tags: [android, 加壳]
date: 2022-09-28 10:29:51
comments: false
mathjax: true
toc: true

android-apk解包打包, 以下所有操作都需要在配置好 java 环境下进行


前篇

  • android apk解包和打包 - https://blog.csdn.net/u011435933/article/details/89555328
  • apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程 - https://blog.51cto.com/u_15328720/3384769
  • apk解包修改后重新打包 (好文) - https://blog.csdn.net/qq_16692517/article/details/107220707
  • Android apk反编译,smali文件修改,重新打包 - https://blog.csdn.net/q610098308/article/details/105336399
  • java 反编译 修改smali和重新打包 (好文) - https://blog.csdn.net/weixin_28947723/article/details/115075813
  • 几种Android混淆和逆向工具介绍 - https://blog.51cto.com/u_15060511/4080326
  • Android反编译工具 apktool 、dex2jar、jd-gui、jadx的对比及使用 - https://zhuanlan.zhihu.com/p/389584833
  • https://developer.aliyun.com/article/534391
  • 相关工具下载
    • jd-gui 下载 - https://github.com/java-decompiler/jd-gui/releases
    • dex2jar - https://github.com/pxb1988/dex2jar
    • smali 与 baksmali 下载 - https://bitbucket.org/JesusFreke/smali/downloads/?tab=downloads
    • jadx - https://github.com/skylot/jadx/releases
    • apktool - https://bitbucket.org/iBotPeaches/apktool/downloads/
    • bundletool - https://github.com/google/bundletool/releases
      • 使用说明 - https://developer.android.com/studio/command-line/bundletool
    • AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads

反编译流程图


使用 apktool

  • 解包 apk

    $ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar d [test_hi.apk] -o [test_hi]
    

    会将 test_hi.apk 解包到 test_hi 目录

  • 打包 apk

    $ java -jar -Duser.language=en -Dfile.encoding=UTF8 apktool.jar b [test_hi]
    

    test_hi 目录打包, 在 test_hi/dist 目录下生成 test_hi.apk

    • 打包完后需要 4 字节对齐

      $ zipalign -p -f -v 4 [test_hi.apk] [test_hi_align.apk]
      
      • 不对齐的情况下, 在 Android 11+ (R+, sdk 30+) 机子安装 apk 会报错: Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary]
    • 此时生成的 apk 需要签名一下, 否安装报错

      adb: failed to install test_hi.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES: Failed to collect certificates from /data/app/vmdl2044401184.tmp/base.apk: Attempt to get length of null array]
      

      签名参考 [签名 apk 包](#签名 apk 包)


踩坑

apk 文件夹编译 apk 报资源错误

错误: Error: Resource is not public

解决办法: 在 反编译 apk 时, 可以通过 -r 参数来避免resc的反编译,见下图。这样在打包的时候就不会重新编译 resc 文件包括 xml

参考: 反编译工具apktool使用问题 - https://www.jianshu.com/p/47a5511e17bf


使用 jadx 工具查看 apk (推荐)

  • GitHub - https://github.com/skylot/jadx/releases

  • 使用, 直接拖动 apk, jar 到工具即可

    image-20221020160031677


使用 smali 工具

使用的是 baksmali-2.2.2.jarsmali-2.2.2.jar

  • dex 解包出 smali

    $ java -jar baksmali-2.2.2.jar d [classes.dex] -o [myout]
    

    解出 classes.dex 的 smali 会生成到 myout 目录下

  • smali 打包成 dex

    java -jar smali-2.2.2.jar assemble [myout] -o [my_classes.dex]
    

    myout 目录打包成 my_classes.dex 文件


签名 apk 包

  • 命令

    $ java -jar apksigner.jar sign -verbose --v1-signing-enabled false --v2-signing-enabled true --ks [证书文件.jks] --ks-key-alias [证书别名] --ks-pass pass:[证书密码] --key-pass pass:[别名密码] --out [out_sign.apk] --in [in_unsign.apk]
    
    • 不能使用一下命令打包

      $ jarsigner -verbose -keystore [证书文件.jks] -storepass [证书密码] -signedjar [签名后输出文件.apk] [需要签名的文件.apk] [证书别名]
      

      安装在 安卓 11+ 机子上会报错: ERROR: Target SDK version 32 requires a minimum of signature scheme v2; the APK is not signed with this or a later signature scheme


dex 转 jar

dex2jar 和 jd-gui 只是查看源码的工具

  • 使用 dex2jar 工具

    $ d2j-dex2jar.bat [classes3.dex] --force -o [aaa.jar]
    dex2jar classes3.dex -> aaa.jar
    

jar 装 dex

  • 先 cd 到 android sdk 构建工具目录下, 实测 30- 的才可以使用以下的命令

    $ cd android_sdk\build-tools\30.0.3
    $ dx.bat --dex --output=C:\AndroidLib02.dex C:\JavaLab.main.jar

java 转 smali

  • Android Studio配置超实用java转smali插件 - https://blog.csdn.net/u011426115/article/details/112855820

java2smali 插件一款 Android Studio 上非常实用的插件。通过该插件可以将 Java或者Kotlin 的源文件转为 smali 文件。使用该插件可以方便我们做如下事情:

  1. 对比java源文件学习smali语法

  2. apk重打包过程中Smali插桩

使用插件

  1. plugins 中搜索 java2smali 安装, 然后重启 as

  2. 打开 java 代码, Build -> compile to smali

    image-20220929141600475


使用 jd-gui 查看 jar 代码 (不推荐)

  • 直接将 classes3-dex2jar.jar 拖入 jd-gui 即可

    image-20220928164212278

    使用 [使用 jadx 工具查看 apk](#使用 jadx 工具查看 apk) 会更好, 反编译后跟接近 源代码


Dex、Smali、Class、Java、Jar 之间的相互转换

工具

工具作用
javacjava------>class
ddxclass------>dex
baksmalidex------>smali
smalismali------>dex
dex2jardex------>jar(class的压缩包)
apktoolapk------>smali

Android源代码从编译到运行

  • java 转 class

    javac Test.java
    
  • class 转 dex

    ddx --dex --output=Test.dex Test.class
    
  • dex 转 smali

    java -jar baksmali.jar -o [输出文件夹] dex文件
    
  • smali 转 dex

    java -jar smali.jar -o 目标dex文件 [smali文件夹] 
    
  • dex 转 jar

    d2j-dex2jar.bat dex文件
    

aab 与 apk 互转

  • Android apk和aab互相转换 - https://blog.51cto.com/u_12300179/5267430

aab 转 apk

  • a

apk 转 aab

  • apk 转 aab - https://juejin.cn/post/6982111395621896229
    • GitHub - https://github.com/37sy/build_aab_tool
  • APK2AAB - https://github.com/sensei-z/APK2AAB

37 手游构建工具使用
  • apk 转 aab - https://juejin.cn/post/6982111395621896229

实测:

  • 加固后的 apk 构建 aab

    • 直接安装 aab, 命令: java -jar E:/bundletool-all-1.12.1.jar install-apks --apks=I:\base.apks

      闪退, 报错: Didn't find class "androidx.core.app.CoreComponentFactory"

    • 将 aab 解压出来的 apk, 运行正常

  • 未加固的 apk 构建 aab

    • 直接安装 aab, 报错找不到 libmain.so 动态库
    • 将 aab 解压出来的 apk, 运行正常

解决办法:

  • 在导出 apks 文件的命令中加入 --mode=universal 参数, 这样导出的 apks 无论是 加固 还是 不加固 的, 都能正常运行

aab签名

  • 37手游安卓团队 - apk转化aab格式 - https://juejin.cn/post/6982111395621896229

    • GitHub - https://github.com/37sy/build_aab_tool
  • 能使用 jarsigner 为 aab 签名。签名aab的时候不需要使用v2签名,使用JDK的普通签名就行。

    jarsigner -digestalg SHA1 -sigalg SHA1withRSA \
    -keystore luojian37.jks \
    -storepass ****** \
    -keypass ****** \
    base.aab \
    ******
    

AndroidManifest.xml 的 解码 编码

  • 还原AndroidManifest.xml明文的方法 - https://blog.csdn.net/wwt831208/article/details/54692561

  • 下载 AXMLPrinter2.jar - https://code.google.com/archive/p/android4me/downloads

  • xml2axml (不错的转换工具) - https://github.com/codyi96/xml2axml

    • xml to axml

      java -jar xml2axml-2.1.0.jar e [AndroidManifest-readable-in.xml] [AndroidManifest-bin-out.xml]
      
    • axml to xml

      java -jar xml2axml-2.1.0.jar d [AndroidManifest-bin-in.xml] [AndroidManifest-readable-out.xml]
      

命令行构建应用

  • 从命令行构建您的应用 - https://developer.android.com/studio/build/building-cmdline#bundletool-build


http://chatgpt.dhexx.cn/article/XIvBy464.shtml

相关文章

Vue 3 之什么是 解包

Vue 3 之什么是 解包 前言结合代码分析总结 前言 从 Vue2 升到 Vue3 之后,用法上有了很大很大的变化 Vue3可以通过 ref 来声明一些响应式数据,可以是 any 类型的响应式数据 ,在 script 标签中访问和修改这个属性需要用 变量名.value Vue3 3.1 在 template 模板中使用定义的数…

python的解包

解包在英文里叫做 Unpacking,就是将容器里面的元素逐个取出来(防杠精:此处描述并不严谨,因为容器中的元素并没有发生改变)放在其它地方,好比你老婆去菜市场买了一袋苹果回来分别发给家里的每个成员&#xf…

apk解包+修改源码+重新打包 修改Android端app教程 修改apk文件教程

修改之前一定要先安装java开发环境,不会装的去自行百度。文章较长,耐心阅读。 一直在做Android应用开发,但对于从自己手中输出的apk包,了解并不是很深。最近想研究一下,消除下自己的一些技术盲点。 好吧,…

Python中的解包用法

Python中的解包用法 解包(unpacking:解包,拆包),基本意思将容器里面的元素逐个取出来使用。封包(packing:封包,打包)基本意思将多个元素合起来作为一个整体使用。 可迭代…

SIP协议说明以及报文字段解析

SIP协议的概念: SIP 协议,即 会话初始协议(Session Initiation Protocol),是一个应用层的 点对点协议,用于初始、管理和终止网络中的语音和视频会话,是 GB28181 的核心之一。 SIP是一个基于文本…

SIP 协议格式简介

消息体结构,由三部分组成: Request-Line / Status-Line (请求行 / 状态行)Header (消息头)Body (正文) 示例: Request-Line / Status-Line 介绍 Request-Line 格式: MethodRequest-URISIP-VersionCRLFINVITEsip:10011.1.1.1:5060…

会话初始协议---SIP协议【详解】

目录 ​ 一、SIP协议简介 二、SIP消息的两种会话模式 1、Session Model 2、Pager Model 三、SIP消息体格式 1、请求行(request-line) 2、状态行(status-line) 3、消息头 四、SIP消息举例 1、MESSAGE消息(Pager Model) 2、REGISTER消息 &…

SIP协议-02 原理讲解

文章目录 1 SIP实现机制2 SIP网络元素2.1 用户代理2.2 代理服务器2.3 重定向服务器2.4 位置服务器2.5 注册服务器 3 SIP中的几个重要概念3.1 Messages(消息)3.2 Dialog(对话)3.3 Transaction(事务)3.4 Session(会话) 4 工作流程4.1 登记注册4.2 建立呼叫4.3 重定向呼叫 5 SIP超…

SIP协议(二)

语音编码,语音帧,会议室 (1)语音编码,语音帧 (2)补充会议室的抓包 语音编码 现主要有的语音编码有: G.711, G.723, G.726 , G.729, ILBC,QCELP, EVRC, AMR, SMV 各种编解码都有其…

SIP协议解析与实现

SIP协议解析与实现 本文将按照RFC3261逐步的介绍SIP协议,介绍了c和c语言的实现,分析了osip库的使用和实现。 第一章 概述 一 概述 SIP协议是一个基于应用层的会话控制协议。它可以创建、修改、终止多媒体会话(会议),也可以邀请参与者加入到一个现有的…

SIP协议-01 简介与入门

文章目录 1 介绍1.1 VoIP技术1.2 SIP(Session Initiation Protocol)1.3 SIP承载1.4 SIP的几个主要标准协议 2 SIP协议栈2.1 PJSIP协议栈2.2 ReSIProcate协议栈2.3 OPAL协议栈2.4 VOCAL协议栈2.5 sipX协议栈2.6 oSIP协议栈 SIP(Session Initia…

通信系列2: 深入浅出SIP协议

传统电话是电磁波的通信,当电话技术发展到IP技术时代,SIP协议成为了电话通信标准协议,不仅可以通电话、还可以收发信息、视频、开会、放PPT。事实上,今天的通信业已全面采用SIP协议作为通信标准,无论是固定电话、还是移…

SIP协议简介(一)之SIP基本的概述

本篇文章主要是对RFC3261翻译进行的,也包含着自己的一些理解。希望能给需要的人带来一些帮助 补充说明:RFC即Request For Comments(RFC),是一系列以编号排定的文件。文件收集了有关互联网相关信息,以及UNI…

SIP协议(一)

熟悉SIP的一些基本常识概念相关协议, 网络元素,分层结构, 不同请求消息类型,响应消息类型 SDP的一些概念基础 SIP SIP(Session Initiation Protocol)会话初始化协议,是有IETE(I…

SIP协议简介(比较全面)

介绍 通信提供商及其合作伙伴和用户越来越渴求新一代基于 IP 的服务。现在有了 SIP协议(会话启动协议),一解燃眉之急。SIP协议 是不到十年前在计算机科学实验室诞生的一个想法。它是第一个适合各种媒体内容而实现多用户会话的协议&#xff0…

【入门篇】SIP 协议详解

本博客转载自:https://xiaxl.blog.csdn.net/article/details/104661248 SIP 协议详解 2013年参与过一个“视频通讯的App”项目,使用Sip协议通信。当时通信协议这块不是自己负责,加上时间紧、任务重等方面的原因,一直未对Sip协议进…

[Appium] Appium自动化测试原理及配置项

Appium自动化测试原理及配置项 一、App自动化测试原理 通过设计自动化脚本,通过发送指令到Appium Server,然后Appium Server转发指定到Android SDK框架来操作被测手机,这个类似于selenium通过浏览器驱动来操作浏览器 Android SDK不同系统不…

Appium 使用

前提是手机易经通过adb连接到电脑 1、打开Appium 点击startServer 2、打开Appium Inspector 填写下面的数据 desired_caps常用参数:platformName 平台的名称:iOS, Android, or FirefoxOSplatformVersion 设备系统版本号deviceName 设备…

Appium+Python第一篇:appium的基本使用及启动APP

一、appium的基本使用 appium环境安装 1、安装Android SDK (1)配置环境变量 用户变量的path添加以下三个路径: %ANDROID_HOME%\build-tools\31.0.0 %ANDROID_HOME%\platform-tools %ANDROID_HOME%\tools - 系统变量添加: 变量…

Appium - 入门指南(偏重于实际操作)

前言 此文章 偏向于实操 appium支持在不同平台上(windows,linux、mac) - 使用测试脚本(支持不同语言C #,json,Ruby等等) - 模拟测试各个平台的app(web、windows、mobile等&#xff…