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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

</LinearLayout>
//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.qsc.hello">

    <uses-sdk
        android:minSdkVersion="21"
        android:targetSdkVersion="28" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="MyFirstApp">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

工程目录结构图:

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 src\main\res\layout\activity_main.xml -o compiled
//编译ic_launcher.png
E:\HelloDemo>aapt2.exe compile src\main\res\drawable\ic_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%\platforms\android
-28\android.jar compiled\layout_activity_main.xml.flat compiled\drawable_ic_laun
cher.png.flat --java src\main\java --manifest src\main\AndroidManifest.xml
image.png

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

编译java文件

E:\HelloDemo>javac -d build -cp %ANDROID_HOME%\platforms\android-28\android.jar
src\main\java\com\qsc\hello\*.java
image.png

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

dx化

E:\HelloDemo>E:\Sdk\build-tools\28.0.3\dx.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:\Sdk\build-tools\28.0.3\apksigner.bat sign -ks C:\Users\Lanxumit\
.android\debug.keystore app-debug.apk

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

再次安装apk,安装成功!

E:\HelloDemo>adb install app-debug.apk
Success
image.png
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容