android 手动 打包,android 手动打包apk

创建工程

//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">

工程目录结构图:

ebd967e3ab1f9fc579284a9de46457ff.png

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

278c24026c51a033cc720e6557d906ac.png

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

bea61ca8e6389191edceb84b4a295c09.png

image.png

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

编译java文件

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

srcmainjavacomqschello*.java

9e76588dffeaa129d30a2f008aa72a2a.png

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 文件。

0f974bd6b3ef3f163a2b3457ed75011e.png

image.png

生成未签名的apk

一个正常apk的结构

1.classes.dex

2.资源文件

3.resources.arsc

4.签名摘要

5.可选的 assets 等

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

ad04aa6969551f80685b46b214c8d699.png

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

7c25a0c2e07f7ac22fbe24fc2c3ade4d.png

image.png

682eeb16ad13fe37fc8ec943d0c4df05.png

image.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值