Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
blog:190226_compile_apk_online [2020/03/04 10:18]
lixas
blog:190226_compile_apk_online [2021/07/15 09:55] (current)
lixas
Line 1: Line 1:
 +====== Compile APK online ======
 +It was long time i was dreaming about ability to compile apk online. So this blog post (tutorial) will be how to prepare <del>C9</del> (C9 was bought by Amazon AWS and does not really offer free containers any more) or Goorm online IDE or any similar based on ubuntu linux to be able to develop online. This should also work on local linux installation or even [[https://docs.microsoft.com/en-us/windows/wsl/install-win10|Windows subsystem for Linux]] if you are on Win10
 +
 +This post will not be about "upload my zip online and get apk". You have to set up environment in virtual server. My suggestion is go with [[https://ide.goorm.io/|Goorm IDE]] they give you up to 5 containers __for free__ where you can set up different environment for various development things. 
 +
 +First of all, create new empty ubuntu box <del>and resize it to 1Gb RAM and 5GB storage</del> goorm gives you 1GB ram and 10GB storage out of the box. Simple APK compile stull will require about 1GB of storage, but if you decide to go on gradle dependency management system- storage will grow to 2.5GB.
 +
 +====== Prepare your system ======
 +<WRAP center round info 80%>I prepending everyhing with //sudo// command, in case any permission will be missing.</WRAP>
 +
 +So lets begin from very basic. At first you need JAVA, so add OpenJDK repository and install java
 +
 +<code bash>sudo add-apt-repository ppa:openjdk-r/ppa
 +sudo apt-get update</code>
 +
 +Install Java headless, because you do not need GUI here
 +<code bash>sudo apt-get install openjdk-8-jdk-headless</code>
 +
 +Download SDK zip from android home. You may use my provided link
 +<code bash>wget https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip</code>
 +
 +Make directory for android SDK and extract ZIP
 +<code bash>sudo mkdir -p /opt/android-sdk
 +sudo unzip sdk-tools-linux-4333796.zip -d /opt/android-sdk</code>
 +
 +Now add environment variables to your system.
 +<code bash>sudo nano /etc/profile</code>
 +and at the very end add following lines
 +<WRAP center round important 80%>Always check if copying from website does not ruin you double-quotes</WRAP>
 +<code bash>export ANDROID_HOME="/opt/android-sdk"
 +export JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-amd64"
 +export PATH=$JAVA_HOME/bin:$ANDROID_HOME/tools/:$ANDROID_HOME/platform-tools/:$PATH</code>
 +
 +Save and exit by pressing CTRL+X on keyboard and confirming that you want to save changes by Y. Restart your machine or environment.
 +
 +Now you need to add SDK, Tools and platform stuff. I have chosen 24 version so i have used this command
 +<code bash>sudo /opt/android-sdk/tools/bin/sdkmanager "tools" "platforms;android-24" "build-tools;24.0.3"</code>
 +in case you want something else or want to see available list use //sdkmanager --list// command
 +
 +Looks like everything is prepared, now need "Hello world!" android application. You may need to prepare it according structure and create all files or You can download this {{:blog:apkonline:helloandroid.zip|HelloAndroid}} project and extract in in your workspace. 
 +
 +Steps needs to be done to get APK file
 +  - Generate R.java file **AAPT**
 +  - Compile java file with **javac**
 +  - Translate it to Dalvik Bytecode with **DX**
 +  - Make apk with **AAPT**
 +  - Align apk package with **ZIPALIGN**
 +  - Sign your apk file with **APKSIGNER**
 +
 +AS you can see, there is a step to sign you apk install file with certificate. You can create your own. In main project directory, the same where AndroidManifest.xml file exist, run following command to create private key:
 +<code bash>keytool -genkeypair -validity 365 -keystore mykey.keystore -keyalg RSA -keysize 2048</code>
 +Answer all questions and provide password.
 +
 +Thats it. Now you can create APK file from command line. To create automated, here is prepared bash script witch you should save in project root directory (the same as android manifest) and run to build your project. I have chosen to name it make.sh
 +
 +<code bash make.sh>
 +#!/bin/bash
 +
 +set -e
 +
 +AAPT="/opt/android-sdk/build-tools/24.0.3/aapt"
 +DX="/opt/android-sdk/build-tools/24.0.3/dx"
 +ZIPALIGN="/opt/android-sdk/build-tools/24.0.3/zipalign"
 +APKSIGNER="/opt/android-sdk/build-tools/24.0.3/apksigner"
 +PLATFORM="/opt/android-sdk/platforms/android-24/android.jar"
 +
 +echo "Cleaning..."
 +rm -rf obj/*
 +rm -rf src/in/ignas/helloandroid/R.java
 +rm -rf bin/*
 +
 +echo "Generating R.java file..."
 +$AAPT package -f -m -J src -M AndroidManifest.xml -S res -I $PLATFORM
 +
 +echo "Compiling..."
 +javac -d obj -classpath src -bootclasspath $PLATFORM -source 1.7 -target 1.7 src/in/ignas/helloandroid/MainActivity.java
 +javac -d obj -classpath src -bootclasspath $PLATFORM -source 1.7 -target 1.7 src/in/ignas/helloandroid/R.java
 +
 +echo "Translating in Dalvik bytecode..."
 +$DX --dex --output=classes.dex obj
 +
 +echo "Making APK..."
 +$AAPT package -f -m -F bin/hello.unaligned.apk -M AndroidManifest.xml -S res -I $PLATFORM
 +$AAPT add bin/hello.unaligned.apk classes.dex
 +
 +echo "Aligning and signing APK..."
 +$ZIPALIGN -f 4 bin/hello.unaligned.apk bin/hello.apk
 +$APKSIGNER sign --ks mykey.keystore bin/hello.apk
 +</code>
 +
 +In case you have used different versions in sdkmanager command- edit path in header accordingly.
 +Just run this script with following command. If you can not run it __chmod +x make.sh__
 +<code bash>./make.sh</code>
 +Script will ask password for your keystore that you provided earlier.
 +
 +This solution works if your application does not have any dependencies on external libs and gradle wrapper is not used.
 +Probably, automated install script can be made but that's for another times. 
 +In case you have any suggestions, comment or anything worth to say- comment below. 
 +
 +{{tag> goorm cloud android linux console compile apk online tutorial NoGradle}}
 +
 +~~DISCUSSION~~