精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

另辟蹊徑創建移動應用:iOS和Android代碼共享

移動開發 Android iOS
在蘋果和安卓的應用商店中有成千上萬各種用途的移動應用。iOS設備上的應用通常使用Objective-C工具庫創建而成,而安卓設備上的應用則 基于Java語言。在這篇文章中我們將向您展示兩種不太常用的使用Java和Xtend構建原生應用的方法,這兩種方法能夠幫助開發者在兩個應用平臺上共 享代碼,從而簡化開發工作。

[[120234]]

過去幾年,移動應用席卷了整個世界,在工作和生活的方方面面改變著我們使用互聯網的方式。創建移動應用的各種技術也隨之興起,各種開發流程也 將移動應用視為一等公民,開始考慮適應移動開發的流程。盡管已經讓人感覺無處不在,真正的移動應用時代才剛剛開始。我們即將面對新一代的移動設備,如可穿戴設備或組成物聯網的各種各樣的移動裝置。我們將面臨全新的用于數據展示和命令接收的用戶交互接口。我們也認識到越來越多的公司將真正采取移動優先的戰 略。所有的這些都將對我們未來幾年設計、開發和測試軟件的方式產生巨大影響。

在蘋果和安卓的應用商店中有成千上萬各種用途的移動應用。iOS設備上的應用通常使用Objective-C工具庫創建而成,而安卓設備上的應用則 基于Java語言。在這篇文章中我們將向您展示兩種不太常用的使用Java和Xtend構建原生應用的方法,這兩種方法能夠幫助開發者在兩個應用平臺上共享代碼,從而簡化開發工作。

使用Java和RoboVM開發原生iOS應用

將安卓和iOS兩個平臺同時作為目標平臺的移動應用開發者經常面臨很多挑戰。在比較這兩個平臺的原生應用開發環境時,例如分別由谷歌和蘋果提供的開 發工具鏈,很容易就能夠發現這兩者之間有著本質的區別。谷歌所提供的安卓開發環境是基于Eclipse集成開發環境和Java程序設計語言的。而由蘋果所 提供的iOS開發環境則是基于Xcode集成開發環境和Objective-C程序設計語言的。

這些平臺間的差異導致代碼無法重用。而且很少有開發者能夠同時精通兩個環境。最終就導致幾乎每個跨平臺的移動應用都需要為各個平臺準備單獨的開發團隊并使用單獨的代碼庫。

RoboVM是一個新的開源項目,旨在不影響開發者和應用用戶體驗的前提下解決上述問題。RoboVM項目的目標是在iOS設備上使用Java和其 他JVM語言,如Scala,Clojure和Kotlin。與其他類似的工具不同,RoboVM不會對開發者所使用的Java平臺特性做任何限制,如反 射機制或文件I/O,并且還允許開發人員重用Java龐大的第三方庫生態系統。RoboVM的獨特之處還在于開發人員能夠通過一個Java到 Objective-C的橋接器訪問到完整的原生iOS API。這樣,應用程序開發時,就能夠用Java語言編寫真正的原生用戶交互界面并且能夠獲取到完整的硬件訪問權限,同時使用的開發工具也是Java開發 人員所熟悉的Eclipse和Maven等。

使用RoboVM,進行跨平臺開發將變得相對容易;同一組Java開發人員就有能力構建兩個版本的移動應用程序并且代碼庫中的相當一部分代碼都能夠被共享。

如何開始?

RoboVM有多種調用方式,如命令行方式或使用Maven或Gradle,最容易上手的方式應該是使用RoboVM的Eclipse插件。

配置要求

安裝RoboVM的Eclipse插件之前,請確保系統滿足如下要求:

  • 一臺運行Mac OS X 10.9操作系統的Mac電腦。
  • Oracle Java SE 7 JDK。
  • 從Mac應用商店下載的Xcode 5.x集成開發環境。

需要注意的是,必須使用Oracle Java SE 7 JDK運行Eclipse。Eclipse無法正常運行在蘋果的Java 6 JVM之上。

安裝RoboVM的Eclipse插件

系統滿足所有的先決條件之后,安裝插件是一項很簡單的工作。從Eclipse的Help菜單中打開Eclipse Marketplace,搜索RoboVM并點擊Install Now即可。

或者也可以使用如下更新站點

運行一個簡單的iOS應用

接下來我們將創建一個簡單的iOS應用。首先創建一個新的項目:File => New => Project......。在列表中選擇RoboVM iOS Project向導。

在Project Name,Main Class和App name欄中輸入IOSDemo,在App id一欄中輸入org.robovm.IOSDemo。其他欄目保持默認值點擊Finish。

然后,創建一個新的名為IOSDemo的類文件,省略包名。將下面的代碼拷貝粘貼到新創建的文件中,替換Eclipse自動生成的代碼。

  1. import org.robovm.apple.coregraphics.*; 
  2. import org.robovm.apple.foundation.*; 
  3. import org.robovm.apple.uikit.*; 
  4.  
  5. public class IOSDemo extends UIApplicationDelegateAdapter { 
  6.  
  7.     private UIWindow window = null
  8.     private int clickCount = 0
  9.  
  10.     @Override 
  11.     public boolean didFinishLaunching(UIApplication application, 
  12.             NSDictionary launchOptions) { 
  13.  
  14.         final UIButton button = UIButton.create(UIButtonType.RoundedRect); 
  15.         button.setFrame(new CGRect(115.0f, 121.0f, 91.0f, 37.0f)); 
  16.         button.setTitle("Click me!", UIControlState.Normal); 
  17.  
  18.         button.addOnTouchUpInsideListener(new UIControl.OnTouchUpInsideListener() { 
  19.             @Override 
  20.             public void onTouchUpInside(UIControl control, UIEvent event) { 
  21.                 button.setTitle("Click #" + (++clickCount), UIControlState.Normal); 
  22.  
  23.                 } 
  24.             }); 
  25.  
  26.             window = new UIWindow(UIScreen.getMainScreen().getBounds()); 
  27.             window.setBackgroundColor(UIColor.colorLightGray()); 
  28.             window.addSubview(button); 
  29.             window.makeKeyAndVisible(); 
  30.  
  31.             return true
  32.        } 
  33.        
  34.        public static void main(String[] args) { 
  35.             NSAutoreleasePool pool = new NSAutoreleasePool(); 
  36.             UIApplication.main(args, null, IOSDemo.class); 
  37.             pool.close(); 
  38.        } 

***,右鍵點擊剛剛創建的項目,選擇Run As... =>iOS Simulator App (iPhone),在iOS模擬器中啟動應用程序。這樣,應用程序就運行在一個模擬的iPhone上了。

[[120235]]

如果需要在真實的設備上運行應用程序,需要使用Run As... =>iOS Device App選項。需要注意的是,執行這一選項之前,所用到的設備需要進行相應的設置。設置的過程超出了本文的討論范圍。詳細信息請參照蘋果的官方文檔

#p#

創建用于應用商店發布的IPA文件

如果應用商店的發布證書(Distribution Certificate)和應用描述文件(Provisioning Profile)已經準備妥當,創建用于提交到應用商店的IPA軟件包只需要在Eclipse中右鍵點擊RoboVM iOS項目,選擇RoboVM Tools=>Package for App Store/Ad-Hoc distribution… ,填寫對話框中相關信息即可。

完成上述操作后,將會在目標文件夾中生成一個后綴為.IPA的文件。使用Application Loader即可驗證生成的IPA文件并將其提交到應用商店中。使用Spotlight可以很方便地定位到Application Loader應用。

從蘋果網站上能夠找到很多關于如何加入iOS開發者計劃及如何創建用于應用商店發布的證書和應用描述文件的資源

底層實現機制

字節碼編譯器

RoboVM的核心是它的預編譯器。預編譯器可以通過命令行或者Maven、Gradle等構建工具或IDE調用。它可以將Java字節碼翻譯成用 于特定操作系統和CPU型號的機器碼。一般來說會翻譯成用于iOS系統和ARM處理器的機器碼,不過RoboVM也支持將字節碼轉為運行在x86 CPU(32位)上的Mac OS X和Linux系統的機器碼。

這種預編譯的方法與Oracle Hotspot之類的傳統JVM的工作機制有很大的區別。這些JVM通常會在運行時讀取Java字節碼,然后以某種方式執行包含在字節碼的虛擬機指令。為 了加快這一進程,JVM采用了一種被稱為即時編譯的技術。簡單來說,這個過程會在程序***次調用某個方法時,將這一方法的虛擬機指令翻譯成當前系統所用的 CPU型號對應的機器碼。

由于蘋果內置于iOS中的技術限制,在iOS應用中使用任何形式的即時編譯技術都是不可能的。唯一的替代方案就是使用解釋器或像RoboVM中所用 的預編譯技術,而解釋器這種方式速度很慢并且十分耗電。預編譯的過程發生在使用開發者的機器進行編譯的時候,在iOS設備上運行時,生成的機器碼就能夠全 速運行,因此在速度上可以與由Objective-C編譯生成的代碼媲美,甚至可能會更快一些。

由于RoboVM預編譯器消費Java字節碼,而不是Java源代碼,因此至少在理論上可以用于任何能夠編譯成字節碼的JVM語言。目前已知的 RoboVM預編譯器能夠正常工作的JVM語言有Scala,Clojure和Kotlin。這種方法的另一個好處是,可在無需任何原始源代碼的情況下, 在標準JAR文件中的第三方庫上使用RoboVM,這樣就可以在應用中使用專有的和閉源的庫。

增量編譯

即使是非常簡單的RoboVM應用,例如IOSDemo應用,在***次啟動時,都需要耗費較長一段時間。RoboVM編譯器編譯應用的過程是從應用 的main類開始。然后編譯main類所用到的所有的類,之后再編譯前面的類所用到的所有類,如此循環,直到應用所需的所有類均完成編譯為止。在這一過程 中,標準的運行時類,如java.lang.Object和java.lang.String,也包含在編譯的范圍內。這是一個一次性的過程。 RoboVM會緩存已經編譯過的類,只有一個類或與它有直接依賴關系的類已經發生了改變時,才會重新編譯這個類。

增量編譯和緩存目標文件的好處在于能夠減少編譯所耗費的時間。在生成的可執行文件中僅包含能夠從Main類觸及到的類可以降低可執行文件的大小。不 過,在某些情況下(如通過反射機制加載類時),RoboVM編譯器無法決定是否應該對某個類進行編譯。不過,可以給編譯器下達指令,顯式地將某個特定的類 或者所有符合某個條件的類包含在編譯范圍內。

基于安卓的運行時類庫

任何的JVM虛擬機都需要運行時類庫。這個類庫為所有的Java程序提供標準的包和類,如java.lang.Object和 java.lang.String。RoboVM的運行時類庫來自于安卓開源項目和已經被移植到RoboVM的非安卓專用的包中。這就意味著如果Java 或JVM代碼中只用到了安卓標準包中的類,那么這些代碼直接就能夠在RoboVM上正常運行。

RoboVM現狀

RoboVM目前仍在開發過程中,不過已經可以基本使用。1.0版本預計將在2014年年底之前發布。

在蘋果應用商店中已經有至少50個基于RoboVM的應用。已知應用程序的***列表請參見這里

目前為止,大概有50%左右的iOS API可用在基于RoboVM的iOS應用中。在RoboVM的Wiki上可以查看到關于這些綁定的當前狀態列表。截至現在,RoboVM上已經能夠運行由Scala,Clojure和Kotlin所編寫的代碼。

關于RoboVM的文檔,目前仍在完善過程中。在2014年晚些時候,1.0版本發布時,將會有較為完備的文檔說明。

RoboVM的應用目前仍無法進行Debug。這一問題也將在今年的晚些時候解決。

限制

RoboVM只能夠將已經完成預編譯的類加載到應用中。這就意味著在RoboVM應用中,無法在運行時使用自定義的類加載器動態創建字節碼并將其加載到應用中。也就是說,RoboVM無法支持運行時創建或修改類的技術。

更多相關信息

使用Xtend創建安卓應用

Xtend簡介

Xtend 1是一種可以編譯成可讀Java源碼的靜態類型程序設計語言。這種語言本身是同類設計中的***典范,特別是在可 讀性和強大的可擴展性方面,不過它也讓Java的互操作性問題顯而易見。這種語言鼓吹函數式編程風格和多分派、擴展方法、拉姆達表達式及編譯期宏等特性。 與其他的Java替代品不同,Xtend本身并不包含龐大的標準庫,而只是在標準的JDK上添加了一些擴展方法。Xtend還可以保證避免Java互操作 性問題的出現并且能夠提供強大的IDE支持。

為什么安卓上的Java如此難用

Java代碼往往十分冗長,特別是在安卓操作系統上。由于Android API的級別很低而且經常出現沒有經過充分定義的類型(到處都是int類型)。另外一個煩惱就是無處不在的XML文件的使用和綁定。由于Android上 尚未支持Java 8,我們還不得不仔細閱讀無處不在的匿名類。而且不幸的是,Java無法修剪代碼以增強可讀性,我們只能將代碼與多余的符號、類型信息和樣板習語 (boilerplate idioms)混雜在一起。

安卓對JVM語言的***要求

Java語言在安卓上的替代品必須要能夠保證不增加任何運行時的系統開銷,這就將所有的動態語言排除在外。另外,也不希望出現任何不必要的間接類型 轉換。例如,代碼中應該只使用Java和安卓類型,不應因為互操作性問題而需要來回轉換。這不僅是處于性能方面的擔心,在調試時也比較令人煩惱。***,安 卓系統限制每個應用只能夠使用65536個方法。因此,尋找Java的替代品時,一定不能在應用中添加大的標準SDK,因為這樣會大大減少開發人員所能使 用的方法數量。舉例來說,使用Groovy的SDK會增加8000多個方法。

Xtend——安卓開發的***解決方案?

Xtend能夠轉化成地道的Java源代碼,并且基本上只依賴于JDK和安卓系統的類。在運行時,也沒有間接尋址、轉換或者其他任何額外的開銷。也 就是說,Xtend代碼能夠和Java的源代碼有著基本一致的運行速度。另外,Xtend還包含一個經過精簡的為安卓系統提供的運行時庫,只有275kb 大小并且幾乎包含了你所需要的一切。Xtend Eclipse插件與ADT(安卓開發工具)的整合也相當***,對于新的安卓構建系統3,甚至還提供了相應的Gradle插件2。接下來就讓我們詳細了解一下如何使用Xtend改善典型的安卓代碼。

Hello安卓!

與往常一樣,我們先看一個簡單的Hello World示例程序:

  1. class HelloWorldActivity extends Activity {  
  2.  
  3.    override protected void onCreate(Bundle savedInstanceState) {  
  4.       super.onCreate(savedInstanceState)  
  5.     
  6.       val button = new Button(this
  7.       button.text = "Say Hello!"   
  8.       button.onClickListener = [  
  9.          Toast.makeText(context, "Hello Android from Xtend!", Toast.LENGTH_LONG).show  
  10.       ]  
  11.       val layout = new LinearLayout(this)  
  12.       layout.gravity = Gravity.CENTER  
  13.       layout.addView(button)  
  14.       contentView = layout  
  15.   }  
  16. }  

對于Java開發者來說,這個例子使用了類Java的編程風格,因此***眼看上去會非常熟悉。另外,你可能會注意到,示例中所用的API 100%來自于安卓SDK和JDK。

主要的區別在于:

  • 沒有分號(分號是可選的)
  • 使用setter和getter訪問對象屬性
  • 屬性的默認可見性(如,類默認是共有的)
  • 使用拉姆達表達式替代匿名類

在語言的特性方面,有很多地方可以深入探討,不過在此之前,先讓我們看一下如何將Xtend編譯器與相應的Android構建過程整合在一起。

#p#

使用Gradle進行構建

對于目前最常用的三個構建系統:Maven,Gradle和Ant,Xtend都有相應的插件支持。谷歌最近為安卓項目引入了新的基于Gradle的構建系統。接下來我們看一下使用Gradle構建我們的“Hello World”項目需要做哪些工作。

本文假設你已經在系統中安裝了***版本的Gradle和安卓SDK并且正確的設置了ANDROID_HOME環境變量。同時,你已經將Gradle的/bin目錄添加到了PATH環境變量中。

接下來需要將構建腳本“build.gradle”添加到你的Eclipse Android項目的根目錄下,build.gradle文件樣例如下:

  1. buildscript { 
  2.    repositories { 
  3.       mavenCentral() 
  4.    } 
  5.    dependencies { 
  6.       classpath 'com.android.tools.build:gradle:0.8.+' 
  7.       classpath 'org.xtend:xtend-gradle-plugin:0.1.+'   
  8.    } 
  9.  
  10. apply plugin: 'android'  
  11. apply plugin: 'xtend-android'  
  12.  
  13. repositories {  
  14.   mavenCentral()  
  15. }  
  16.  
  17. dependencies {  
  18.   compile ('org.eclipse.xtend:org.eclipse.xtend.lib:2.6.+')  
  19. }  
  20.  
  21. android {  
  22.    compileSdkVersion 19  
  23.    buildToolsVersion "19.1.0" 
  24.    sourceSets {  
  25.       main {  
  26.          manifest {  
  27.             srcFile 'AndroidManifest.xml'  
  28.          }  
  29.          java {  
  30.             srcDir 'src'  
  31.          }  
  32.          res {  
  33.             srcDir 'res'  
  34.          }  
  35.          assets {  
  36.             srcDir 'assets'  
  37.          }  
  38.          resources {  
  39.             srcDir 'src'  
  40.          }  
  41.          aidl {  
  42.             srcDir 'src'  
  43.          }  
  44.       }  
  45.    }  
  46. }  

其主要工作就是導入并調用Maven和Xtend的構建插件。此外,我們將運行時庫添加到項目中并告知Android插件我們正在使用 Eclipse風格的項目布局。上述工作完成后,在命令行窗口中進入項目的根目錄并運行“gradle build”,Gradle將為你完成剩余的所有工作。

深入Xtend

除了語法糖之外,Xtend還附帶了許多非常有用的語言特性,例如操作符重載,模板表達式和switch表達式。而且還可以通過結合不同的功能創建 新的特性。例如,假如你需要動態的UI,不能用靜態的XML文件構建,而需要聲明式的編寫。Xtend為開發者提供了構建器語法(builder syntax)的支持。“Hello World”實例的UI實現代碼如下:

  1. import static extension com.example.helloworld.UiBuilder.*  
  2.  
  3. class HelloWorldActivity extends Activity {  
  4.  
  5.    override protected void onCreate(Bundle savedInstanceState) {  
  6.       super.onCreate(savedInstanceState)  
  7.  
  8.       contentView = linearLayout [  
  9.          gravity = Gravity.CENTER  
  10.          addButton("Say Hello!") [  
  11.             onClickListener = [  
  12.                Toast.makeText(context,  
  13.                               "Hello Android from Xtend!",  
  14.                               Toast.LENGTH_LONG).show  
  15.             ]  
  16.         ]  
  17.     ]  
  18.  
  19.   }  

linearLayout(Context ctx, (LinearLayout)=>void initializer) 和button(ViewGroup group, String name, (Button)=>void initializer) 兩個方法作為擴展被引入到Activity中。這兩個方法將拉姆達函數作為其參數之一。傳入拉姆達函數中的參數被稱為implicit it,與this類似,implicit it不需要顯式地解引用。如上所示,拉姆達函數,擴展方法和implicit it結合使用能夠產生非常漂亮的構建器語法。通過Xtend也可以構建許多其他漂亮的API,從而以一種易讀的聲明式的方式編寫代碼。

來自于XML地獄的問候!

安卓開發者的相當一大部分日常工作就是配置和開發各種XML文件,用作國際化字符串的資源或用于各類視圖的聲明。安卓平臺推薦使用XML文件,因為 平臺已經為開發者提供了針對大型設備和SDK碎片化的解決方案。然而應用程序最終不可能只由靜態視圖和數據組成。開發者需要將所有的素材組合并為其賦予生 命。在安卓平臺,通過R類來完成這些工作。這個自動生成的類包含了許多對應在XML文件中聲明的各種元素的整型常量。假設一個視圖XML文件中聲明了如下 兩個元素,點擊Button可以更新TextView中的消息:

  1. <TextView android:id="@+id/message_view" 
  2. android:layout_weight="1" 
  3. android:layout_width="0dp" 
  4. android:layout_height="wrap_content" 
  5. android:hint="@string/empty" > 
  6. <Button 
  7. android:layout_width="wrap_content" 
  8. android:layout_height="wrap_content" 
  9. android:onClick="sayHello" 
  10. android:text="@string/hello_world" > 
  11. </Button>  

典型的安卓式開發方法是通過R類中生成的常量獲取到TextView的控制權然后實現onClick的回調方法“sayHello”:

  1. class HelloWorldActivity extends Activity {  
  2.  
  3.    TextView messageView  
  4.  
  5.    override protected void onCreate(Bundle savedInstanceState) {  
  6.       super.onCreate(savedInstanceState)  
  7.       // set the view using the int constant  
  8.       contentView = R.layout.main  
  9.       // get a handle on the TextView  
  10.       messageView = findViewById(R.id.message_view) as TextView  
  11.    }  
  12.  
  13.    /**   
  14.     * Callback automagically called by Android   
  15.     */  
  16.    def void sayHello(View v) {  
  17.      messageView.text = "Hello Android from Xtend!"  
  18.    }  
  19. }  

上面一段安卓的典型代碼中包含了不安全的類型轉換,命名規范和各種樣板文件。用Xtend我們能夠做得更好。

你好,Xtendroid!

Xtendroid4是一個專門為安卓開發提供類庫以及所謂的積極注解(active annotation)的小型項目。積極注解可以理解為編譯時的宏,它能夠參與到從Xtend到Java轉化的編譯過程中。你可以隨意修改被注解的類,生成附加類型或使用這個鉤子讀寫純文本文件。

這樣只要有一個注釋,我們就知道要綁定哪個視圖并且注釋還可以幫助我們生成樣板文件。除此之外,它還能夠提供類型安全的元素訪問方法和回調方法。下面一段代碼就是用Xtendroid的@AndroidActivity注釋編寫的Activity類。

  1. @AndroidActivity(R.layout.main) class HelloWorldActivity {  
  2.  
  3.    /**   
  4.     * Type safe callback   
  5.     */  
  6.    override void sayHello(View v) {  
  7.       messageView.text = "Hello Android from Xtend!"  
  8.    }  
  9. }  

現在,這個Activity中只包含了我們想要加入的行為。其他的設置都是自動實現的,例如設置管道綁定、內容視圖或擴展Activity的樣板文件。而且現在一切都是類型安全的,IDE能夠了解其中的來龍去脈并為開發者提供適當的自動完成建議。

此外,Xtendroid還能夠為開發者處理JSON對象,資源文件或SQLite數據庫提供便利。而且,積極注解以庫的形式存在,因此通過自行開發或定制化已有庫的方式,開發者可以很容易地構建更適于自己的庫。

從下方1下載Eclipse并使用更新站點5安裝ADT就可以開始自己親自嘗試上面所講的內容。Xtendroid項目包含許多類似本文中所展示的示例。***祝大家能從中找到樂趣。

  1. Eclipse Xtend
  2. Xtend Gradle 插件
  3. Android Gradle 插件
  4. Xtendroid
  5. ADT 更新站點

關于作者

[[120236]]

Niklas Therning是開源項目RoboVM的創建者和的聯合創始人——RoboVM項目的主要貢獻者。他把如何合理地將Java引入iOS平臺作為其使命。開始RoboVM項 目前,Niklas參與創建了SpamDrain反垃圾郵件服務,并且作為其承包商,主要從事Java EE和web應用程序開發的工作。Niklas持有位瑞典哥德堡查爾姆斯理工大學的計算機科學理學碩士學位。可以通過Twitter賬號@robovm關注他。

[[120237]]

Sven Efftinge是一個充滿激情的軟件開發人員,他喜歡風箏沖浪運動、音樂和美食。他是Xtext項目的領導人。Xtext是一個程序設計語言、領域特定語言和JVM靜態類型程序設計語言Xtend的開發框架。在位于Kiel的itemis公司,Sven領導一個研究部門。

過去幾年,移動應用席卷了整個世界,在工作和生活的方方面面改變著我們使用互聯網的方式。創建移動應用的各種技術也隨之興起,各種開發流程也 將移動應用視為一等公民,開始考慮適應移動開發的流程。盡管已經讓人感覺無處不在,真正的移動應用時代才剛剛開始。我們即將面對新一代的移動設備,如可穿 戴設備或組成物聯網的各種各樣的移動裝置。我們將面臨全新的用于數據展示和命令接收的用戶交互接口。我們也認識到越來越多的公司將真正采取移動優先的戰 略。所有的這些都將對我們未來幾年設計、開發和測試軟件的方式產生巨大影響。

譯文原文:另辟蹊徑創建移動應用

查看英文原文:Unusual Ways to Create a Mobile App

 

責任編輯:閆佳明 來源: infoq
相關推薦

2011-12-29 09:44:14

云計算OwnCloud私有云

2021-03-01 10:15:24

數字貨幣人民幣金融

2017-08-25 12:02:46

AI

2009-05-08 09:00:51

微軟鮑爾默谷歌

2010-12-21 09:42:03

思科云計算

2015-04-01 10:22:22

一加ROM互聯網

2016-04-11 16:49:46

白山帶寬監測系統

2018-10-29 14:56:25

技術芯片系統

2022-08-25 15:05:23

AI論文

2024-05-27 14:01:14

Windows 11Edge瀏覽器

2024-07-18 12:58:03

2024-06-19 14:54:00

谷歌AIGPT-4o

2014-12-04 12:00:50

移動設計產品失敗

2025-09-10 09:15:00

AI模型數據

2024-05-30 12:20:27

2015-07-03 11:16:14

編程一個手鐲

2019-11-08 13:53:47

量子芯片網絡

2022-08-01 12:53:30

前端動畫

2022-03-10 15:21:26

算法人工智能憲法
點贊
收藏

51CTO技術棧公眾號

国产精品老女人视频| 欧美福利视频导航| 国产精品久久久久久久小唯西川| 免费视频一二三区| 草莓视频一区二区三区| 污片在线观看一区二区| 欧日韩一区二区三区| 国产精品免费无遮挡| 亚洲国产一区二区在线观看 | 成人动漫一区二区三区| 97精品一区二区三区| 国产性猛交xx乱| 一区二区三区四区精品视频| 色综合天天综合在线视频| 中文字幕一区综合| 无码国产精品一区二区免费16| 日韩国产欧美在线观看| 中文字幕亚洲国产| 性一交一黄一片| 国精产品一区二区三区有限公司| 亚洲丝袜另类动漫二区| 免费精品视频一区二区三区| 国产视频在线观看视频| 久久国产主播| 欧美国产极速在线| 神马久久久久久久久久久| 高清欧美性猛交xxxx黑人猛| 欧美日本在线播放| 精品视频一区二区在线| 久久免费电影| 欧美激情自拍偷拍| 久久精品日产第一区二区三区乱码| 97在线公开视频| 爽好久久久欧美精品| 久久久久九九九九| 91视频综合网| 91欧美在线| 一本一本久久a久久精品牛牛影视 一本色道久久综合亚洲精品小说 一本色道久久综合狠狠躁篇怎么玩 | 欧美日韩国产精品一区二区| 高h放荡受浪受bl| 国产在线精品一区二区夜色| 日本亚洲欧洲色| 日韩精品视频播放| 亚洲私人影院| 久精品免费视频| 国产真实乱在线更新| 成人一区而且| 中文字幕9999| 99久久99久久精品免费看小说.| 日韩在线影视| 日韩电影中文字幕| 国产一级二级视频| 亚洲日本一区二区三区在线| 欧美精品三级日韩久久| 亚洲一区日韩精品| 色成人综合网| 欧美精选一区二区| 九九热99视频| 日韩美香港a一级毛片| 一本色道久久综合亚洲91| 久草资源站在线观看| 小视频免费在线观看| 欧美日韩国产一区在线| 成人av一级片| 日韩成人高清| 欧美精品v日韩精品v韩国精品v| 五月天激情视频在线观看| 久久99国产精品二区高清软件| 欧美三级一区二区| www.久久久久久久久久久| 电影中文字幕一区二区| 日韩精品一区二区三区在线播放| 日韩欧美中文在线视频| 哺乳挤奶一区二区三区免费看| 亚洲韩国欧洲国产日产av| 野花社区视频在线观看| 日韩欧美ww| 一区二区在线视频| frxxee中国xxx麻豆hd| 欧美国产三级| 97在线免费观看| 欧美亚洲另类小说| 久久99精品久久久久婷婷| 91视频在线免费观看| 日韩有码第一页| 91污在线观看| 亚洲在线不卡| 黄色成人在线网| 一本色道久久综合狠狠躁的推荐| 午夜精品在线免费观看| 精品国产三区在线| 日韩精品在线播放| 欧美成人短视频| 狠狠88综合久久久久综合网| 国产91精品久久久| 国产精品毛片一区二区在线看舒淇| 国产一区二区三区观看| 久久艹中文字幕| 日本在线免费| 狠狠色香婷婷久久亚洲精品| 欧美精品成人网| 亚洲国产欧美国产第一区| 日韩精品极品视频免费观看| 亚洲一二三精品| 韩国av一区| 国产精品成人av在线| 国产口爆吞精一区二区| 2022国产精品视频| 天堂av免费看| 日韩免费电影| 亚洲精品一区在线观看| 国产传媒第一页| 午夜精品视频| 国产精品视频xxxx| 偷拍精品一区二区三区| 国产精品国产自产拍在线| 欧美成人三级在线视频| 国产成年精品| 一本色道久久88综合日韩精品| 国产精品999久久久| 久久国产夜色精品鲁鲁99| 蜜桃av噜噜一区二区三区| 亚洲无线看天堂av| 欧美日韩专区在线| 精品人妻无码一区二区三区| 国产精品hd| 91香蕉亚洲精品| 高清国产福利在线观看| 精品国产1区2区| 永久免费看片在线观看| 水蜜桃精品av一区二区| 欧美中文在线字幕| 三级网站免费观看| 亚洲午夜电影网| 久久艹这里只有精品| 999精品色在线播放| 国产成人精品午夜| 青青草视频免费在线观看| 亚洲国产欧美在线| 日本少妇一区二区三区| 99精品视频在线| 国产日韩av在线| eeuss影院www在线播放| 色综合久久久久综合体桃花网| 中国黄色片视频| 精品福利av| 成人看片视频| 免费污视频在线| 日韩美女视频一区二区在线观看| 亚洲精品卡一卡二| 国内一区二区视频| 天堂av免费看| 亚洲2区在线| 欧美高跟鞋交xxxxxhd| 国产超碰人人模人人爽人人添| 中文字幕一区av| 在线播放免费视频| 欧美69视频| 国产chinese精品一区二区| 欧美大片黄色| 亚洲国产精品久久久久秋霞蜜臀| 国产午夜视频在线播放| 91免费国产在线观看| 国产免费黄色av| 亚洲最好看的视频| 国产精品免费久久久| 成年在线电影| 91麻豆精品国产91久久久久久久久| 99成人在线观看| 国产综合色精品一区二区三区| 裸体裸乳免费看| 伊人久久影院| 国产69久久精品成人| 成年人视频在线观看免费| 欧美精品v国产精品v日韩精品| 精品无码久久久久成人漫画| 国产99久久久国产精品免费看 | 一区二区久久| 欧美亚洲一级二级| 福利一区二区三区视频在线观看| 日韩网站免费观看高清| av av片在线看| 香蕉乱码成人久久天堂爱免费| 蜜桃av免费看| 久久国内精品自在自线400部| 日韩在线视频在线| 亚洲精品国产动漫| 国产在线视频2019最新视频| 午夜伦理在线视频| 亚洲欧美中文字幕在线一区| 黄色一区二区视频| 亚洲在线视频免费观看| 久久久精品人妻无码专区| 久久99久久精品| 六月婷婷在线视频| 日韩精品一区二区久久| 国产精品v欧美精品∨日韩| 在线视频cao| 最好看的2019的中文字幕视频| 精品人妻伦一二三区久久| 欧美视频第一页| 三级黄色录像视频| 91蜜桃传媒精品久久久一区二区| 亚洲精品自拍网| a91a精品视频在线观看| 色中文字幕在线观看| 在线日本制服中文欧美| 亚洲va国产va天堂va久久| 97成人资源| 色综合色综合久久综合频道88| 国产尤物视频在线| 亚洲第一精品夜夜躁人人躁| 中文字幕在线2019| 懂色aⅴ精品一区二区三区蜜月| 欧美一区免费观看| 国产日韩在线不卡| 亚洲av成人精品一区二区三区| 极品尤物av久久免费看| 久久网站免费视频| 激情久久久久久久| 亚洲av首页在线| 日韩欧美视频| 欧美日韩喷水| 欧美三级电影在线| 成人3d动漫一区二区三区91| 外国成人毛片| 国产精品视频免费观看www| 国产社区精品视频| 欧美精品videosex性欧美| 嫩草在线视频| 中文字幕国产亚洲| 黄色网址在线播放| 亚洲欧美成人一区二区在线电影| 亚洲免费视频网| 日韩欧美www| 99产精品成人啪免费网站| 欧美无砖专区一中文字| 欧美a视频在线观看| 精品日本美女福利在线观看| 日韩欧美亚洲国产| 亚洲在线免费播放| 精品深夜av无码一区二区老年| 亚洲欧洲日韩av| 情侣偷拍对白清晰饥渴难耐| 中文字幕av一区二区三区免费看| 成人免费看aa片| 久久―日本道色综合久久| 日本japanese极品少妇| 99久久免费视频.com| 理论片大全免费理伦片| 不卡一卡二卡三乱码免费网站| 不卡的一区二区| 粉嫩av一区二区三区在线播放 | 欧美精品一区免费| 日韩午夜免费| 日韩av三级在线| 免费永久网站黄欧美| 免费观看精品视频| 首页欧美精品中文字幕| 国产一线二线三线在线观看| 日日夜夜精品视频免费| 日韩一区二区三区久久| 精品一区二区三区在线视频| 久久婷婷中文字幕| 国产高清精品网站| 国产精品九九视频| 久久免费精品国产久精品久久久久| 久久国产精品影院| 中文字幕国产一区二区| 精品国产视频一区二区三区| 一区二区三区在线看| 五月天综合激情| 色噜噜狠狠成人中文综合 | 九色porny丨首页入口在线| 欧美一级bbbbb性bbbb喷潮片| 日韩av福利| 91精品久久久久久久久久久久久久| 国产精品久久久久久久久久久久久久久 | 国产午夜激情视频| 欧美午夜久久久| 亚洲一区二区人妻| 日韩女同互慰一区二区| 三级在线观看| 精品国产欧美一区二区三区成人| 日韩成人伦理| 欧美最顶级的aⅴ艳星| 亚洲91在线| 精品国产一二| 日韩综合在线| 日本欧美视频在线观看| 蜜桃av综合| 久久久久国产免费| 2024国产精品| 久草视频免费播放| 欧洲日韩一区二区三区| 99热精品在线播放| 亚洲欧洲一区二区三区久久| 黄色片网站在线| 57pao精品| 在线播放一区二区精品视频| 日本高清一区| 亚洲视频综合| 亚洲综合123| 久久久久亚洲综合| 精品无码一区二区三区电影桃花| 色婷婷av一区| 欧美自拍偷拍第一页| 在线观看日韩欧美| 老司机深夜福利在线观看| 91久久精品国产91久久| 免费精品国产| 成人一级生活片| 久久国产欧美日韩精品| 亚洲天堂网一区二区| 一区二区三区中文在线观看| 中文字幕有码视频| 日韩精品在线观| 超碰97免费在线| 成人乱人伦精品视频在线观看| 亚洲专区视频| 国产美女主播在线播放| 国内精品国产三级国产a久久 | 国产探花一区二区| 超碰成人免费在线| 国产乱淫av一区二区三区| 久久久免费看片| 色综合激情久久| 视频在线观看你懂的| 欧美第一页在线| 欧美高清一级片| 伊人久久大香线蕉精品| 日本视频在线一区| 国产伦理片在线观看| 婷婷综合另类小说色区| 亚洲AV午夜精品| 欧美日韩国产成人在线观看| 色成人综合网| 91香蕉视频网址| 精品一区二区三区久久| 在线免费看视频| 欧美日韩国产123区| 午夜毛片在线| 国产精品爽爽ⅴa在线观看| 国产精品日韩精品中文字幕| 久草青青在线观看| 久久免费视频色| 无码任你躁久久久久久久| 日韩精品免费看| 中文在线а√天堂| 欧美日韩喷水| 免费一级片91| 亚洲人做受高潮| 欧美日韩国产美| 麻豆网站在线观看| 97在线电影| 影音先锋亚洲精品| 亚洲精品理论片| 在线观看视频一区二区欧美日韩| 国产视频网站在线| 国产精品一区二区三区久久久| 欧美gay男男猛男无套| 日韩a一级欧美一级| 亚洲欧美一区二区三区国产精品| 国产av无码专区亚洲av| 欧美丰满少妇xxxxx| 老汉色老汉首页av亚洲| 欧美亚洲一二三区| 91免费小视频| 中文字幕激情视频| 久久久91精品国产| 伊人久久亚洲| 日本精品久久久久中文字幕| 国产日韩欧美精品综合| 91久久精品无码一区二区| 欧美另类在线观看| 日韩人体视频| 天天综合网日韩| 亚洲欧洲综合另类| 亚洲 小说区 图片区 都市| 国产成人精品视频在线| 亚洲综合色网| 无码一区二区精品| 欧洲人成人精品| 青春草视频在线观看| 免费av在线一区二区| 美女视频一区二区| 精品少妇一二三区| 在线播放日韩精品| 一区二区亚洲视频| 免费裸体美女网站| 亚洲久本草在线中文字幕| 日本韩国一区| 91香蕉亚洲精品| 亚洲一区二区三区免费在线观看 | 欧美亚洲国产激情| 中国男女全黄大片| 在线中文字幕一区二区| 欧美6一10sex性hd| 亚洲激情图片| 99在线精品免费|