創(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)圖:
使用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
在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
經(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
可以看見我們的 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 文件。
生成未簽名的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)去桶良。
其實(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