#!/usr/bin/python import lutinDebug as debug import lutinTarget import lutinTools import lutinHost import lutinImage import lutinMultiprocess import os import sys class Target(lutinTarget.Target): def __init__(self, typeCompilator, debugMode, generatePackage, sumulator=False): self.folder_ndk = os.getenv('PROJECT_NDK', "AUTO") self.folder_sdk = os.getenv('PROJECT_SDK', "AUTO") # auto search NDK if self.folder_ndk == "AUTO": for folder in os.listdir("."): if os.path.isdir(folder)==True: if folder=="android": self.folder_ndk = folder + "/ndk" if self.folder_ndk == "AUTO": self.folder_ndk = lutinTools.get_run_folder() + "/../android/ndk" # auto search SDK if self.folder_sdk == "AUTO": for folder in os.listdir("."): if os.path.isdir(folder)==True: if folder=="android": self.folder_sdk = folder + "/sdk" if self.folder_sdk == "AUTO": self.folder_sdk = lutinTools.get_run_folder() + "/../android/sdk" arch = ""#"ARMv7" tmpOsVal = "64" gccVersion = "4.8" if lutinHost.OS64BITS==True: tmpOsVal = "_64" if typeCompilator == "clang": cross = self.folder_ndk + "/toolchains/llvm-3.3/prebuilt/linux-x86_64/bin/" else: baseFolderArm = self.folder_ndk + "/toolchains/arm-linux-androideabi-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/" baseFolderMips = self.folder_ndk + "/toolchains/mipsel-linux-android-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/" baseFolderX86 = self.folder_ndk + "/toolchains/x86-" + gccVersion + "/prebuilt/linux-x86" + tmpOsVal + "/bin/" cross = baseFolderArm + "arm-linux-androideabi-" if not os.path.isdir(baseFolderArm): debug.error("Gcc Arm pah does not exist !!!") if not os.path.isdir(baseFolderMips): debug.info("Gcc Mips pah does not exist !!!") if not os.path.isdir(baseFolderX86): debug.info("Gcc x86 pah does not exist !!!") lutinTarget.Target.__init__(self, "Android", typeCompilator, debugMode, generatePackage, arch, cross, sumulator) arch = "ARMv7" # for gcc : # for clang : self.folder_bin="/mustNotCreateBinary" self.folder_lib="/data/lib/armeabi" self.folder_data="/data/assets" self.folder_doc="/doc" self.suffix_package='.pkg' # board id at 14 is for android 4.0 and more ... self.boardId = 14 if arch == "ARMv5" or arch == "ARMv7": self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/include/") elif arch == "mips": self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-mips/usr/include/") elif arch == "x86": self.global_include_cc.append("-I" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-x86/usr/include/") if True: if typeCompilator == "clang": self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/include/") if arch == "ARMv5": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") elif arch == "ARMv7": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/armeabi-v7a/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") elif arch == "mips": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/mips/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") elif arch == "x86": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/llvm-libc++/libcxx/libs/x86/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libc++_static.a") else: self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/include/") if arch == "ARMv5": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a") elif arch == "ARMv7": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/armeabi-v7a/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "thumb/libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "thumb/libsupc++.a") elif arch == "mips": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/mips/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "libsupc++.a") elif arch == "x86": stdCppBasePath = self.folder_ndk +"/sources/cxx-stl/gnu-libstdc++/" + gccVersion + "/libs/x86/" self.global_include_cc.append("-I" + stdCppBasePath + "include/") self.global_flags_ld.append( stdCppBasePath + "libgnustl_static.a") self.global_flags_ld.append( stdCppBasePath + "libsupc++.a") else : self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/system/include/") self.global_include_cc.append("-I" + self.folder_ndk +"/sources/cxx-stl/stlport/stlport/") self.global_flags_ld.append(self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm/usr/lib/libstdc++.a") self.global_sysroot = "--sysroot=" + self.folder_ndk +"/platforms/android-" + str(self.boardId) + "/arch-arm" self.global_flags_cc.append("-D__ARM_ARCH_5__") self.global_flags_cc.append("-D__ARM_ARCH_5T__") self.global_flags_cc.append("-D__ARM_ARCH_5E__") self.global_flags_cc.append("-D__ARM_ARCH_5TE__") if self.arch == "ARM": # ----------------------- # -- arm V5 : # ----------------------- self.global_flags_cc.append("-march=armv5te") self.global_flags_cc.append("-msoft-float") else: # ----------------------- # -- arm V7 (Neon) : # ----------------------- self.global_flags_cc.append("-mfpu=neon") self.global_flags_cc.append("-mfloat-abi=softfp") self.global_flags_ld.append("-mfpu=neon") self.global_flags_ld.append("-mfloat-abi=softfp") self.global_flags_cc.append("-D__ARM_ARCH_7__") self.global_flags_cc.append("-D__ARM_NEON__") # the -mthumb must be set for all the android produc, some ot the not work coretly without this one ... (all android code is generated with this flags) self.global_flags_cc.append("-mthumb") # ----------------------- # -- Common flags : # ----------------------- self.global_flags_cc.append("-fpic") self.global_flags_cc.append("-ffunction-sections") self.global_flags_cc.append("-funwind-tables") self.global_flags_cc.append("-fstack-protector") self.global_flags_cc.append("-Wno-psabi") self.global_flags_cc.append("-mtune=xscale") self.global_flags_cc.append("-fexceptions") ##self.global_flags_cc.append("-fno-exceptions") self.global_flags_cc.append("-fomit-frame-pointer") self.global_flags_cc.append("-fno-strict-aliasing") self.global_flags_xx.append("-frtti") self.global_flags_xx.append("-Wa,--noexecstack") def check_right_package(self, pkgProperties, value): for val in pkgProperties["RIGHT"]: if value == val: return True return False def get_staging_folder_data(self, binaryName): return self.get_staging_folder(binaryName) + self.folder_data def make_package(self, pkgName, pkgProperties, basePkgPath): # http://alp.developpez.com/tutoriels/debian/creer-paquet/ debug.debug("------------------------------------------------------------------------") debug.info("Generate package '" + pkgName + "'") debug.debug("------------------------------------------------------------------------") pkgNameApplicationName = pkgName if "debug"==self.buildMode: pkgNameApplicationName += "debug" # FINAL_FOLDER_JAVA_PROJECT self.folder_javaProject= self.get_staging_folder(pkgName) \ + "/src/" \ + pkgProperties["COMPAGNY_TYPE"] \ + "/" + pkgProperties["COMPAGNY_NAME2"] \ + "/" + pkgNameApplicationName + "/" #FINAL_FILE_ABSTRACTION self.file_finalAbstraction = self.folder_javaProject + "/" + pkgNameApplicationName + ".java" compleatePackageName = pkgProperties["COMPAGNY_TYPE"]+"."+pkgProperties["COMPAGNY_NAME2"]+"." + pkgNameApplicationName if "ADMOD_ID" in pkgProperties: pkgProperties["RIGHT"].append("INTERNET") pkgProperties["RIGHT"].append("ACCESS_NETWORK_STATE") debug.print_element("pkg", "absractionFile", "<==", "dynamic file") # Create folder : lutinTools.create_directory_of_file(self.file_finalAbstraction) # Create file : tmpFile = open(self.file_finalAbstraction, 'w') if pkgProperties["ANDROID_APPL_TYPE"]=="APPL": tmpFile.write( "/**\n") tmpFile.write( " * @author Edouard DUPIN, Kevin BILLONNEAU\n") tmpFile.write( " * @copyright 2011, Edouard DUPIN, all right reserved\n") tmpFile.write( " * @license BSD v3 (see license file)\n") tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n") tmpFile.write( " */\n") tmpFile.write( "package "+ compleatePackageName + ";\n") tmpFile.write( "import org.ewol.EwolActivity;\n") if "ADMOD_ID" in pkgProperties: tmpFile.write( "import com.google.android.gms.ads.AdRequest;\n") tmpFile.write( "import com.google.android.gms.ads.AdSize;\n") tmpFile.write( "import com.google.android.gms.ads.AdView;\n") tmpFile.write( "import android.widget.LinearLayout;\n") tmpFile.write( "import android.widget.Button;\n") tmpFile.write( "public class " + pkgNameApplicationName + " extends EwolActivity {\n") if "ADMOD_ID" in pkgProperties: tmpFile.write( " /** The view to show the ad. */\n") tmpFile.write( " private AdView adView;\n") tmpFile.write( " private LinearLayout mLayout = null;\n") tmpFile.write( " public void onCreate(android.os.Bundle savedInstanceState) {\n") tmpFile.write( " super.onCreate(savedInstanceState);\n") tmpFile.write( " initApkPath(\"" + pkgProperties["COMPAGNY_TYPE"]+"\", \""+pkgProperties["COMPAGNY_NAME2"]+"\", \"" + pkgNameApplicationName + "\");\n") if "ADMOD_ID" in pkgProperties: tmpFile.write( " mLayout = new LinearLayout(this);\n") tmpFile.write( " mLayout.setOrientation(android.widget.LinearLayout.VERTICAL);\n") tmpFile.write( " LinearLayout.LayoutParams paramsWindows = new LinearLayout.LayoutParams(\n") tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n") tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT);\n") tmpFile.write( " \n") tmpFile.write( " setContentView(mLayout, paramsWindows);\n") tmpFile.write( " \n") tmpFile.write( " LinearLayout.LayoutParams paramsAdds = new LinearLayout.LayoutParams(\n") tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n") tmpFile.write( " LinearLayout.LayoutParams.WRAP_CONTENT);\n") tmpFile.write( " paramsAdds.weight = 0;\n") tmpFile.write( " \n") tmpFile.write( " LinearLayout.LayoutParams paramsGLView = new LinearLayout.LayoutParams(\n") tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT,\n") tmpFile.write( " LinearLayout.LayoutParams.FILL_PARENT);\n") tmpFile.write( " paramsGLView.weight = 1;\n") tmpFile.write( " paramsGLView.height = 0;\n") tmpFile.write( " \n") tmpFile.write( " mLayout.setGravity(android.view.Gravity.TOP);\n") tmpFile.write( " \n") tmpFile.write( " // Create an adds.\n") tmpFile.write( " adView = new AdView(this);\n") tmpFile.write( " adView.setAdSize(AdSize.SMART_BANNER);\n") tmpFile.write( " adView.setAdUnitId(\"" + pkgProperties["ADMOD_ID"] + "\");\n") tmpFile.write( " \n") tmpFile.write( " // Create an ad request. Check logcat output for the hashed device ID to get test ads on a physical device.\n") tmpFile.write( " AdRequest adRequest = new AdRequest.Builder()\n") tmpFile.write( " .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)\n") tmpFile.write( " .build();\n") tmpFile.write( " \n") tmpFile.write( " // Add the AdView to the view hierarchy. The view will have no size until the ad is loaded.\n") if "ADMOD_POSITION" in pkgProperties.keys() \ and pkgProperties["ADMOD_POSITION"] == "top": tmpFile.write( " mLayout.addView(adView, paramsAdds);\n") tmpFile.write( " mLayout.addView(mGLView, paramsGLView);\n") else: tmpFile.write( " mLayout.addView(mGLView, paramsGLView);\n") tmpFile.write( " mLayout.addView(adView, paramsAdds);\n") tmpFile.write( " \n") tmpFile.write( " // Start loading the ad in the background.\n") tmpFile.write( " adView.loadAd(adRequest);\n") tmpFile.write( " }\n") if "ADMOD_ID" in pkgProperties: tmpFile.write( " @Override protected void onResume() {\n") tmpFile.write( " super.onResume();\n") tmpFile.write( " if (adView != null) {\n") tmpFile.write( " adView.resume();\n") tmpFile.write( " }\n") tmpFile.write( " }\n") tmpFile.write( " @Override protected void onPause() {\n") tmpFile.write( " if (adView != null) {\n") tmpFile.write( " adView.pause();\n") tmpFile.write( " }\n") tmpFile.write( " super.onPause();\n") tmpFile.write( " }\n") tmpFile.write( " @Override protected void onDestroy() {\n") tmpFile.write( " // Destroy the AdView.\n") tmpFile.write( " if (adView != null) {\n") tmpFile.write( " adView.destroy();\n") tmpFile.write( " }\n") tmpFile.write( " super.onDestroy();\n") tmpFile.write( " }\n") tmpFile.write( "}\n") else : # wallpaper mode ... tmpFile.write( "/**\n") tmpFile.write( " * @author Edouard DUPIN, Kevin BILLONNEAU\n") tmpFile.write( " * @copyright 2011, Edouard DUPIN, all right reserved\n") tmpFile.write( " * @license BSD v3 (see license file)\n") tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n") tmpFile.write( " */\n") tmpFile.write( "package "+ compleatePackageName + ";\n") tmpFile.write( "import org.ewol.EwolWallpaper;\n") tmpFile.write( "public class " + pkgNameApplicationName + " extends EwolWallpaper {\n") tmpFile.write( " public static final String SHARED_PREFS_NAME = \"" + pkgNameApplicationName + "settings\";\n") tmpFile.write( " public Engine onCreateEngine() {\n") tmpFile.write( " Engine tmpEngine = super.onCreateEngine();\n") tmpFile.write( " initApkPath(\"" + pkgProperties["COMPAGNY_TYPE"]+"\", \""+pkgProperties["COMPAGNY_NAME2"]+"\", \"" + pkgNameApplicationName + "\");\n") tmpFile.write( " return tmpEngine;\n") tmpFile.write( " }\n") tmpFile.write( "}\n") tmpFile.flush() tmpFile.close() lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/drawable/icon.png"); if "ICON" in pkgProperties.keys() \ and pkgProperties["ICON"] != "": lutinImage.resize(pkgProperties["ICON"], self.get_staging_folder(pkgName) + "/res/drawable/icon.png", 256, 256) else: # to be sure that we have all time a resource ... tmpFile = open(self.get_staging_folder(pkgName) + "/res/drawable/plop.txt", 'w') tmpFile.write('plop\n') tmpFile.flush() tmpFile.close() if pkgProperties["ANDROID_MANIFEST"]!="": debug.print_element("pkg", "AndroidManifest.xml", "<==", pkgProperties["ANDROID_MANIFEST"]) lutinTools.copy_file(pkgProperties["ANDROID_MANIFEST"], self.get_staging_folder(pkgName) + "/AndroidManifest.xml", True) else: if "VERSION_CODE" not in pkgProperties: pkgProperties["VERSION_CODE"] = "1" debug.print_element("pkg", "AndroidManifest.xml", "<==", "package configurations") tmpFile = open(self.get_staging_folder(pkgName) + "/AndroidManifest.xml", 'w') tmpFile.write( '\n') tmpFile.write( '\n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') if pkgProperties["ANDROID_APPL_TYPE"]=="APPL": tmpFile.write( ' \n') if "ADMOD_ID" in pkgProperties: tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') if "ADMOD_ID" in pkgProperties: tmpFile.write( ' \n') tmpFile.write( ' \n') else: tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0: tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( ' \n') # write package autorisations : if True==self.check_right_package(pkgProperties, "WRITE_EXTERNAL_STORAGE"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "CAMERA"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "INTERNET"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "ACCESS_NETWORK_STATE"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "MODIFY_AUDIO_SETTINGS"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "READ_CALENDAR"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "READ_CONTACTS"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "READ_FRAME_BUFFER"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "READ_PROFILE"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "RECORD_AUDIO"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "SET_ORIENTATION"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "VIBRATE"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "ACCESS_COARSE_LOCATION"): tmpFile.write( ' \n') tmpFile.write( ' \n') if True==self.check_right_package(pkgProperties, "ACCESS_FINE_LOCATION"): tmpFile.write( ' \n') tmpFile.write( ' \n') tmpFile.write( '\n\n') tmpFile.flush() tmpFile.close() # end generating android manifest if pkgProperties["ANDROID_APPL_TYPE"]!="APPL": #create the Wallpaper sub files : (main element for the application debug.print_element("pkg", pkgNameApplicationName + "_resource.xml", "<==", "package configurations") lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_resource.xml") tmpFile = open(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_resource.xml", 'w') tmpFile.write( "\n") tmpFile.write( "\n") tmpFile.flush() tmpFile.close() # create wallpaper setting if needed (class and config file) if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0: lutinTools.create_directory_of_file(self.folder_javaProject + pkgNameApplicationName + "Settings.java") debug.print_element("pkg", self.folder_javaProject + pkgNameApplicationName + "Settings.java", "<==", "package configurations") tmpFile = open(self.folder_javaProject + pkgNameApplicationName + "Settings.java", 'w'); tmpFile.write( "package " + compleatePackageName + ";\n") tmpFile.write( "\n") tmpFile.write( "import " + compleatePackageName + ".R;\n") tmpFile.write( "\n") tmpFile.write( "import android.content.SharedPreferences;\n") tmpFile.write( "import android.os.Bundle;\n") tmpFile.write( "import android.preference.PreferenceActivity;\n") tmpFile.write( "\n") tmpFile.write( "public class " + pkgNameApplicationName + "Settings extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener\n") tmpFile.write( "{\n") tmpFile.write( " @Override protected void onCreate(Bundle icicle) {\n") tmpFile.write( " super.onCreate(icicle);\n") tmpFile.write( " getPreferenceManager().setSharedPreferencesName("+ pkgNameApplicationName + ".SHARED_PREFS_NAME);\n") tmpFile.write( " addPreferencesFromResource(R.xml."+ pkgNameApplicationName + "_settings);\n") tmpFile.write( " getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);\n") tmpFile.write( " }\n") tmpFile.write( " @Override protected void onResume() {\n") tmpFile.write( " super.onResume();\n") tmpFile.write( " }\n") tmpFile.write( " @Override protected void onDestroy() {\n") tmpFile.write( " getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);\n") tmpFile.write( " super.onDestroy();\n") tmpFile.write( " }\n") tmpFile.write( " public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { }\n") tmpFile.write( "}\n") tmpFile.flush() tmpFile.close() debug.print_element("pkg", self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml", "<==", "package configurations") lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml") tmpFile = open(self.get_staging_folder(pkgName) + "/res/xml/" + pkgNameApplicationName + "_settings.xml", 'w'); tmpFile.write( "\n") tmpFile.write( "\n") WALL_haveArray = False for WALL_type, WALL_key, WALL_title, WALL_summary, WALL_other in pkgProperties["ANDROID_WALLPAPER_PROPERTIES"]: debug.info("find : '" + WALL_type + "'"); if WALL_type == "list": debug.info(" create : LIST"); tmpFile.write( " \n") WALL_haveArray=True elif WALL_type == "bool": debug.info(" create : CHECKBOX"); tmpFile.write( " \n") tmpFile.write( "\n") tmpFile.flush() tmpFile.close() if WALL_haveArray==True: for WALL_type, WALL_key, WALL_title, WALL_summary, WALL_other in pkgProperties["ANDROID_WALLPAPER_PROPERTIES"]: if WALL_type == "list": debug.print_element("pkg", self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml", "<==", "package configurations") lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml") tmpFile = open(self.get_staging_folder(pkgName) + "/res/values/" + WALL_key + ".xml", 'w'); tmpFile.write( "\n") tmpFile.write( "\n") tmpFile.write( " \n") for WALL_subKey, WALL_display in WALL_other: tmpFile.write( " " + WALL_display + "\n") tmpFile.write( " \n") tmpFile.write( " \n") for WALL_subKey, WALL_display in WALL_other: tmpFile.write( " " + WALL_subKey + "\n") tmpFile.write( " \n") tmpFile.write( "\n") tmpFile.flush() tmpFile.close() #add properties on wallpaper : # myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", key, title, summary, [["key","value display"],["key2","value display 2"]]) # myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["list", "testpattern", "Select test pattern", "Choose which test pattern to display", [["key","value display"],["key2","value display 2"]]]) # myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", key, title, summary, ["enable string", "disable String"]) # myModule.pkg_add("ANDROID_WALLPAPER_PROPERTIES", ["bool", "movement", "Motion", "Apply movement to test pattern", ["Moving test pattern", "Still test pattern"] #copy needed resources : for res_source, res_dest in pkgProperties["ANDROID_RESOURCES"]: if res_source == "": continue lutinTools.copy_file(res_source , self.get_staging_folder(pkgName) + "/res/" + res_dest + "/" + os.path.basename(res_source), True) # 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/ debug.print_element("pkg", "R.java", "<==", "Resources files") lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/src/noFile") androidToolPath = self.folder_sdk + "/build-tools/19.0.3/" adModResouceFolder = "" if "ADMOD_ID" in pkgProperties: adModResouceFolder = " -S " + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ " cmdLine = androidToolPath + "aapt p -f " \ + "-M " + self.get_staging_folder(pkgName) + "/AndroidManifest.xml " \ + "-F " + self.get_staging_folder(pkgName) + "/resources.res " \ + "-I " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar "\ + "-S " + self.get_staging_folder(pkgName) + "/res/ " \ + adModResouceFolder \ + "-J " + self.get_staging_folder(pkgName) + "/src/ " lutinMultiprocess.run_command(cmdLine) #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}] lutinTools.create_directory_of_file(self.get_staging_folder(pkgName) + "/build/classes/noFile") debug.print_element("pkg", "*.class", "<==", "*.java") # more information with : -Xlint # + self.file_finalAbstraction + " "\ # this generate ex: out/Android/debug/staging/tethys/src/com/edouarddupin/tethys/edn.java #generate android java files: filesString="" for element in pkgProperties["ANDROID_JAVA_FILES"]: if element=="DEFAULT": filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolAudioTask.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolCallback.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolConstants.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/Ewol.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolRendererGL.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolSurfaceViewGL.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolActivity.java " filesString += self.folder_ewol + "/sources/android/src/org/ewol/EwolWallpaper.java " else: filesString += element + " " if "ADMOD_ID" in pkgProperties: filesString += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java " if len(pkgProperties["ANDROID_WALLPAPER_PROPERTIES"])!=0: filesString += self.folder_javaProject + pkgNameApplicationName + "Settings.java " adModJarFile = "" if "ADMOD_ID" in pkgProperties: adModJarFile = ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar" cmdLine = "javac " \ + "-d " + self.get_staging_folder(pkgName) + "/build/classes " \ + "-classpath " + self.folder_sdk + "/platforms/android-" + str(self.boardId) + "/android.jar" \ + adModJarFile + " " \ + filesString \ + self.file_finalAbstraction + " " \ + self.get_staging_folder(pkgName) + "/src/R.java " lutinMultiprocess.run_command(cmdLine) debug.print_element("pkg", ".dex", "<==", "*.class") cmdLine = androidToolPath + "dx " \ + "--dex --no-strict " \ + "--output=" + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \ + self.get_staging_folder(pkgName) + "/build/classes/ " if "ADMOD_ID" in pkgProperties: cmdLine += self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar " lutinMultiprocess.run_command(cmdLine) debug.print_element("pkg", ".apk", "<==", ".dex, assets, .so, res") #builderDebug="-agentlib:jdwp=transport=dt_socket,server=y,address=8050,suspend=y " builderDebug="" # note : set -u not signed application... #+ ":" + self.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar " cmdLine = "java -Xmx128M " \ + " -classpath " + self.folder_sdk + "/tools/lib/sdklib.jar " \ + builderDebug \ + " com.android.sdklib.build.ApkBuilderMain " \ + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + " -u " \ + " -z " + self.get_staging_folder(pkgName) + "/resources.res " \ + " -f " + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + ".dex " \ + " -rf " + self.get_staging_folder(pkgName) + "/data " lutinMultiprocess.run_command(cmdLine) # doc : # http://developer.android.com/tools/publishing/app-signing.html # Create a key for signing your application: # keytool -genkeypair -v -keystore AndroidKey.jks -storepass Pass__AndroidDebugKey -alias alias__AndroidDebugKey -keypass PassKey__AndroidDebugKey -keyalg RSA -validity 36500 if "debug"==self.buildMode: tmpFile = open("tmpPass.boo", 'w') tmpFile.write("Pass__AndroidDebugKey\n") tmpFile.write("PassKey__AndroidDebugKey\n") tmpFile.flush() tmpFile.close() debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)") # verbose mode : #debugOption = "-verbose -certs " debugOption = "" cmdLine = "jarsigner " \ + debugOption \ + "-keystore " + lutinTools.get_current_path(__file__) + "/AndroidDebugKey.jks " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \ + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + " alias__AndroidDebugKey < tmpPass.boo" lutinMultiprocess.run_command(cmdLine) tmpFile = open("tmpPass.boo", 'w') tmpFile.write("\n") tmpFile.flush() tmpFile.close() else: print("On release mode we need the file : and key an pasword to sign the application ...") debug.print_element("pkg", ".apk(signed debug)", "<==", ".apk (not signed)") cmdLine = "jarsigner " \ + " -keystore " + basePkgPath + "/AndroidKey.jks " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \ + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + " " + pkgNameApplicationName lutinMultiprocess.run_command(cmdLine) cmdLine = "jarsigner " \ + " -verify -verbose -certs " \ + " -sigalg SHA1withRSA -digestalg SHA1 " \ + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " lutinMultiprocess.run_command(cmdLine) debug.print_element("pkg", ".apk(aligned)", "<==", ".apk (not aligned)") lutinTools.remove_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk") # verbose mode : -v cmdLine = self.folder_sdk + "/tools/zipalign 4 " \ + self.get_staging_folder(pkgName) + "/build/" + pkgNameApplicationName + "-unalligned.apk " \ + self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk " lutinMultiprocess.run_command(cmdLine) # copy file in the final stage : lutinTools.copy_file(self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk", self.get_final_folder() + "/" + pkgNameApplicationName + ".apk", True) def install_package(self, pkgName): debug.debug("------------------------------------------------------------------------") debug.info("Install package '" + pkgName + "'") debug.debug("------------------------------------------------------------------------") pkgNameApplicationName = pkgName if "debug"==self.buildMode: pkgNameApplicationName += "debug" cmdLine = self.folder_sdk + "/platform-tools/adb install -r " \ + self.get_staging_folder(pkgName) + "/" + pkgNameApplicationName + ".apk " lutinMultiprocess.run_command(cmdLine) def un_install_package(self, pkgName): debug.debug("------------------------------------------------------------------------") debug.info("Un-Install package '" + pkgName + "'") debug.debug("------------------------------------------------------------------------") pkgNameApplicationName = pkgName if "debug"==self.buildMode: pkgNameApplicationName += "debug" cmdLine = self.folder_sdk + "/platform-tools/adb uninstall " + pkgNameApplicationName RlutinMultiprocess.unCommand(cmdLine) def Log(self, pkgName): debug.debug("------------------------------------------------------------------------") debug.info("logcat of android board") debug.debug("------------------------------------------------------------------------") cmdLine = self.folder_sdk + "/platform-tools/adb shell logcat " lutinMultiprocess.run_command(cmdLine)