# Manual APK build pipeline: aapt2 -> javac -> d8 -> jar -> zipalign -> apksigner $root = 'c:\Users\shz73\Documents\Qoder\2026-08-09\chat-1\device-management-system' $jdk = "$root\android-tools\jdk\jdk-17.0.20+8" $sdk = "$root\android-sdk" $bt = "$sdk\build-tools\33.0.2" $androidJar = "$sdk\platforms\android-33\android.jar" $proj = "$root\android-app" $build = "$proj\build" $env:JAVA_HOME = $jdk $env:Path = "$jdk\bin;" + $env:Path if (Test-Path $build) { Remove-Item $build -Recurse -Force } New-Item -ItemType Directory -Force -Path "$build\gen" | Out-Null New-Item -ItemType Directory -Force -Path "$build\classes" | Out-Null New-Item -ItemType Directory -Force -Path "$build\dex" | Out-Null Write-Host '=== 1. aapt2 compile ===' & "$bt\aapt2.exe" compile --dir "$proj\res" -o "$build\res.zip" if ($LASTEXITCODE -ne 0) { Write-Host 'AAPT2 COMPILE FAILED'; exit 1 } Write-Host '=== 2. aapt2 link ===' & "$bt\aapt2.exe" link -o "$build\app.unsigned.apk" -I $androidJar --manifest "$proj\AndroidManifest.xml" --java "$build\gen" --auto-add-overlay "$build\res.zip" if ($LASTEXITCODE -ne 0) { Write-Host 'AAPT2 LINK FAILED'; exit 1 } Write-Host '=== 3. javac ===' $srcs = @(Get-ChildItem -Recurse -Filter *.java "$build\gen" | ForEach-Object { $_.FullName }) + @(Get-ChildItem -Recurse -Filter *.java "$proj\src" | ForEach-Object { $_.FullName }) & "$jdk\bin\javac.exe" -classpath $androidJar -d "$build\classes" @srcs if ($LASTEXITCODE -ne 0) { Write-Host 'JAVAC FAILED'; exit 1 } Write-Host '=== 4. d8 ===' $classes = Get-ChildItem -Recurse -Filter *.class "$build\classes" | ForEach-Object { $_.FullName } & "$jdk\bin\java.exe" -cp "$bt\lib\d8.jar" com.android.tools.r8.D8 --output "$build\dex" --lib $androidJar @classes if ($LASTEXITCODE -ne 0) { Write-Host 'D8 FAILED'; exit 1 } Write-Host '=== 5. add classes.dex ===' Push-Location "$build\dex" & "$jdk\bin\jar.exe" uf "$build\app.unsigned.apk" classes.dex Pop-Location if ($LASTEXITCODE -ne 0) { Write-Host 'JAR ADD FAILED'; exit 1 } Write-Host '=== 6. zipalign ===' & "$bt\zipalign.exe" -f 4 "$build\app.unsigned.apk" "$build\app-aligned.apk" if ($LASTEXITCODE -ne 0) { Write-Host 'ZIPALIGN FAILED'; exit 1 } Write-Host '=== 7. sign ===' $ks = "$build\debug.keystore" if (-not (Test-Path $ks)) { & "$jdk\bin\keytool.exe" -genkeypair -keystore $ks -storepass android -alias androiddebugkey -keypass android -keyalg RSA -keysize 2048 -validity 10000 -dname 'CN=Android Debug,O=Android' } & "$jdk\bin\java.exe" -jar "$bt\lib\apksigner.jar" sign --ks $ks --ks-pass pass:android --key-pass pass:android --ks-key-alias androiddebugkey --out "$build\yingshi-device-manager.apk" "$build\app-aligned.apk" if ($LASTEXITCODE -ne 0) { Write-Host 'SIGN FAILED'; exit 1 } Write-Host '=== 8. verify ===' & "$jdk\bin\java.exe" -jar "$bt\lib\apksigner.jar" verify --verbose "$build\yingshi-device-manager.apk" Get-Item "$build\yingshi-device-manager.apk" | Select-Object Name, Length Write-Host 'APK-BUILD-DONE'