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">
工程目錄結構圖:
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android服务的启动过程,Andro
- 下一篇: layui tab选项卡外部html页面