Skip to content

zhangfuwen/apk_creator

Repository files navigation

Android Apk构建与拆解

总体流程

总体流程涉及五个工具,也即5个步骤:

javac – compile Java code
d8 – convert .class to .dex (Google's DEX compiler)
aapt2 – compile and link resources
zipalign – align the APK
apksigner – sign the APK

工程准备

MyApp/
├── src/
│   └── com/example/app/MainActivity.java
├── res/
│   └── values/
│       └── strings.xml
│   └── layout/
│       └── activity_main.xml
│   └── mipmap/
│       └── icon.png
├── assets/test.txt
├── AndroidManifest.xml
└── build/

Download build tools

Set environment variables:

# You have to have this version of JDK, otherwise it won't work
# To install this version of JDK, you can use `apt install openjdk-8-jdk`
JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 

export NDK_VERSION="27.3.13750724"
export PLATFORM_VERSION_NUMBER="34"
export PLATFORM_VERSION="android-${PLATFORM_VERSION_NUMBER}"
export CMAKE_VERSION="4.1.0"
export BUILD_TOOLS_VERSION="34.0.0"

export ANDROID_HOME=$HOME/bin/android-sdk
export ANDROID_NDK_HOME=$ANDROID_HOME/ndk/$NDK_VERSION
export ANDROID_NDK_ROOT=$ANDROID_NDK_HOME
export ANDROID_SDK=$ANDROID_HOME

echo "ANDROID_HOME=$ANDROID_HOME"

Download build tools:

export URL_CLITOOLS=https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip
export TMPFILE="$HOME/temp.zip"
[[ -d $ANDROID_HOME ]] || mkdir -p $ANDROID_HOME && wget --quiet ${URL_CLITOOLS} -O ${TMPFILE} \
    && unzip -d ${ANDROID_HOME} ${TMPFILE} \
    && rm ${TMPFILE}

Install SDK, NDK and other tools:

yes | $ANDROID_HOME/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} --licenses \
    && $ANDROID_HOME/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${BUILD_TOOLS_VERSION}" "cmake;${CMAKE_VERSION}" "ndk;${NDK_VERSION}" "platform-tools" "platforms;${PLATFORM_VERSION}" "tools"

Compile java code

mkdir -p build/classes
javac -source 1.7 -target 1.7 \
  -bootclasspath $ANDROID_HOME/platforms/${PLATFORM_VERSION}/android.jar \
  -d build/classes \
  src/com/example/app/*.java

Convert .class → .dex using D8

mkdir -p build/dex
find build/classes -name "*.class" -print0 | xargs -0 $ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/d8 \
  --lib $ANDROID_HOME/platforms/android-34/android.jar \
  --output build/dex

Using aapt2 to compile and link resources

Compile Resources with aapt2

mkdir -p build/res-compiled

$ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/aapt2 compile \
  --dir res \
  -o build/res-compiled/

Link resources into resources.arsc and final APK

mkdir -p build/apk

$ANDROID_HOME/build-tools/${BUILD_TOOLS_VERSION}/aapt2 link \
  --manifest AndroidManifest.xml \
  -I $ANDROID_HOME/platforms/${PLATFORM_VERSION}/android.jar \
  --auto-add-overlay \
  --java build/gen \
  --no-version-vectors \
  -o build/apk/app-unaligned.apk \
  --allow-reserved-package-id \
  --package-id 0x7f \
   build/res-compiled/*.flat

Add DEX file to APK

cd build/dex
zip -g ../apk/app-unaligned.apk classes.dex
cd ../..

Add asssets to APK

find assets -type f -exec zip myapp.apk {} \;

Add native library to APK

for how to build native library, refer to this page

cd build/native_lib
mkdir -p lib/arm64-v8a
mv libmain.so lib/arm64-v8a
zip -g ../apk/app-unaligned.apk lib/arm64-v8a/libmain.so
cd ../..

Align the APK with zipalign

$ANDROID_HOME/build-tools/34.0.0/zipalign \
  -f 4 \
  build/apk/app-unaligned.apk \
  build/apk/app-aligned.apk

Sign the APK with apksigner

Generate a key if you don't have one

keytool -genkeypair \
  -alias mykey \
  -keyalg RSA \
  -keysize 2048 \
  -validity 10000 \
  -keystore mykey.jks \
  -storepass android \
  -keypass android \
  -dname "CN=,OU=,O=,L=,S=,C=US"

Sign the APK

$ANDROID_HOME/build-tools/34.0.0/apksigner sign \
  --key-pass pass:android \
  --ks-pass pass:android \
  --ks mykey.jks \
  --out build/apk/app-signed.apk \
  build/apk/app-aligned.apk

Install the APK

adb install build/apk/app-signed.apk

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published