當前位置:首頁 » 安卓系統 » android編譯順序

android編譯順序

發布時間: 2023-08-16 12:03:53

㈠ Android工程編譯順序是怎麼樣的先編譯哪個模塊,後編譯哪個模塊由誰來決定的

在ActivityManifest.xml聲明的Activity中,含有
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
是最先執行的,其它類就的順序在這個主函數中先調用或跳轉哪個就是哪個了

㈡ android 怎麼編譯so文件

android NDK編譯多個so文件

android編譯系統的makefile文件Android.mk寫法如下

(1)Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件。由於一般情況下

Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:

LOCAL_PATH:=$(call my-dir)

上面的語句的意思是將LOCAL_PATH變數定義成本文件所在目錄路徑。

(2)Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始

以include $(BUILD_XXX)結束。

include $(CLEAR_VARS)

CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,

如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫

include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。

include $(BUILD_EXECUTABLE)表示編譯成可執行程序

(3)舉例如下(frameworks/base/libs/audioflinger/Android.mk):

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS) 模塊一

ifeq ($(AUDIO_POLICY_TEST),true)

ENABLE_AUDIO_DUMP := true

endif

LOCAL_SRC_FILES:= \

AudioHardwareGeneric.cpp \

AudioHardwareStub.cpp \

AudioHardwareInterface.cpp

ifeq ($(ENABLE_AUDIO_DUMP),true)

LOCAL_SRC_FILES += AudioDumpInterface.cpp

LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP

endif

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_CFLAGS += -DGENERIC_AUDIO

endif

LOCAL_MODULE:= libaudiointerface

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_SRC_FILES += A2dpAudioInterface.cpp

LOCAL_SHARED_LIBRARIES += liba2dp

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

LOCAL_C_INCLUDES += $(call include-path-for, bluez)

endif

include $(BUILD_STATIC_LIBRARY) 模塊一編譯成靜態庫

include $(CLEAR_VARS) 模塊二

LOCAL_SRC_FILES:= \

AudioPolicyManagerBase.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libmedia

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudiopolicybase

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_A2DP

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

include $(BUILD_STATIC_LIBRARY) 模塊二編譯成靜態庫

include $(CLEAR_VARS) 模塊三

LOCAL_SRC_FILES:= \

AudioFlinger.cpp \

AudioMixer.cpp.arm \

AudioResampler.cpp.arm \

AudioResamplerSinc.cpp.arm \

AudioResamplerCubic.cpp.arm \

AudioPolicyService.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase

LOCAL_CFLAGS += -DGENERIC_AUDIO

else

LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy

endif

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudioflinger

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

LOCAL_SHARED_LIBRARIES += liba2dp

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

ifeq ($(TARGET_SIMULATOR),true)

ifeq ($(HOST_OS),linux)

LOCAL_LDLIBS += -lrt -lpthread

endif

endif

ifeq ($(BOARD_USE_LVMX),true)

LOCAL_CFLAGS += -DLVMX

LOCAL_C_INCLUDES += vendor/nxp

LOCAL_STATIC_LIBRARIES += liblifevibes

LOCAL_SHARED_LIBRARIES += liblvmxservice

# LOCAL_SHARED_LIBRARIES += liblvmxipc

endif

include $(BUILD_SHARED_LIBRARY) 模塊三編譯成動態庫

(4)編譯一個應用程序(APK)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory-->直譯(建立在java子目錄中的所有Java文件)

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build-->直譯(創建APK的名稱)

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK-->直譯(告訴它來建立一個APK)

include $(BUILD_PACKAGE)

(5)編譯一個依賴於靜態Java庫(static.jar)的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# List of static libraries to include in the package

LOCAL_STATIC_JAVA_LIBRARIES := static-library

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK

include $(BUILD_PACKAGE)

(6)編譯一個需要用平台的key簽名的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := platform

# Tell it to build an APK

include $(BUILD_PACKAGE)

(7)編譯一個需要用特定key前面的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := vendor/example/certs/app

# Tell it to build an APK

include $(BUILD_PACKAGE)

(8)添加一個預編譯應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Mole name should match apk name to be installed.

LOCAL_MODULE := LocalMoleName

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

(9)添加一個靜態JAVA庫

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Any libraries that this library depends on

LOCAL_JAVA_LIBRARIES := android.test.runner

# The name of the jar file to create

LOCAL_MODULE := sample

# Build a static jar file.

include $(BUILD_STATIC_JAVA_LIBRARY)

(10)Android.mk的編譯模塊中間可以定義相關的編譯內容,也就是指定相關的變數如下:

LOCAL_AAPT_FLAGS

LOCAL_ACP_UNAVAILABLE

LOCAL_ADDITIONAL_JAVA_DIR

LOCAL_AIDL_INCLUDES

LOCAL_ALLOW_UNDEFINED_SYMBOLS

LOCAL_ARM_MODE

LOCAL_ASFLAGS

LOCAL_ASSET_DIR

LOCAL_ASSET_FILES 在Android.mk文件中編譯應用程序(BUILD_PACKAGE)時設置此變數,表示資源文件,

通常會定義成LOCAL_ASSET_FILES += $(call find-subdir-assets)

LOCAL_BUILT_MODULE_STEM

LOCAL_C_INCLUDES 額外的C/C++編譯頭文件路徑,用LOCAL_PATH表示本文件所在目錄

舉例如下:

LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

LOCAL_C_INCLUDES += $(LOCAL_PATH)/src

LOCAL_CC 指定C編譯器

LOCAL_CERTIFICATE 簽名認證

LOCAL_CFLAGS 為C/C++編譯器定義額外的標志(如宏定義),舉例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

LOCAL_CLASSPATH

LOCAL_COMPRESS_MODULE_SYMBOLS

LOCAL_COPY_HEADERS install應用程序時需要復制的頭文件,必須同時定義LOCAL_COPY_HEADERS_TO

LOCAL_COPY_HEADERS_TO install應用程序時復制頭文件的目的路徑

LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp為文件後綴,你可以通過LOCAL_CPP_EXTENSION指定C++文件後綴名

如:LOCAL_CPP_EXTENSION := .cc

注意統一模塊中C++文件後綴必須保持一致。

LOCAL_CPPFLAGS 傳遞額外的標志給C++編譯器,如:LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CXX 指定C++編譯器

LOCAL_DX_FLAGS

LOCAL_EXPORT_PACKAGE_RESOURCES

LOCAL_FORCE_STATIC_EXECUTABLE 如果編譯的可執行程序要進行靜態鏈接(執行時不依賴於任何動態庫),則設置LOCAL_FORCE_STATIC_EXECUTABLE:=true

目前只有libc有靜態庫形式,這個只有文件系統中/sbin目錄下的應用程序會用到,這個目錄下的應用程序在運行時通常

文件系統的其它部分還沒有載入,所以必須進行靜態鏈接。

LOCAL_GENERATED_SOURCES

LOCAL_INSTRUMENTATION_FOR

LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME

LOCAL_INTERMEDIATE_SOURCES

LOCAL_INTERMEDIATE_TARGETS

LOCAL_IS_HOST_MODULE

LOCAL_JAR_MANIFEST

LOCAL_JARJAR_RULES

LOCAL_JAVA_LIBRARIES 編譯java應用程序和庫的時候指定包含的java類庫,目前有core和framework兩種

多數情況下定義成:LOCAL_JAVA_LIBRARIES := core framework

注意LOCAL_JAVA_LIBRARIES不是必須的,而且編譯APK時不允許定義(系統會自動添加)

LOCAL_JAVA_RESOURCE_DIRS

LOCAL_JAVA_RESOURCE_FILES

LOCAL_JNI_SHARED_LIBRARIES

LOCAL_LDFLAGS 傳遞額外的參數給連接器(務必注意參數的順序)

LOCAL_LDLIBS 為可執行程序或者庫的編譯指定額外的庫,指定庫以"-lxxx"格式,舉例:

LOCAL_LDLIBS += -lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_MODULE 生成的模塊的名稱(注意應用程序名稱用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)

LOCAL_MODULE_PATH 生成模塊的路徑

LOCAL_MODULE_STEM

LOCAL_MODULE_TAGS 生成模塊的標記

LOCAL_NO_DEFAULT_COMPILER_FLAGS

LOCAL_NO_EMMA_COMPILE

LOCAL_NO_EMMA_INSTRUMENT

LOCAL_NO_STANDARD_LIBRARIES

LOCAL_OVERRIDES_PACKAGES

LOCAL_PACKAGE_NAME APK應用程序的名稱

LOCAL_POST_PROCESS_COMMAND

LOCAL_PREBUILT_EXECUTABLES 預編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用,指定需要復制的可執行文件

LOCAL_PREBUILT_JAVA_LIBRARIES

LOCAL_PREBUILT_LIBS 預編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用, 指定需要復制的庫.

LOCAL_PREBUILT_OBJ_FILES

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES

LOCAL_PRELINK_MODULE 是否需要預連接處理(默認需要,用來做動態庫優化)

LOCAL_REQUIRED_MODULES 指定模塊運行所依賴的模塊(模塊安裝時將會同步安裝它所依賴的模塊)

LOCAL_RESOURCE_DIR

LOCAL_SDK_VERSION

LOCAL_SHARED_LIBRARIES 可鏈接動態庫

LOCAL_SRC_FILES 編譯源文件

LOCAL_STATIC_JAVA_LIBRARIES

LOCAL_STATIC_LIBRARIES 可鏈接靜態庫

LOCAL_UNINSTALLABLE_MODULE

LOCAL_UNSTRIPPED_PATH

LOCAL_WHOLE_STATIC_LIBRARIES 指定模塊所需要載入的完整靜態庫(這些精通庫在鏈接是不允許鏈接器刪除其中無用的代碼)

LOCAL_YACCFLAGS

OVERRIDE_BUILT_MODULE_PATH

㈢ 如何編譯android kernel

1.准備工作: (ubuntu1110 32位)
ubuntu等linuxOS,下載好eclipse,安裝好JDK, 安裝好android的SDK, 在eclipse中成功打開android 手機模擬器即OK。

2.初始化編譯環境 :
關注該網頁上的「installing required packages」,其中有的軟體包因為版本問題而安裝不上,不用管它,之後遇到錯誤再單獨解決。

3.下載內核源碼
android 2.3 內核 下載需要等待一段時間。

4.下載交叉編譯器:
該步驟有可能耗費大量時間,依據網速不同,幾個小時到幾天不等,或許可以嘗試git clone 後面的地址只下載prebuilt/linux-x86/toolchain

5.設置參數以及編譯:
$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=arm-eabi-
$ cd goldfish // 進入下載的源代碼目錄
$ git checkout <commit_from_first_step> //這個步驟我沒有做,不知道幹嘛用的
$ make goldfish_defconfig
$ make

6.報錯信息:
若有報錯說找不到 (arm-eabi-gcc command not found)等等,嘗試使用http://blog.csdn.net/davidbeckham2901/article/details/7397447 中說到的解決方案即可(即採用另外一個交叉編譯器)。

7.測試:

最後,測試一下剛才編譯的內核:emulator -avd myavd -kernel ~/goldfish/arch/arm/boot/zImageemulator若系統找不到,可以去android SDK中某文件夾找到,加入系統PATH即可。 -avd後面的參數 myavd即為模擬器的名字,這個我是在eclipse中的模擬器管理中新建的一個模擬器,用那個模擬器的名字即可。 -kernel後面的參數就找到剛才編譯出的內核的路徑。
若啟動模擬器失敗,可嘗試關閉後再啟動。第一次啟動模擬器時可能需要等待比較長的時間,3分鍾到15分鍾不等。

㈣ Android系統編譯命令make

在編譯Android系統時,需要先執行2條命令,來設置必要的環境變數。

接下來就可以執行make系列命令,來完成不同的需要。

make clean 用來清除編譯歷史,開始一個全新的編譯。
make -j 或 make -j8 啟動編譯過程。 -j 後面的數字代表要使用的cpu thread的數目。

在完成了全編譯後,才能執行生成OTA升級包的操作。

注意事項:

㈤ 如何編譯android手機源碼

編譯android系統源碼准備工作:
下載android源碼
在windows上用gitbash ,git clone 下載代碼
在linux上這樣下載
創建~/bin目錄,用來存放repo程序,如下:

$ cd ~
$ mkdir bin
初始化repo
repo是android對git的一個封裝,簡化了一些git的操作。
創建工程目錄:
$ mkdir android
$ cd android
下載repo腳本並使其可執行:
$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
repo初始化:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
在此過程中需要輸入名字和email地址。初始化成功後,會顯示:
repo initialized in /android
在~/android下會有一個.repo的隱藏目錄。
5)同步源代碼
$ repo sync
這一步要很久很久。
安裝linux系統,推薦ubuntu,圖形界面
安裝編譯需要的支持包
$ sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
安裝java6.0
$ sudo apt-get install sun-java6-jdk
配置java環境
sudo gedit ~/.bashrc

末尾加上

JAVA_HOME=/usr/lib/jvm/java-6-sun
JRE_HOME=${JAVA_HOME}/jre
export ANDROID_JAVA_HOME=$JAVA_HOME
export CLASSPATH=.:${JAVA_HOME}/lib:$JRE_HOME/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export JAVA_HOME;
export JRE_HOME;
export CLASSPATH;
HOME_BIN=~/bin/
export PATH=${PATH}:${JAVA_PATH}:${HOME_BIN};
sudo source ~/.bashrc
是環境變數生效

編譯android源碼,並得到~/android/out目錄

$ cd ~/andoird
$ make
這一過程很久。
這就編譯結束了

㈥ 如何在Android平台下編譯帶STL的C++程序

1、下載最新的Android SDK,下載Android NDK R9C版本。

2、如是在windows平台下需要在PATH中設置環境變數,以便於直接調用NDK來編譯C++程序。

將如下兩個路徑加入到PATH中:<ANDROID_NDK>;<ANDROID_SDK>\platform-tools

其中<NDK>為你的計算機上Android NDK的安裝路徑,<SDK>為Android SDK的安裝路徑

如果在你的SDK下沒有platform-tools目錄,則在Eclipse中按照如下截圖進行操作:

3、為要編譯的C++程序建一個文件夾,如myproject。在myproject下再建一個jni文件夾,將源代碼放在這個文件夾下,myproject/jni。

mkdir myproject

mkdir myproject/jni

4、在jni文件夾下建兩個分別名為:android.mk和
application.mk文件。android.mk類以於C++程序的makefile,application.mk則指明當前程序依賴的庫。

android.mk的示例為:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := my_first_app #指明C++程序編譯出的可執行程序的名稱

LOCAL_SRC_FILES:= my_first_app0.cpp \ #指明要編譯的源文件,可以有很多個

my_first_app1.cpp\



include$(BUILD_EXECUTABLE)#表明編譯的是可執行程序

/**************************************************************************/

application.mk的示例為:(在application.mk中指明STL庫)

APP_STL:= gnustl_static

這里選STL庫時有四個選項:

system - 使用默認最小的C++運行庫,這樣生成的應用體積小,內存佔用小,但部分功能將無法支持
stlport_static - 使用STLport作為靜態庫,這項是Android開發網極力推薦的
stlport_shared - STLport 作為動態庫,這個可能產生兼容性和部分低版本的Android固件,目前不推薦使用。
gnustl_static - 使用 GNU libstdc++ 作為靜態庫

默認情況下STLPORT是不支持C++異常處理和RTTI,所以不要出現 -fexceptions 或 -frtti ,如果真的需要可以使用gnustl_static來支持標准C++的特性,但生成的文件體積會偏大,運行效率會低一些。

支持C++異常處理,在Application.mk中加入 LOCAL_CPPFLAGS +=
-fexceptions這句,同理支持RTTI,則加入LOCAL_CPPFLAGS +=
-frtti,這里再次提醒大家,第二條說的使用gnustl靜態庫,而不是stlport。

強制重新編譯 STLPort ,在Application.mk中加入 STLPORT_FORCE_REBUILD := true 可以強制重新編譯STLPort源碼,由於一些原因可能自己需要修改下STLPort庫,一般普通的開發者無需使用此項

5、打開控制台(cmd),在myproject目錄下用android的NDK build工具編譯C++程序:

cd myproject

$NDK/ndk-build

如果程序沒錯的話,會編譯出android的可執行程序,位置在myproject/libs/armeabi/my_first_app

8、將編譯出來的my_first_app放到手機或是模擬器上運行。在windows的cmd上運行adb.exe。

用adb.exe將my_first_app程序push到手機或模擬器的/data/local目錄上:

adb.exepush myproject\libs\armeabi\my_first_app /data/local。

9、通過adb,在手機上運行my_frist_app:

在cmd上運行:

adb.exe shell

由此進入到手機的linux終端上,接下來再更改my_first_app的許可權使其可以運行:

cd /data/local

chmod 777 my_first_app

./my_first_app//如果沒錯的話,這一步即可運行my_first_app

至此在android上編譯含STL的C++程序的過程結束。

㈦ android怎麼樣編譯framework

在開發過程中,尤其是Framework相關開發時,有時候需要重新編譯資源文件.編譯順序和注意事項如下:
1,資源文件位置:frameworks/base/core/res
2,編譯後生成的文件:framework-res.apk 另外com.android.internal.R會更新這個R.java所在目錄為/out/target/common/R/com/android/internal.
3,編譯資源後,必須重新編譯framework.jar.
4,如果在frameworks/base/core/res執行mm是並不重新編譯,請使用toutch ### 命令
###代表目錄下的一個文件.
5,資源文件要小寫.
6,如果沒有必要,不要編譯資源文件,可以用其他方式使用資源,比如將資源使用adb push 傳到某個目
錄,程序中直接指定具體目錄.我在編譯資源過程中遇到一些奇怪的問題,比如有時候許多圖標會顯
示錯誤,原因猜測跟重新編譯資源有關,可以試著重新編譯services.jar並替換看看.

舉一個例子:假如我想在WindowManagerService.java中使用一個圖片資源pic.png.順序如下.
1,將文件pic.png拷貝到位置:frameworks/base/core/res/res/drawable下.
2,在frameworks/base/core/res/res/drawable目錄下執行touch pic.png.
3,進入目錄frameworks/base/core/res/ 執行mm命令, 編譯 framework-res.apk
4,執行完後com.android.internal.R 會新生成一個R.drawable.pic的引用.在程序中使用即可.
5,在目錄frameworks/base/ 下執行mm 編譯 framework.jar.
6,在WindowManagerService.java中使用com.android.internal.R.drawable.pic,使用完後保存文件.
7,進入目錄frameworks/base/services/java/ 執行mm 編譯 services.jar
8,替換機器上(虛擬機或者真機)的jar apk文件.
adb push framework-res.apk /system/framework/
adb push services.jar /system/framework/
adb push framework.jar /system/framework/
執行命令時注意framework-res.apk 的真實路徑.
9,reboot 機器,查看修改結果.大功告成!

㈧ 反編譯Android APK的具體步驟是怎樣的

1、配置好JAVA環境變數,下載:apktool 解壓的文件放在C盤根目錄的apktool文件夾里(apktool文件夾自己創立)
2打開命令提示符,(開始-運行-輸入cmd)
3輸入:cd \apktool 系統指令到了apktool文件夾(這里就是為什麼要把解壓的apktool解壓的文件放到apktool文件夾的原因,當然你也可以自命名文件夾的名稱,那麼比如arc,那麼指令就變成了:cd \arc 前提是你必須把apktool解壓的文件放到這個文件夾裡面)
4使用RE管理器把系統裡面的framework-res.apk 與 SystemUI.apk 提取出來放在apktool文件夾裡面

5 如果只是想反編譯framework-res.apk

輸入apktool if framework-res.apk(框架的建立)
6開始最重要的反編譯,輸入指令,apktool d framework-res.apk

(反編輯的APK一定要用沒換過圖片的,否則回編輯失敗)
7最後反編譯完成

修改代碼完成後,輸入代碼:apktool d framework-res 即可完成回編譯
8回編譯後的新的 apk在framework/dis 文件夾裡面
9如果反編譯的是系統文件,比如,SystemUI.apk 那麼必須進行掛載框架,反編譯時,必須敲入一下命令:(然後再重復7-9步驟)
apktool if framework-res.apk
apktool if SystemUI.apk

10對於三星手機(比如9100、9108/9100G),如果反編譯SystemUI.apk要敲入一下命令進行框架掛載apktool if framework-res.apk
apktool if twframework-res.apk
apktool if SystemUI.apk
11回編譯的命令是 apktool b XXX (沒有後面的apk後綴)反編譯的命令是 apktool d xxx (有後面的apk)

㈨ Android APK編譯流程

apk 是Android Package的簡寫, 在平時的開發過程中,通過點擊 Run app 按鈕 或者 在命令行中輸入

這樣Android Studio就會啟動構建流程,最終輸出一個我們想要的APK。

直達官網介紹

對於小白來說,上面一張圖已經可以解釋apk的構建過程了,不過對於Andoid開發者而言還需要了解一些更詳細的構建過程。

詳細的對應步驟 和 使用工具如下:

資源文件(res文件夾下的文件)通過 AAPT(Android Asset Packaging Tool)打包生成R.java類(資源索引表)、.arsc資源文件 和res文件。

resources.arsc 是一個App的資源索引表,通過R.java 文件 和 resources.arsc 可以定位到資源的內存地址,resources.arsc文件的作用是通過一樣的ID,根據不同的配置索引到最佳的資源顯示在UI中。

AIDL (Android Interface Definition Language), 是Android介面定義語言,是Android提供的IPC (Inter Process Communication,進程間通信)的一種獨特實現。
如果有aidl文件,這個階段會生成對應的Java介面文件。

R.java文件、工程源碼文件、aidl.java文件, 在這一步通過javac生成.class文件。

源碼.class文件和第三方jar或者library通過dx工具打包成dex文件

Android系統的Dalvik虛擬機的可執行文件為DEX格式,所以這里會將上一步中生成的.class文件 和 引用的第三方jar等過程中的.class 一起通過dx工具打包成dex文件

apkbuilder工具會將所有沒有編譯的資源、.arsc資源、.dex文件打包到一個完成apk文件中

tips:

apksigner工具會對未簽名的apk驗證簽名。得到一個簽名後的apk(signed.apk)

apksigner 是google 退出的V2簽名方式
Jarsigner 是之前一直使用的V1簽名方式

可以通過在命令行中輸入apksigner --help來獲取詳情信息,如果沒有特殊需求,使用下面命令即可完成簽名

release mode 下使用 aipalign進行align,即對簽名後的apk進行對齊處理

所謂對齊,主要過程是將APK包中所有的資源文件距離文件起始偏移為4位元組整數倍,這樣通過內存映射訪問apk文件時的速度會更快。對齊的作用主要是為了減少運行時內存的使用。

zipalign是一個android平台上整理APK文件的工具,它對apk中未壓縮的數據進行4位元組對齊,對齊後就可以使用mmap函數讀取文件,可以像讀取內存一樣對普通文件進行操作。如果沒有4位元組對齊,就必須顯式的讀取,這樣比較緩慢並且會耗費額外的內存。

參考文章:
Android-Studio配置構建
淺談Android打包流程
apk打包流程

END!

㈩ Android make 基礎

Android編譯演進過程:

build/ 目錄下

source build/envsetup.sh
輸入指令hmm 就可以查看信息

lunch 2

通過soong執行編譯構建,這里執行make命令時,main.mk文件把一些環境變數和目標都配置好後,會執行envsetup.sh中的make()進行編譯。

build/soong/soong_ui.bash --make-mode
------->

soong的編譯過程:

soong_ui.bash 調用流程:

可以看到include 了main.mk文件,從main.mk開始,將通過include命令將其所有需要的.mk文件包含進來,最終在內存中形成一個包括所有編譯腳本的集合,這個相當於一個巨大Makefile文件。Makefile文件看上去很龐大,其實主要由三種內容構成: 變數定義、函數定義和目標依賴規則,此外mk文件之間的包含也很重要。

5.工具鏈的關系

REF
https://blog.csdn.net/yiranfeng/article/details/109082489

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:433
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:557
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:743
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:146
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:239
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726