android 手動打包apk

創(chuàng)建工程

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

工程目錄結(jié)構(gòu)圖:

image.png

使用aapt編譯資源

為什么資源也需要編譯科吭?其實(shí)二進(jìn)制的資源(比如圖片)是不需要編譯的剑按,只不過這個"編譯"的行為是為了生成resources.arsc和對xml文件進(jìn)行二進(jìn)制化等操作,resources.arsc是一張表笆檀,里面記錄了資源id和其對應(yīng)的資源,Android為我們提供了R這個類,指定了資源索引(id)橄务,根據(jù)id就可以從resources.arsc表內(nèi)查找到具體的資源,xml二進(jìn)制化是為了系統(tǒng)讀取上性能更好穴亏。
官方文檔
https://developer.android.com/studio/command-line/aapt2
要在 Linux 或 Mac 上從命令行使用 AAPT2蜂挪,請運(yùn)行 aapt2 命令。在 Windows 上嗓化,請運(yùn)行 aapt2.exe 命令棠涮。AAPT2 支持通過啟用增量編譯實(shí)現(xiàn)更快的資源編譯。這是通過將資源處理拆分為兩個步驟來實(shí)現(xiàn)的:

  • [編譯]:將資源文件編譯為二進(jìn)制格式刺覆。
  • [鏈接]:合并所有已編譯的文件并將它們打包到一個軟件包中严肪。

這種拆分方式有助于提高增量編譯的性能。例如谦屑,如果一個文件發(fā)生了改變驳糯,則只需要重新編譯這個文件。

編譯

//編譯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理解為一個中間產(chǎn)物即可,是aapt2特有的悍手,aapt沒有帘睦,aapt2用它能進(jìn)行增量編譯。

鏈接

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

經(jīng)過這一步驟坦康,會生成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 的內(nèi)部類 R$layout等古胆,我們開始執(zhí)行 dex 轉(zhuǎn)換

dx化

E:\HelloDemo>E:\Sdk\build-tools\28.0.3\dx.bat --dex --output=classes.dex build

我們在當(dāng)前目錄下就得到了一個 classes.dex 文件。


image.png

生成未簽名的apk

一個正常apk的結(jié)構(gòu)
1.classes.dex
2.資源文件
3.resources.arsc
4.簽名摘要
5.可選的 assets 等
我們先把前面3個合起來筛璧,這個很簡單赤兴,首先對我們利用 aapt 構(gòu)造出來的ap_文件,復(fù)制一份隧哮,重命名成 app-debug.apk 文件,然后把classes.dex加進(jìn)去桶良。


image.png

其實(shí)現(xiàn)在我們的 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

沒有證書信息曲秉,我們其實(shí)可以用android debug key進(jìn)行簽名,這樣最簡單疲牵,我們可以看一下怎么簽名呢承二,我們要用到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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末识啦,一起剝皮案震驚了整個濱河市负蚊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颓哮,老刑警劉巖家妆,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異冕茅,居然都是意外死亡伤极,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門姨伤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哨坪,“玉大人,你說我怎么就攤上這事乍楚〉北啵” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵炊豪,是天一觀的道長。 經(jīng)常有香客問我拧篮,道長词渤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任串绩,我火速辦了婚禮缺虐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘礁凡。我一直安慰自己高氮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布顷牌。 她就那樣靜靜地躺著剪芍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窟蓝。 梳的紋絲不亂的頭發(fā)上罪裹,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼状共。 笑死套耕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的峡继。 我是一名探鬼主播冯袍,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碾牌!你這毒婦竟也來了康愤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤小染,失蹤者是張志新(化名)和其女友劉穎翘瓮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體裤翩,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡资盅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了踊赠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呵扛。...
    茶點(diǎn)故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筐带,靈堂內(nèi)的尸體忽然破棺而出今穿,到底是詐尸還是另有隱情,我是刑警寧澤伦籍,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布蓝晒,位于F島的核電站,受9級特大地震影響帖鸦,放射性物質(zhì)發(fā)生泄漏芝薇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一作儿、第九天 我趴在偏房一處隱蔽的房頂上張望洛二。 院中可真熱鬧,春花似錦攻锰、人聲如沸晾嘶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垒迂。三九已至,卻和暖如春妒蛇,著一層夾襖步出監(jiān)牢的瞬間娇斑,已是汗流浹背策添。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毫缆,地道東北人唯竹。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像苦丁,于是被迫代替她去往敵國和親浸颓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容