diff --git a/ewol/context/Android/Context.cpp b/ewol/context/Android/Context.cpp index c105078a..8f5b2b4e 100644 --- a/ewol/context/Android/Context.cpp +++ b/ewol/context/Android/Context.cpp @@ -17,7 +17,7 @@ //#include #include /* include auto generated file */ -#include +#include diff --git a/lutin_ewol.py b/lutin_ewol.py index 10f1b772..b3a8287b 100644 --- a/lutin_ewol.py +++ b/lutin_ewol.py @@ -11,24 +11,6 @@ def get_desc(): def get_license(): return "APACHE v2.0" -""" -def create_header(module, target): - debug.print_element("javah", module.name, "<==", file); - - # TODO : Create constant headers ... - - java_tmp_dir = tools.get_current_path(__file__) + "/android/src/" - cpp_tmp_dir = tools.get_current_path(__file__) + "/ewol/renderer/Android/" - java_tmp_src = java_tmp_dir + "org/ewol/EwolConstants" - # TODO : set the build directory in out/.build with option -d ... - debugCommand = "" - if debug.get_level() >= 4: - debugCommand = " -verbose " - lutinMultiprocess.run_command("javac " + debugCommand + java_tmp_src + ".java") - lutinMultiprocess.run_command("javah " + debugCommand + "-classpath " + java_tmp_dir + " -d " + cpp_tmp_dir + " org.ewol.EwolConstants") - tools.remove_file(java_tmp_src + ".class") -""" - def create(target): # set the ewol folder for Android basic sources ... # TODO: Remove this really bad interface : @@ -249,6 +231,8 @@ def create(target): myModule.add_export_flag('link', "-ldl") myModule.add_export_flag('link', "-llog") myModule.add_export_flag('link', "-landroid") + # add tre creator of the basic java class ... + target.add_action("PACKAGE", tool_generate_main_java_class) elif target.name=="Windows": myModule.add_module_depend("glew") elif target.name=="MacOs": @@ -268,3 +252,480 @@ def create(target): return myModule + + +################################################################## +## +## Android specific section +## +################################################################## +def tool_generate_main_java_class(target, module, package_name): + file_list = [] + + debug.debug("------------------------------------------------------------------------") + debug.info("Generate android wrapping for '" + package_name + "'") + debug.debug("------------------------------------------------------------------------") + application_name = package_name + if target.config["mode"] == "debug": + application_name += "debug" + target.folder_java_project= target.get_build_folder(package_name) \ + + "/src/" \ + + module.package_prop["COMPAGNY_TYPE"] \ + + "/" + module.package_prop["COMPAGNY_NAME2"] \ + + "/" + application_name + "/" + + java_file_wrapper = target.folder_java_project + "/" + application_name + ".java" + + android_package_name = module.package_prop["COMPAGNY_TYPE"]+"."+module.package_prop["COMPAGNY_NAME2"]+"." + application_name + + if "ADMOD_ID" in module.package_prop: + module.package_prop["RIGHT"].append("INTERNET") + module.package_prop["RIGHT"].append("ACCESS_NETWORK_STATE") + + + debug.print_element("pkg", "absractionFile", "<==", "dynamic file") + # Create folder : + tools.create_directory_of_file(java_file_wrapper) + debug.info("create file : '" + java_file_wrapper + "'") + # Create file : + tmpFile = open(java_file_wrapper + "_tmp", 'w') + if module.package_prop["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 APACHE v2.0 (see license file)\n") + tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n") + tmpFile.write( " */\n") + tmpFile.write( "package "+ android_package_name + ";\n") + tmpFile.write( "import org.ewol.EwolActivity;\n") + if "ADMOD_ID" in module.package_prop: + 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 " + application_name + " extends EwolActivity {\n") + if "ADMOD_ID" in module.package_prop: + 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(\"" + module.package_prop["COMPAGNY_TYPE"]+"\", \""+module.package_prop["COMPAGNY_NAME2"]+"\", \"" + application_name + "\");\n") + if "ADMOD_ID" in module.package_prop: + 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(\"" + module.package_prop["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 module.package_prop.keys() \ + and module.package_prop["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 module.package_prop: + 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 APACHE v2.0 (see license file)\n") + tmpFile.write( " * @note This file is autogenerate ==> see documantation to generate your own\n") + tmpFile.write( " */\n") + tmpFile.write( "package "+ android_package_name + ";\n") + tmpFile.write( "import org.ewol.EwolWallpaper;\n") + tmpFile.write( "public class " + application_name + " extends EwolWallpaper {\n") + tmpFile.write( " public static final String SHARED_PREFS_NAME = \"" + application_name + "settings\";\n") + tmpFile.write( " public Engine onCreateEngine() {\n") + tmpFile.write( " Engine tmpEngine = super.onCreateEngine();\n") + tmpFile.write( " initApkPath(\"" + module.package_prop["COMPAGNY_TYPE"]+"\", \""+module.package_prop["COMPAGNY_NAME2"]+"\", \"" + application_name + "\");\n") + tmpFile.write( " return tmpEngine;\n") + tmpFile.write( " }\n") + tmpFile.write( "}\n") + tmpFile.flush() + tmpFile.close() + + tools.move_if_needed(java_file_wrapper + "_tmp", java_file_wrapper); + # add java file to build: + module.add_src_file([java_file_wrapper]) + + """ + ## todo: + tools.create_directory_of_file(target.get_staging_folder(package_name) + "/res/drawable/icon.png"); + if "ICON" in module.package_prop.keys() \ + and module.package_prop["ICON"] != "": + image.resize(module.package_prop["ICON"], target.get_staging_folder(package_name) + "/res/drawable/icon.png", 256, 256) + else: + # to be sure that we have all time a resource ... + tmpFile = open(target.get_staging_folder(package_name) + "/res/drawable/plop.txt", 'w') + tmpFile.write('plop\n') + tmpFile.flush() + tmpFile.close() + + """ + if module.package_prop["ANDROID_MANIFEST"] == "": + # force manifest file: + module.package_prop["ANDROID_MANIFEST"] = target.get_build_folder(package_name) + "/AndroidManifest.xml"; + debug.info(" create file: '" + module.package_prop["ANDROID_MANIFEST"] + "'") + if "VERSION_CODE" not in module.package_prop: + module.package_prop["VERSION_CODE"] = "1" + debug.print_element("pkg", "AndroidManifest.xml", "<==", "package configurations") + tools.create_directory_of_file(module.package_prop["ANDROID_MANIFEST"]) + tmpFile = open(module.package_prop["ANDROID_MANIFEST"], 'w') + tmpFile.write( '\n') + tmpFile.write( '\n') + tmpFile.write( ' \n') + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if module.package_prop["ANDROID_APPL_TYPE"]=="APPL": + tmpFile.write( ' \n') + if "ADMOD_ID" in module.package_prop: + 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 module.package_prop: + 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(module.package_prop["ANDROID_WALLPAPER_PROPERTIES"])!=0: + tmpFile.write( ' \n') + tmpFile.write( ' \n') + tmpFile.write( ' \n') + # write package autorisations : + if True==target.check_right_package(module.package_prop, "WRITE_EXTERNAL_STORAGE"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "CAMERA"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "INTERNET"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "ACCESS_NETWORK_STATE"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "MODIFY_AUDIO_SETTINGS"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "READ_CALENDAR"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "READ_CONTACTS"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "READ_FRAME_BUFFER"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "READ_PROFILE"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "RECORD_AUDIO"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "SET_ORIENTATION"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "VIBRATE"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "ACCESS_COARSE_LOCATION"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + if True==target.check_right_package(module.package_prop, "ACCESS_FINE_LOCATION"): + tmpFile.write( ' \n') + tmpFile.write( ' \n') + tmpFile.write( '\n\n') + tmpFile.flush() + tmpFile.close() + # end generating android manifest + + if module.package_prop["ANDROID_APPL_TYPE"]!="APPL": + #create the Wallpaper sub files : (main element for the application + debug.print_element("pkg", application_name + "_resource.xml", "<==", "package configurations") + tools.create_directory_of_file(target.get_build_folder(package_name) + "/res/xml/" + application_name + "_resource.xml") + tmpFile = open(target.get_build_folder(package_name) + "/res/xml/" + application_name + "_resource.xml", 'w') + tmpFile.write( "\n") + tmpFile.write( "\n") + tmpFile.flush() + tmpFile.close() + # create wallpaper setting if needed (class and config file) + if len(module.package_prop["ANDROID_WALLPAPER_PROPERTIES"])!=0: + tools.create_directory_of_file(target.folder_java_project + application_name + "Settings.java") + debug.print_element("pkg", target.folder_java_project + application_name + "Settings.java", "<==", "package configurations") + tmpFile = open(target.folder_java_project + application_name + "Settings.java", 'w'); + tmpFile.write( "package " + android_package_name + ";\n") + tmpFile.write( "\n") + tmpFile.write( "import " + android_package_name + ".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 " + application_name + "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("+ application_name + ".SHARED_PREFS_NAME);\n") + tmpFile.write( " addPreferencesFromResource(R.xml."+ application_name + "_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", target.get_build_folder(package_name) + "/res/xml/" + application_name + "_settings.xml", "<==", "package configurations") + tools.create_directory_of_file(target.get_build_folder(package_name) + "/res/xml/" + application_name + "_settings.xml") + tmpFile = open(target.get_build_folder(package_name) + "/res/xml/" + application_name + "_settings.xml", 'w'); + tmpFile.write( "\n") + tmpFile.write( "\n") + WALL_haveArray = False + for WALL_type, WALL_key, WALL_title, WALL_summary, WALL_other in module.package_prop["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 module.package_prop["ANDROID_WALLPAPER_PROPERTIES"]: + if WALL_type == "list": + debug.print_element("pkg", target.get_build_folder(package_name) + "/res/values/" + WALL_key + ".xml", "<==", "package configurations") + tools.create_directory_of_file(target.get_build_folder(package_name) + "/res/values/" + WALL_key + ".xml") + tmpFile = open(target.get_build_folder(package_name) + "/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 module.package_prop["ANDROID_RESOURCES"]: + if res_source == "": + continue + tools.copy_file(res_source , target.get_staging_folder(package_name) + "/res/" + res_dest + "/" + os.path.basename(res_source), force=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") + tools.create_directory_of_file(target.get_staging_folder(package_name) + "/src/noFile") + androidToolPath = target.folder_sdk + "/build-tools/" + # find android tool version + dirnames = tools.get_list_sub_folder(androidToolPath) + if len(dirnames) != 1: + debug.error("an error occured when getting the tools for android") + androidToolPath += dirnames[0] + "/" + + adModResouceFolder = "" + if "ADMOD_ID" in module.package_prop: + adModResouceFolder = " -S " + target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/res/ " + cmdLine = androidToolPath + "aapt p -f " \ + + "-M " + target.get_staging_folder(package_name) + "/AndroidManifest.xml " \ + + "-F " + target.get_staging_folder(package_name) + "/resources.res " \ + + "-I " + target.folder_sdk + "/platforms/android-" + str(target.boardId) + "/android.jar "\ + + "-S " + target.get_staging_folder(package_name) + "/res/ " \ + + adModResouceFolder \ + + "-J " + target.get_staging_folder(package_name) + "/src/ " + multiprocess.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}] + + tools.create_directory_of_file(target.get_staging_folder(package_name) + "/build/classes/noFile") + debug.print_element("pkg", "*.class", "<==", "*.java") + # more information with : -Xlint + # + java_file_wrapper + " "\ # this generate ex: out/Android/debug/staging/tethys/src/com/edouarddupin/tethys/edn.java + + #generate android java files: + filesString="" + for element in module.package_prop["ANDROID_JAVA_FILES"]: + if element=="DEFAULT": + filesString += target.folder_ewol + "/android/src/org/ewol/EwolAudioTask.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolCallback.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolConstants.java " + filesString += target.folder_ewol + "/android/src/org/ewol/Ewol.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolRendererGL.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolSurfaceViewGL.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolActivity.java " + filesString += target.folder_ewol + "/android/src/org/ewol/EwolWallpaper.java " + else: + filesString += element + " " + + if "ADMOD_ID" in module.package_prop: + filesString += target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/src/android/UnusedStub.java " + + if len(module.package_prop["ANDROID_WALLPAPER_PROPERTIES"])!=0: + filesString += target.folder_java_project + application_name + "Settings.java " + + adModJarFile = "" + if "ADMOD_ID" in module.package_prop: + adModJarFile = ":" + target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar" + + cmdLine = "javac " \ + + "-d " + target.get_staging_folder(package_name) + "/build/classes " \ + + "-classpath " + target.folder_sdk + "/platforms/android-" + str(target.boardId) + "/android.jar" \ + + adModJarFile + " " \ + + filesString \ + + java_file_wrapper + " " \ + + target.get_staging_folder(package_name) + "/src/R.java " + multiprocess.run_command(cmdLine) + + debug.print_element("pkg", ".dex", "<==", "*.class") + cmdLine = androidToolPath + "dx " \ + + "--dex --no-strict " \ + + "--output=" + target.get_staging_folder(package_name) + "/build/" + application_name + ".dex " \ + + target.get_staging_folder(package_name) + "/build/classes/ " + + if "ADMOD_ID" in module.package_prop: + cmdLine += target.folder_sdk + "/extras/google/google_play_services/libproject/google-play-services_lib/libs/google-play-services.jar " + multiprocess.run_command(cmdLine) + """ + return {"files":file_list} + + +