
ããã«ã¡ã¯ãHabrã
æ°ãæåã
Ubuntu Touchã
Allwinner A10ãã©ãããã©ãŒã ã«ç§»æ€ããŠ
ããŸãããã
ãã®éçšã§ç§ã¯èšå¿µåãšããŠã¡ã¢ãåã£ãã ä»ãç§ã®æèŠã§ã¯ãUbuntu Touchãæçµçã«
Mirã°ã©ãã£ãã¯ãµãŒããŒãªã©ã«ç§»è¡ãããŸã§ããããã¯äŸç¶ãšããŠé¢é£ããŠããŸãã
ãã®èšäºã¯ãèå³ã®ãã人ãUTãšã®èŠªå¯ãªé¢ä¿ãå§ããããã®åºçºç¹ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
ãã¬ãŒã³ããŒã·ã§ã³ã®ã¹ã¿ã€ã«ã¯æè¡çãªãã®ãšã¯ã»ã©é ãã§ãããæ°ã«ããªãå Žåã¯ã
ç«ã«èªããŸãã
ã¯ããã«
libhybrisãšã¯
libhybrisã¯ãã©ã€ãã©ãªã
BionicãŠãŒã¶ãŒã¹ããŒã¹ãã
GlibcãŠãŒã¶ãŒã¹ããŒã¹ã«ããŒãã§ããã¬ã€ã€ãŒã§ãäžéšã®æåãGlibcã®ãªãã·ã§ã³ã§ãªã³ã¶ãã©ã€ã§çœ®ãæããŸãã ç°¡åã«èšãã°ããã®ãœãªã¥ãŒã·ã§ã³ã䜿çšãããšãLinux空éã§Androidå°çšã®ã©ã€ãã©ãªã䜿çšã§ããŸãã ãã¡ãããæ倧ã®ã¡ãªããã¯ã補é å
ãAndroidå°çšã«äœæããç¬èªã®GPUãã©ã€ããŒã䜿çšã§ããããšã§ãã
Surfaceflingerãšã¯
surfaceflinger-ãã€ãã£ãAndroidãµãŒãã¹ãã°ã©ãã£ãã¯ã¬ã€ã€ãŒã®è€åãããŒãžã£ãŒã
ãã€ã³ããŒIPCãš
SurfaceFlingerã®è©³çŽ° ïŒ
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("/data/ubuntu"); chdir("/"); 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 }; 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) { .......
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 :: 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ãèŠã€ã
ãŸã ã
struct UbuntuSurface : public ubuntu::application::ui::Surface { ....... UbuntuSurface(const sp<SurfaceComposerClient>& client, .......) : ubuntu::application::ui::Surface(listener) {
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ã«é»è©±ãå±ããŸãã