创建工程

//MainActivity.java

package com.qsc.hello;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

//activity_main.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal">

android:id="@+id/sample_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="Hello World!" />

//AndroidManifest.xml

package="com.qsc.hello">

android:minSdkVersion="21"

android:targetSdkVersion="28" />

android:icon="@drawable/ic_launcher"

android:label="MyFirstApp">

工程目录结构图:

image.png

使用aapt编译资源

为什么资源也需要编译?其实二进制的资源(比如图片)是不需要编译的,只不过这个"编译"的行为是为了生成resources.arsc和对xml文件进行二进制化等操作,resources.arsc是一张表,里面记录了资源id和其对应的资源,Android为我们提供了R这个类,指定了资源索引(id),根据id就可以从resources.arsc表内查找到具体的资源,xml二进制化是为了系统读取上性能更好。

官方文档

https://developer.android.com/studio/command-line/aapt2

要在 Linux 或 Mac 上从命令行使用 AAPT2,请运行 aapt2 命令。在 Windows 上,请运行 aapt2.exe 命令。AAPT2 支持通过启用增量编译实现更快的资源编译。这是通过将资源处理拆分为两个步骤来实现的:

[编译]:将资源文件编译为二进制格式。

[链接]:合并所有已编译的文件并将它们打包到一个软件包中。

这种拆分方式有助于提高增量编译的性能。例如,如果一个文件发生了改变,则只需要重新编译这个文件。

编译

//编译activity_main.xml

E:HelloDemo>aapt2.exe compile srcmain

eslayoutactivity_main.xml -o compiled

//编译ic_launcher.png

E:HelloDemo>aapt2.exe compile srcmain

esdrawableic_launcher.png  -o compile

d

image.png

在compiled文件夹中,我们看到多了两个文件drawable_ic_launcher.png.flat和layout_activity_main.xml.flat,flat理解为一个中间产物即可,是aapt2特有的,aapt没有,aapt2用它能进行增量编译。

链接

E:HelloDemo>aapt2.exe link -o resources.ap_ -I %ANDROID_HOME%platformsandroid

-28android.jar compiledlayout_activity_main.xml.flat compileddrawable_ic_laun

cher.png.flat --java srcmainjava --manifest srcmainAndroidManifest.xml

image.png

经过这一步骤,会生成resources.ap_和R.java

编译java文件

E:HelloDemo>javac -d build -cp %ANDROID_HOME%platformsandroid-28android.jar

srcmainjavacomqschello*.java

image.png

可以看见我们的 class 文件就出来了。里面有 MainActivity、R,还有 R 的内部类 R$layout等,我们开始执行 dex 转换

dx化

E:HelloDemo>E:Sdkuild-tools28.0.3dx.bat --dex --output=classes.dex build

我们在当前目录下就得到了一个 classes.dex 文件。

image.png

生成未签名的apk

一个正常apk的结构

1.classes.dex

2.资源文件

3.resources.arsc

4.签名摘要

5.可选的 assets 等

我们先把前面3个合起来,这个很简单,首先对我们利用 aapt 构造出来的ap_文件,复制一份,重命名成 app-debug.apk 文件,然后把classes.dex加进去。

image.png

其实现在我们的 app-debug-unsigned.apk 是做完了。可以安装试一下,但是输出如下:

E:HelloDemo>adb install app-debug.apk

adb: failed to install app-debug.apk: Failure [INSTALL_PARSE_FAILED_NO_CERTIFICA

TES: Failed to collect certificates from /data/app/vmdl1588008211.tmp/base.apk:

Attempt to get length of null array]

签名apk

没有证书信息,我们其实可以用android debug key进行签名,这样最简单,我们可以看一下怎么签名呢,我们要用到apksigner这个工具

E:HelloDemo>E:Sdkuild-tools28.0.3apksigner.bat sign -ks C:UsersLanxumit

.androiddebug.keystore app-debug.apk

这时候会让我们输入密码,我们输入android即可。

再次安装apk,安装成功!

E:HelloDemo>adb install app-debug.apk

Success

image.png

image.png

android 手动 打包,android 手动打包apk相关推荐

  1. Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!

    从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...

  2. Mac打包Android的apk,【ReactNative】Mac下分分钟打包 Android apk

    Mac 下 ReactNative如何打包构建Android apk 的应用.该文章还差一个 打包发布到各个平台的教程 总结 打包 jsbundle代码 生成签名 添加签名到app中 打包成apk(打 ...

  3. Ubuntu使用Jenkins配置自动化打包Android APK

    一.前言 我们开发好功能之后,需要编译打包,打包好的可执行程序需要交给测试人员进行测试,但是往往我们的项目大了之后,编译整个项目,打包的过程的时间相对比较长,这个时候如果是在开发人员的电脑上进行代码的 ...

  4. python程序打包成apk_利用Gradle+Python3自动打包Android APK上传到蒲公英。

    利用Gradle+Python3自动打包Android APK上传到蒲公英. 面对每次都要打包一个版本发布给测试,都要手动打包签名~然后登录上传文件.这些繁琐的事情.于是就想到一句很经典的话,(人生苦 ...

  5. Mac打包Android的apk,[Mac][React Native][Android] 打包成apk

    一旦把app写好之后,最后一个步骤就是打包成apk啰 文档中会提到keytool,gradlew assembleRelease. Android打包APK Android 把包成一个APK主要需要几 ...

  6. Android Studio(十二):打包多个发布渠道的apk文件

    Android Studio相关博客: Android Studio(一):介绍.安装.配置 Android Studio(二):快捷键设置.插件安装 Android Studio(三):设置Andr ...

  7. android 自定义apk名,Android Studio多渠道打包、自定义打包APK名称

    现在为了推广产品,会在多个渠道应用市场发布应用,为了统计不同渠道的数据,需要在应用中表明渠道,如果一个一个去修改打包效率会很低.AS为我们提供了简便的方法,可以多渠道打包,一次打包所有的渠道包. 1. ...

  8. android+apk+反编译和再签名打包,Android:apk反编译步骤,打包、签名和逆向工程经验总结...

    思路一.apktool1.通过apktool反编译出资源和smaliapktool d MobileManager.apkF:\Android\decompile\apktoolapktool d M ...

  9. 【Android 安装包优化】APK 打包流程 ( 文件结构 | 打包流程 | 安装流程 | 安卓虚拟机 )

    文章目录 一.APK 文件结构 二.APK 打包流程 三.APK 安装流程 四.安卓虚拟机 一.APK 文件结构 Android 应用的安装包时 以 " .apk " 为后缀的 A ...

最新文章

  1. java中使用bigdec,Java中的BigDecimal的使用
  2. 限制部分Postfix用户只能内部收发的例子(完整版)
  3. Android多媒体学习五:调用Android自带的播放器播放Audio
  4. 操作系统之进程管理:7、进程同步、进程互斥
  5. 【AI视野·今日Robot 机器人论文速览 第十期】Fri, 18 Jun 2021
  6. HashTable、HashSet和Dictionary的区别
  7. git遇到的问题解决方案
  8. paip.验证码识别的意义
  9. 计算机课代表中段考总结,第一学期中段考试总结
  10. 黑鲨会升级鸿蒙吗,黑鲨4首批用户评价已出炉,不吹不黑,优缺点都很明显!...
  11. Qt调试器出现:the selected debugger may be inappropriate for the inferior的解决方案
  12. codewars解题笔记---Are You Playing Banjo?
  13. js find(),findIndex()方法的使用
  14. codeforces1367D 思维模拟
  15. 用python写情书_Fedora写给Python的情书
  16. Optimizer 优化器
  17. Shell脚本 - cut、sort、paste
  18. DX SDK Jun10 安装失败解决方法
  19. 华为的变革_实时3D如何推动整个行业的变革
  20. 模拟地下城与勇士(DNF)的装备强化实现过程

热门文章

  1. GDI文字旋转90度
  2. 一个设计反模式——究竟什么是轮子理论
  3. 面试旧敌之红黑树(直白介绍深入理解)
  4. 989-数组形式的整数加法
  5. 分布式数据库切分规则介绍
  6. 字符串面试题(一)— 字符串逆序
  7. 850 USB 烧录模式
  8. 如何设计Kafka?
  9. centos 搭建日志服务器
  10. Memcached初探