############################################################################### ## @author Edouard DUPIN ## @date 17-08-2012 ## @project standard Build system ## @copyright BSDv3 ############################################################################### # Define SDK and NDK folder for Android compilation tools and packager tools : ifeq ("$(PROJECT_NDK)","") PROJECT_NDK:=$(call fullpath,$(PROJECT_PATH)/../android/ndk/) $(info Auto define android NDK project to : $(PROJECT_NDK)) endif ifeq ("$(PROJECT_NDK)","") PROJECT_SDK:=$(call fullpath,$(PROJECT_PATH)/../android/sdk/) $(info Auto define Android SDK project to : $(PROJECT_SDK)) endif #TARGET_ARCH := ARM TARGET_ARCH := ARMv7 TARGET_CROSS := $(PROJECT_NDK)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi- TARGET_CROSS_CLANG := $(PROJECT_NDK)/toolchains/llvm-3.1/prebuilt/linux-x86/bin/ TARGET_OUT_FOLDER_BINARY := ERROR_NOTHING_MUST_BE_SET_HERE TARGET_OUT_FOLDER_LIBRAIRY := data/lib/armeabi TARGET_OUT_FOLDER_DATA := data/assets TARGET_OUT_FOLDER_DOC := doc TARGET_OUT_PREFIX_LIBRAIRY := lib #local get the gcc version : TMPP_CC_VERSION := $(shell $(TARGET_CROSS)gcc --version | head -1 | sed "s/.*\([0-9]\.[0-9]\.[0-9]\).*/\1/") ANDROID_BOARD_ID = 14 TARGET_GLOBAL_C_INCLUDES+=-I$(PROJECT_NDK)/platforms/android-$(ANDROID_BOARD_ID)/arch-arm/usr/include TARGET_GLOBAL_C_INCLUDES+=-I$(PROJECT_NDK)/sources/cxx-stl/system/include/ TARGET_GLOBAL_LDLIBS_SHARED = --sysroot=$(PROJECT_NDK)/platforms/android-$(ANDROID_BOARD_ID)/arch-arm #generic makefile include $(BUILD_SYSTEM)/core/main.mk FINAL_FOLDER_JAVA_PROJECT=$(TARGET_OUT_STAGING)/src/$(PROJECT_COMPAGNY_TYPE)/$(PROJECT_COMPAGNY_NAME2)/$(PROJECT_NAME2) FINAL_FILE_ABSTRACTION = $(FINAL_FOLDER_JAVA_PROJECT)/$(PROJECT_NAME2).java $(FINAL_FILE_ABSTRACTION) : $(EWOL_FOLDER)/sources/android/PROJECT_NAME.java $(CONFIG_GLOBAL_FILE) $(Q)mkdir -p $(dir $@) $(Q)cp $(EWOL_FOLDER)/sources/android/PROJECT_NAME.java $@ $(Q)sed -i "s|__PROJECT_ORG_TYPE__|$(PROJECT_COMPAGNY_TYPE)|" $@ $(Q)sed -i "s|__PROJECT_VENDOR__|$(PROJECT_COMPAGNY_NAME2)|" $@ $(Q)sed -i "s|__PROJECT_NAME__|$(PROJECT_NAME2)|" $@ $(Q)sed -i "s|__PROJECT_PACKAGE__|$(PROJECT_NAME2)|" $@ $(Q)sed -i "s|__CONF_OGL_ES_V__|2|" $@ APPL_VERSION:=$(shell git describe --tags) # --abbrev=0) $(eval $(call copy-one-file,$(PROJECT_ICON),$(TARGET_OUT_STAGING)/res/drawable/icon.png)) $(TARGET_OUT_STAGING)/AndroidManifest.xml : $(CONFIG_GLOBAL_FILE) $(TARGET_OUT_STAGING)/res/drawable/icon.png @echo "AndroidManifest.xml <== configFile" @echo " " > $@ @echo "" >> $@ @echo "> $@ @echo " package=\"$(PROJECT_COMPAGNY_TYPE).$(PROJECT_COMPAGNY_NAME2).$(PROJECT_NAME2)\" " >> $@ @echo " android:versionCode=\"1\" " >> $@ @echo " android:versionName=\"$(APPL_VERSION)\"> " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " > $@ @echo " android:icon=\"@drawable/icon\" " >> $@ @echo " > " >> $@ @echo " > $@ ifeq ("$(DEBUG)","1") @echo " android:label=\"$(CONFIG___EWOL_APPL_BASIC_TITLE__)-debug\" " >> $@ else @echo " android:label=\"$(CONFIG___EWOL_APPL_BASIC_TITLE__)\" " >> $@ endif @echo " android:icon=\"@drawable/icon\" " >> $@ @echo " android:hardwareAccelerated=\"true\" " >> $@ @echo " android:configChanges=\"orientation\"> " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " " >> $@ @echo " " >> $@ ifeq ("$(CONFIG___ANDROID_PERMISSION__WRITE_EXTERNAL_STORAGE__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__CAMERA__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__INTERNET__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__MODIFY_AUDIO_SETTINGS__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__READ_CALENDAR__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__READ_CONTACTS__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__READ_FRAME_BUFFER__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__READ_PROFILE__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__RECORD_AUDIO__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__SET_ORIENTATION__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__VIBRATE__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__ACCESS_COARSE_LOCATION__)","y") @echo " " >> $@ endif ifeq ("$(CONFIG___ANDROID_PERMISSION__ACCESS_FINE_LOCATION__)","y") @echo " " >> $@ endif @echo " " >> $@ javaclean: $(Q)mkdir -p $(FINAL_FOLDER_JAVA_PROJECT)/ final : javaclean $(FINAL_FILE_ABSTRACTION) $(TARGET_OUT_STAGING)/AndroidManifest.xml $(Q)mkdir -p $(TARGET_OUT_STAGING)/res/ $(Q)mkdir -p $(TARGET_OUT_STAGING)/src/ @# Doc : @# http://asantoso.wordpress.com/2009/09/15/how-to-build-android-application-package-apk-from-the-command-line-using-the-sdk-tools-continuously-integrated-using-cruisecontrol/ @echo "R.java <== Resources files" $(Q)$(PROJECT_SDK)/platform-tools/aapt p -f \ -M $(TARGET_OUT_STAGING)/AndroidManifest.xml \ -F $(TARGET_OUT_STAGING)/resources.res \ -I $(PROJECT_SDK)/platforms/android-15/android.jar\ -S $(TARGET_OUT_STAGING)/res/ \ -J $(TARGET_OUT_STAGING)/src @#aapt package -f -M ${manifest.file} -F ${packaged.resource.file} -I ${path.to.android-jar.library} @# -S ${android-resource-directory} [-m -J ${folder.to.output.the.R.java}] $(Q)mkdir -p $(TARGET_OUT_STAGING)/build/classes/ @echo ".class <== .java" @# more information with : -Xlint $(Q)javac \ -d $(TARGET_OUT_STAGING)/build/classes \ -classpath $(PROJECT_SDK)/platforms/android-15/android.jar \ $(FINAL_FILE_ABSTRACTION) \ $(EWOL_FOLDER)/sources/android/src/org/ewol/interfaceJNI.java \ $(EWOL_FOLDER)/sources/android/src/org/ewol/interfaceOpenGL.java \ $(EWOL_FOLDER)/sources/android/src/org/ewol/interfaceSurfaceView.java \ $(EWOL_FOLDER)/sources/android/src/org/ewol/interfaceAudio.java \ $(TARGET_OUT_STAGING)/src/R.java @echo ".dex <== .class" $(Q)$(PROJECT_SDK)/platform-tools/dx \ --dex --no-strict \ --output=$(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2).dex \ $(TARGET_OUT_STAGING)/build/classes/ @echo ".apk <== .dex, assets, .so, res" $(Q)$(PROJECT_SDK)/tools/apkbuilder \ $(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2)-unalligned.apk \ -u \ -z $(TARGET_OUT_STAGING)/resources.res \ -f $(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2).dex \ -rf $(TARGET_OUT_STAGING)/data @# doc : @# http://developer.android.com/tools/publishing/app-signing.html ifeq ("$(DEBUG)","1") @# To create the debug Key ==> for all ... @#keytool -genkeypair -v -keystore $(BUILD_SYSTEM)/AndroidDebugKey.jks -storepass Pass__AndroidDebugKey -alias alias__AndroidDebugKey -keypass PassKey__AndroidDebugKey -keyalg RSA -validity 36500 @# use default common generic debug key: @# generate the pass file (debug mode does not request to have a complicated key) : @echo "Pass__AndroidDebugKey" > tmpPass.boo @echo "PassKey__AndroidDebugKey" >> tmpPass.boo @# verbose mode : -verbose $(Q)jarsigner \ -keystore $(BUILD_SYSTEM)/AndroidDebugKey.jks \ $(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2)-unalligned.apk \ alias__AndroidDebugKey \ < tmpPass.boo \ 2> /dev/null $(Q)rm tmpPass.boo else @# keytool is situated in $(JAVA_HOME)/bin ... @#TODO : call the user the pass and the loggin he want ... $(if $(wildcard ./config/AndroidKey_$(PROJECT_NAME2).jks),$(empty), \ $(Q)echo "./config/$(PROJECT_NAME2).jks <== dynamic key (NOTE : It might ask some question to generate the key for android)" ; \ $(Q)keytool -genkeypair -v \ -keystore ./config/$(PROJECT_NAME2).jks \ -alias alias_$(PROJECT_NAME2) \ -keyalg RSA \ -validity 365 \ ) @# note we can add : -storepass Pass$(PROJECT_NAME2) @# note we can add : -keypass PassK$(PROJECT_NAME2) @# Question poser a ce moment, les automatiser ... @# Quels sont vos prénom et nom ? @# Edouard DUPIN @# [Unknown] : Quel est le nom de votre unité organisationnelle ? @# org @# [Unknown] : Quelle est le nom de votre organisation ? @# EWOL @# [Unknown] : Quel est le nom de votre ville de résidence ? @# Paris @# [Unknown] : Quel est le nom de votre état ou province ? @# France @# [Unknown] : Quel est le code de pays à deux lettres pour cette unité ? @# FR @# [Unknown] : Est-ce CN=Edouard DUPIN, OU=org, O=EWOL, L=Paris, ST=France, C=FR ? @# oui @# [non] : @# Génération d'une paire de clés RSA de 1 024 bits et d'un certificat autosigné (SHA1withRSA) d'une validité de 365 jours @# pour : CN=Edouard DUPIN, OU=org, O=EWOL, L=Paris, ST=France, C=FR @# keytool is situated in $(JAVA_HOME)/bin ... @echo "apk(Signed) <== apk" @# sign the application request loggin and password : $(Q)jarsigner \ -keystore ./config/AndroidKey_$(PROJECT_NAME2).jks \ $(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2)-unalligned.apk \ alias_$(PROJECT_NAME2) endif @echo "apk(aligned) <== apk" $(Q)rm -f $(TARGET_OUT_STAGING)/$(PROJECT_NAME2).apk @# verbose mode : -v $(Q)$(PROJECT_SDK)/tools/zipalign 4 \ $(TARGET_OUT_STAGING)/build/$(PROJECT_NAME2)-unalligned.apk \ $(TARGET_OUT_STAGING)/$(PROJECT_NAME2).apk @# copy file in the final stage : $(Q)mkdir -p $(TARGET_OUT_FINAL)/ @echo "Generated out : $(TARGET_OUT_FINAL)/$(PROJECT_NAME2).apk" $(Q)cp $(TARGET_OUT_STAGING)/$(PROJECT_NAME2).apk $(TARGET_OUT_FINAL)/$(PROJECT_NAME2).apk install: @echo ------------------------------------------------------------------------ @echo Install : $(TARGET_OUT_FINAL)/$(PROJECT_NAME2).apk @echo ------------------------------------------------------------------------ $(Q)sudo $(PROJECT_SDK)/platform-tools/adb install -r $(TARGET_OUT_FINAL)/$(PROJECT_NAME2).apk uninstall: @echo ------------------------------------------------------------------------ @echo UnInstall : $(PROJECT_NAME2) @echo ------------------------------------------------------------------------ $(Q)sudo $(PROJECT_SDK)/platform-tools/adb uninstall $(PROJECT_NAME2) log: @echo ------------------------------------------------------------------------ @echo Run android logat @echo ------------------------------------------------------------------------ $(Q)sudo $(PROJECT_SDK)/platform-tools/adb shell logcat shell: @echo ------------------------------------------------------------------------ @echo Run android shell @echo ------------------------------------------------------------------------ sudo $(PROJECT_SDK)/platform-tools/adb shell