
ããã«ã¡ã¯ãHabrã
æ°ãæåã Ubuntu TouchãAllwinner A10ãã©ãããã©ãŒã ã«ç§»æ€ããŠããŸãããã
ãã®éçšã§ç§ã¯èšå¿µåãšããŠã¡ã¢ãåã£ãã ä»ãç§ã®æèŠã§ã¯ãUbuntu Touchãæçµçã«Mirã°ã©ãã£ãã¯ãµãŒããŒãªã©ã«ç§»è¡ãããŸã§ããããã¯äŸç¶ãšããŠé¢é£ããŠããŸãã
ãã®èšäºã¯ãèå³ã®ãã人ãUTãšã®èŠªå¯ãªé¢ä¿ãå§ããããã®åºçºç¹ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
ãã¬ãŒã³ããŒã·ã§ã³ã®ã¹ã¿ã€ã«ã¯æè¡çãªãã®ãšã¯ã»ã©é ãã§ãããæ°ã«ããªãå Žåã¯ã
ç«ã«èªããŸãã
ã¯ããã«
libhybrisãšã¯
libhybrisã¯ãã©ã€ãã©ãªãBionicãŠãŒã¶ãŒã¹ããŒã¹ããGlibcãŠãŒã¶ãŒã¹ããŒã¹ã«ããŒãã§ããã¬ã€ã€ãŒã§ãäžéšã®æåãGlibcã®ãªãã·ã§ã³ã§ãªã³ã¶ãã©ã€ã§çœ®ãæããŸãã ç°¡åã«èšãã°ããã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãLinux空éã§Androidå°çšã®ã©ã€ãã©ãªã䜿çšã§ããŸãã ãã¡ãããæ倧ã®ã¡ãªããã¯ã補é å ãAndroidå°çšã«äœæããç¬èªã®GPUãã©ã€ããŒã䜿çšã§ããããšã§ãã
Surfaceflingerãšã¯
surfaceflinger-ãã€ãã£ãAndroidãµãŒãã¹ãã°ã©ãã£ãã¯ã¬ã€ã€ãŒã®è€åãããŒãžã£ãŒã

ãã€ã³ããŒIPCãšSurfaceFlingerã®è©³çŽ° ïŒ
- http://www.opersys.com/downloads/inside-androids-ui-130530.pdf
- http://0xlab.org/~jserv/android-binder-ipc.pdf
- dpolishukã¯çŽ æŽãããããã¥ã¡ã³ããå ±æããŸãã-Android Binder
Ubuntu touch
Ubuntu Touch Developer Previewèªäœã¯Androidã«åºã¥ããŠãããããŒããŠã§ã¢ãæäœããããã«å¿ èŠãªãµãŒãã¹ãåããŠããŸãã äŸåé¢ä¿ã®äžè¬çãªæŠèŠã¯ã Ubuntu Touch PortingãŸãã¯OpenNetã®ã¡ã¢ã«ãããŸãã
åºæ¬ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšããŠãéåžžã®Android JB 4.2ã䜿çšããããããããCyagenMod-10.1 ïŒCMãµããããžã§ã¯ãã®ãªããžããªã¯phablet.ubuntu.com/gitweb ïŒã§ãã dalvikãšjavaã«é¢é£ãããã®ã¯ãã¹ãŠåé€ãããŸãã-ã·ã¹ãã ãµãŒãã¹ãšHALã§æ§æããããã€ãã£ãéšåã®ã¿ãæ®ããŸãã å¿ èŠã«å¿ããŠã AOSP 4.1ã䜿çšã§ããŸããã4.1ã®ãã€ãã£ãAPIã«é©å¿ããæºåãã§ããŠãããããã¥ã¡ã³ããä»æ§ã«ãã£ãŠã«ããŒãããŠãããããªãªãŒã¹ããšã«ç°ãªããŸãã
UTã³ã³ããŒãã³ãã¯chrootã«ãããèªå·±èšè¿°ãããuchrootãŠãŒãã£ãªãã£ã䜿çšãããŸã ãæç²ïŒ
static int ubuntum(void *a) { /* Chroot */ chroot("/data/ubuntu"); chdir("/"); /* Set basic env variables */ char *const envp[8] = { "container=aal", "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "SHELL=/bin/bash", "HOME=/root", "USER=root", "USERNAME=root", "LOGNAME=root", NULL }; /* Exec shell */ execle("/sbin/init", "/sbin/init", "--verbose", NULL, envp); return 0; }
Androidç°å¢ãšUbuntuã®chrootç°å¢éã®çžäºäœçšã«ã¯ã libhybrisã¡ã«ããºã ã䜿çšãããŸãã

Ubuntu Touchã³ã³ããŒãã³ã
ããŸããŸãªUTã³ã³ããŒãã³ãããã®ã¹ãŒãã¯ãphablet-teamã©ã³ãããããªããžããªã§èŠãããšãã§ããŸãã
Androidããã€ã¹ã®ãã©ãããã©ãŒã ãæ åœãã次ã®2ã€ã®ã³ã³ããŒãã³ãã«é¢å¿ããããŸãã
ææ°ã®ãœãŒã¹ã³ãŒããããŠã³ããŒãããŸãã
bzr branch lp:platform-api bzr branch lp:qtubuntu
Ubuntu Platform API
Ubuntuãã©ãããã©ãŒã APIã¯ã ãã©ãããã©ãŒã ã®æ©èœïŒAndroidïŒã䜿çšããŠåºæ¬æäœãå®è¡ããããã®äœã¬ãã«APIã§ãã
ã¡ãœããã®äŸïŒ
- ubuntu_application_ui_show_surface
- ubuntu_application_ui_hide_surface
- ubuntu_application_ui_move_surface_to
- ubuntu_application_ui_resize_surface_to
doc / mainpage.mdããã¥ã¡ã³ããã¡ã€ã«ããã platform-apiãœãŒã¹ããªãŒã¯2ã€ã®éšåã«åå²ã§ããããšãããããŸãã
- include-æœè±¡å®£èšãã©ãããã©ãŒã API
- android -Androidçšã®ãã©ãããã©ãŒã APIã®å®è£ ïŒAndroid 4.2ã®å Žå-
ãããŠããã®APIã䜿çšããéã«ãµãŒãããŒãã£ã®éçºè ãä¿¡é Œã§ããå¯äžã®ãã®ã¯ã
/ ubuntu / applicationãã£ã¬ã¯ããªãå«ã¿ ãä»ã®ãã¹ãŠã®ãã®ã¯æéã®çµéãšãšãã«å€åãããšäºæ³ãããŸãã
debian / controlãã¡ã€ã«ãã次ã®ããšãåŠã³ãŸãïŒ
Package: libplatform-api1-hybris Depends: libhybris Description: Hybris implementation of the Platform API (runtime) This package provides the hybris implementation of the Platform API. The produced library should be used via libhybris, to communicate with the Android userspace, which is where the Ubuntu Application Manager lives.
ãããã€ãŸãã Android / hybris / Android.mkã§å€æãããšããã©ãããã©ãŒã APIå®è£ ã¯ããã€ãã£ãAndroid ã©ã€ãã©ãªãšã®ãªã³ã¯ãæã€libubuntu_application_apiã©ã€ãã©ãªãšããŠçµã¿ç«ãŠãããAndroidãŠãŒã¶ãŒã¹ããŒã¹ã«é 眮ãããŸãã
LOCAL_SRC_FILES := \ ubuntu_application_api_for_hybris.cpp \ ubuntu_application_gps_for_hybris.cpp \ ubuntu_application_sensors_for_hybris.cpp \ ../default/default_ubuntu_application_sensor.cpp \ ../default/default_ubuntu_application_ui.cpp \ ../default/default_ubuntu_ui.cpp \ application_manager.cpp LOCAL_MODULE := libubuntu_application_api LOCAL_SHARED_LIBRARIES := \ libandroidfw \ libbinder \ libutils \ libgui \ libEGL \ libGLESv2 \ libhardware \ libhardware_legacy
platform-api / src / androidãã£ã¬ã¯ããªã¯ç¡äººã®ãŸãŸã«ãããŸããã詳现ã«æ€èšããŸãã CMakeLists.txtãã¡ã€ã«ã®ååšããå€æãããšãglibcã®ã¢ã»ã³ããªã¯æ¢ã«é²è¡äžã§ãã
ã³ãŒããå«ã1ã€ã®ãã¡ã€ã«-ubuntu_application_api.cppããããŸãã
extern void *android_dlopen(const char *filename, int flag); extern void *android_dlsym(void *handle, const char *symbol);
-libhybrisããã·ãŒãžã£ã䜿çšããŠãAndroidãŠãŒã¶ãŒç©ºéããå
±æã©ã€ãã©ãªããæåãåçã«ããŒãããŸãã
struct Bridge { static const char* path_to_library() { return "/system/lib/libubuntu_application_api.so"; } Bridge() : lib_handle(android_dlopen(path_to_library(), RTLD_LAZY)) { assert(lib_handle && "Error loading ubuntu_application_api"); } ....... void* resolve_symbol(const char* symbol) const { return android_dlsym(lib_handle, symbol); } void* lib_handle; };
-libubuntu_application_api.soãããã£ã©ã¯ã¿ãŒãããŒãããããã®ã·ã³ãã«ãªããªããžãããã¯ãã€ãã£ãAndroidãµãŒãã¹ãšé£æºã ã android / hybris / Android.mkã䜿çšããŠæè¿ã粟ç¥çã«ãçµã¿ç«ãŠãŸãã ã
#define IMPLEMENT_VOID_FUNCTION3(symbol, arg1, arg2, arg3) \ void symbol(arg1 _1, arg2 _2, arg3 _3) { \ static void (*f)(arg1, arg2, arg3) = NULL; \ DLSYM(&f, #symbol); \ f(_1, _2, _3); } ....... IMPLEMENT_VOID_FUNCTION2(ubuntu_application_ui_init, int, char**); IMPLEMENT_FUNCTION0(StageHint, ubuntu_application_ui_setup_get_stage_hint); IMPLEMENT_FUNCTION0(FormFactorHint, ubuntu_application_ui_setup_get_form_factor_hint); IMPLEMENT_VOID_FUNCTION1(ubuntu_application_ui_start_a_new_session, SessionCredentials*); IMPLEMENT_VOID_FUNCTION2(ubuntu_application_ui_set_clipboard_content, void*, size_t); .......
-libubuntu_application_api.soã«å®è£
ãããAPIæåã®ã©ãããŒã®æã
æ··ä¹±ãé¿ããããã«ïŒ
- libubuntu_application_api.so-ãã€ãªããã¯ç°å¢ã®ã©ã€ãã©ãªã§ãAndroidãŠãŒã¶ãŒã¹ããŒã¹ã«ãããŸãã
- libubuntu_application_api.so -glibcã®äžã®ã©ã€ãã©ãªã§ãLinux userpaceïŒchrootïŒã«äœãã§ããŠãlibhybrisãä»ããŠæåããæåãããŒãããŸãã
éçºè ã¯ãåãååã®ã©ã€ãã©ãªãäœæããããšã§ãå®å®ã®ãšã³ããããŒãæžããããšã«ããŸããã
merge-153874ãã£ã¹ã«ãã·ã§ã³ã³ã³ããŒãã³ãã®åœåã«é¢ãã圌ãã®è°è«ãèŠããšãããªãã®è³ã¯æ¶ããŠããŸããŸãã
Ubuntuã¢ããªã±ãŒã·ã§ã³ãããŒãžã£ãŒ
platform-api / android / hybrisã«ã¯ãUbuntuãã©ãããã©ãŒã APIã®å®è£ ã«å ããŠã ubuntuappmanagerã®ãœãŒã¹ããããŸã-Ubuntuã¢ããªã±ãŒã·ã§ã³ãµãŒãã¹ã¯ãAndroidãŠãŒã¶ãŒç©ºéã«ååšãã Android.mkããå€æããŠã libubuntu_application_apiãç©æ¥µçã«äœ¿çšããAndroidãä»ããŠBinder IPCãµãŒãã¹ãšéä¿¡ããŸãã
LOCAL_SRC_FILES:= \ application_manager.cpp \ default_application_manager.cpp \ LOCAL_MODULE:= ubuntuappmanager LOCAL_MODULE_TAGS := optional LOCAL_SHARED_LIBRARIES := \ libbinder \ libinput \ libgui \ libskia \ libandroidfw \ libutils \ libEGL \ libGLESv2 \ libubuntu_application_api
default_application_manager.hãç°¡åã«èŠãŠã å€æ°ã®ã¢ããªã±ãŒã·ã§ã³ããã³ã»ãã·ã§ã³ç®¡çã¿ã¹ã¯ã解決ããŸãã
void update_app_lists(); void binderDied(const android::wp<android::IBinder>& who); void register_a_surface(...); void request_fullscreen(...); int get_session_pid(const android::sp<android::IApplicationManagerSession>& session); void focus_running_session_with_id(int id); void unfocus_running_sessions(); int32_t query_snapshot_layer_for_session_with_id(int id); android::IApplicationManagerSession::SurfaceProperties query_surface_properties_for_session_id(int id); void switch_focused_application_locked(size_t index_of_next_focused_app); void switch_focus_to_next_application_locked(); void kill_focused_application_locked(); void start_a_new_session( int32_t session_type, int32_t stage_hint, const android::String8& app_name, const android::String8& desktop_file, const android::sp<android::IApplicationManagerSession>& session, int fd);
QtUbuntu
Ubuntuãã©ãããã©ãŒã APIãšQt / QMLã¢ããªã±ãŒã·ã§ã³éã®çžäºäœçšãæ åœããUTã®éšåãæ±ããŸãã
Qt Platform Abstractionã«æ £ããŠããªãå ŽåãèŠããã«ãããã¯ç¹å¥ã«äœæãããQPAãã©ã°ã€ã³ã䜿çšããŠQtã¢ããªã±ãŒã·ã§ã³ãèµ·åãããŠãããã©ââãããã©ãŒã ããæœè±¡åããæ©äŒã§ãã
QPAãã©ã°ã€ã³ã¯createPlatformWindowãªã©ã®åºæ¬çãªã¡ãœãããå®è£ ããQtã¢ããªã±ãŒã·ã§ã³ã¯ãŠã£ã³ããŠãäœæãããšãã«ãæœè±¡åãã©ã°ã€ã³ã®createPlatformWindowã·ã³ãã«ã䜿çšãã ããããã©ããžè¡ã£ãŠãå¹ãé£ã°ããŸããã
ãã®å ŽåãUbuntuã¢ããªã±ãŒã·ã§ã³APIãæäœããããã®QPAãã©ã°ã€ã³ãæ±ããŸãã
~/ubuntu/qtubuntu $ tree . âââ qtubuntu.pro âââ src â âââ modules â â âââ application <------------------ QML plugin â â â âââ application.cc | Ubuntu Application Manager â â â âââ application.h | QtQuick â â â âââ application.pro | â â â âââ application_image.cc | â â â âââ application_image.h | â â â âââ application_list_model.cc | â â â âââ application_list_model.h | â â â âââ application_manager.cc | â â â âââ application_manager.h | â â â âââ application_window.cc | â â â âââ application_window.h | â â â âââ input_filter_area.cc | â â â âââ input_filter_area.h | â â â âââ logging.h | â â â âââ plugin.cc | â â â âââ qmldir | â â âââ ---------------------------------- â â âââ modules.pro â âââ platforms â â âââ base â â âââ platforms.pro â â âââ ubuntu <-------------- QPA â â âââ clipboard.cc â â âââ clipboard.h â â âââ input.cc â â âââ input.h â â âââ integration.cc <-- `createPlatformWindow` â â âââ integration.h â â âââ main.cc â â âââ screen.cc â â âââ screen.h â â âââ ubuntu.json â â âââ ubuntu.pro â â âââ window.cc â â âââ window.h â âââ src.pro âââ tests
ubuntu.proã®ã³ã³ãã³ãããå€æãããšããã©ãããã©ãŒã ã¯libubuntu_application_api.soã® glibcããŒãžã§ã³ãšãªã³ã¯ããŠããŸã
integration.ccããã³window.ccã§äœ¿çšããããã©ãããã©ãŒã APIã»ããããã®æ¬¡ã®ã¡ãœããåŒã³åºãã«æ³šæããŠãã ããã
#include <ubuntu/application/ui/ubuntu_application_ui.h> ubuntu_application_ui_start_a_new_session(&credentials); ubuntu_application_ui_destroy_surface(surface_); ubuntu_application_ui_create_surface(&surface_, "QUbuntuWindow", geometry.width(), geometry.height(), static_cast<SurfaceRole>(role), flags, eventCallback, this); ubuntu_application_ui_move_surface_to(surface_, geometry.x(), geometry.y()); ubuntu_application_ui_request_fullscreen_for_surface(surface_); ubuntu_application_ui_move_surface_to(surface_, rect.x(), rect.y()); ubuntu_application_ui_resize_surface_to(surface_, rect.width(), rect.height()); ubuntu_application_ui_request_fullscreen_for_surface(surface_); ubuntu_application_ui_show_surface(surface_); ubuntu_application_ui_hide_surface(surface_);
ããã§ãQtã¢ããªã±ãŒã·ã§ã³ããŠã£ã³ããŠãäœæããéã«ã qubuntuãã©ãããã©ãŒã ã®QPAããã¡ãœãããåŒã³åºãããšãæããã«ãªããŸãã-QUbuntuIntegration :: integration.ccãã¡ã€ã«ã®createPlatformWindow ïŒ
QPlatformWindow* QUbuntuIntegration::createPlatformWindow(QWindow* window) { ....... // Create the window. QPlatformWindow* platformWindow = new QUbuntuWindow(.......); ....... }
window.ccãã¡ã€ã«ã®QUbuntuWindowã³ã³ã¹ãã©ã¯ã¿ãŒã調ã¹ããšã QUbuntuWindow :: createWindowïŒïŒã¡ãœããã®åŒã³åºããèŠã€ãããŸãã
void QUbuntuWindow::createWindow() { ....... ubuntu_application_ui_create_surface( &surface_, "QUbuntuWindow", geometry.width(), geometry.height(), static_cast<SurfaceRole>(role), flags, eventCallback, this); ....... ubuntu_application_ui_move_surface_to(surface_, geometry.x(), geometry.y()); ....... }
ããã¯éåžžã«ç°¡ç¥åãããã³ãŒãã§ãããæ¬è³ªã¯æ確ã§ã-libubuntu_application_api.soã®glibcããŒãžã§ã³ã§å®è£ ããUbuntuãã©ãããã©ãŒã APIãåŒã³åºãããŸã ãããã¯ãå®éã«ã¯libubuntu_application_api.soã®ãã€ãªããã¯ããŒãžã§ã³ãžã®ããªããžã§ãã api / android ã
ãžã£ã³ãããŠãïŒ
grepã䜿çšããŠç®çã®ãã¡ã€ã«ã«ãžã£ã³ããããšã platform-api / android / default / default_ubuntu_application_ui.cppã«ç§»åããŸãã
// ubuntu_application_ui_create_surface ubuntu::application::ui::Surface::Ptr surface = session->create_surface(props, ubuntu::application::ui::input::Listener::Ptr(new CallbackEventListener(cb, ctx))); // ubuntu_application_ui_move_surface_to auto s = static_cast<Holder<ubuntu::application::ui::Surface::Ptr>*>(surface); s->value->move_to(x, y);
人圢ãéããŠã ubuntu :: application :: ui :: Sessionããã³ããã«å¿ããŠã ubuntu :: application :: ui :: Surfaceãã©ã®ããã«å®è£ ãããŠãããã確èªããããšã¯æ®ããŸãã ãããŠããããã¯ãã®ãã¡ã€ã«ã«å®è£ ãããŠããŸã-ubuntu_application_api_for_hybris.cpp ïŒ
namespace android { ....... struct Session : public ubuntu::application::ui::Session, public UbuntuSurface::Observer { ....... Session(.....) { ...... ubuntu::application::ui::Surface::Ptr create_surface( const ubuntu::application::ui::SurfaceProperties& props, const ubuntu::application::ui::input::Listener::Ptr& listener) { ....... // , . UbuntuSurface UbuntuSurface* surface = new UbuntuSurface(client, client_channel, looper, props, listener,this); ....... // 100% , UbuntuSurface return ubuntu::application::ui::Surface::Ptr(surface); .......
å·»ãæ»ãã UbuntuSurfaceãèŠã€ããŸã ã
struct UbuntuSurface : public ubuntu::application::ui::Surface { ....... UbuntuSurface(const sp<SurfaceComposerClient>& client, .......) : ubuntu::application::ui::Surface(listener) { // - Android API surface_control = client->createSurface( String8(props.title), props.width, props.height, PIXEL_FORMAT_RGBA_8888, props.flags & .......); surface = surface_control->getSurface(); .......
android :: SurfaceControlåã®ãªããžã§ã¯ããååŸããŸããããã¯ã android :: SurfaceComposerClientïŒïŒ-> createSurfaceïŒïŒã®åŒã³åºãã®çµæã§ãã
android :: SurfaceComposerClient ïŒ frameworks / native / libs / gui / Surface.cpp ïŒãžã®ãã¹ãŠã®åŒã³åºãã¯ããµã€ãºå€æŽã移åãã¬ã€ã€ãŒã®é åºã®å€æŽãªã©ãééããŸãã
ãã§ãŒã³ã«æ»ã£ãŠãQPAãã©ãããã©ãŒã Ubuntuã§æ¬¡ã®Qtã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšå®éã«äœãèµ·ããããç解ããŸãã

ãããã«
ç§ã®æèŠã§ã¯ãäžèšã§èª¬æããUbuntu TouchãšAndroidã®çžäºäœçšã®åçã¯èªçµŠèªè¶³ã§ããããããã®æç¹ã§èªåãæ¢ããªããã°ãªããŸããã äžèšã®ãã¹ãŠãšã¯å¥ã«ããããªãæ€èšãæ¢ã«è¡ãããŠããå ŽåããããŸãã qmlsceneãšubuntuappmanagerã®çžäºäœçšã®åé¡ã SurfaceFlingerããã³InputDispatcherãµãŒãã¹ã䜿çšããå ¥åå¶åŸ¡ã®ååãããã³ãã®åºç¯ãªãããã¯ã®ã³ãŒããŒããã®ä»ã®è³ªåã¯æªè§£æ±ºã®ãŸãŸã§ããã ããããããã¯ãŸã£ããç°ãªã話ã§ãã
1é±éåŸãFirefox OSã«é»è©±ãå±ããŸãã