當前位置:首頁 » 編程軟體 » android預編譯使用

android預編譯使用

發布時間: 2022-08-09 19:18:55

1. android手機怎麼會

根據第三方的調研數據顯示,有77%的Android手機用戶承認自己曾遭遇過手機變慢的影響,網路搜索「Android+卡慢」,也有超過460萬條結果。在業內,Android手機一直有著「越用越慢」的口碑,這個現象甚至超出了硬體范疇——很多中高端Android手機在硬體參數上都優於同一代iPhone,但是它們仍然會在使用半年到一年的時間後進入「欠流暢」的狀態——這無疑是一件令人困擾的事情。
Android手機,由於開源的公開條件,Google無法從代碼這一埠約束第三方的應用程序,同時,由於linux核心設定應用在調取系統功能時一定 要取得ROOT許可權,這也導致大量應用因為單一功能的實現需求而獲得整個ROOT層面的支配,可以在Android手機的任意儲存位置進行讀寫,這種高自 由度無異於開啟了潘多拉魔盒,讓Android手機無法對惡意App事先設防。這也是開源軟體備受爭議、且在商用領域遭到抵觸的原因:它只關心是否授予了 用戶自由——這個自由也包括逾越邊界的自由——而沒有從最壞的出發點去考慮如何規避被濫用的風險。盡管Google作為巨頭,一直在嘗試對產業鏈進行統一 管理,但是當這條產業鏈日益龐大、連Google也只能扮演其中之一的角色時,Android的失控也就在情理之中了。比如,Android的最新版本通 常需要花費超過一年半的時間,才能使激活它的Android手機佔比超過50%,但是iOS 7隻用了兩個月,就讓半數以上的iPhone都更新完畢。另外,一款應用程序如果被蘋果從App Store中懲罰出去,它就再也無法被安裝到任何一款合法的iPhone裡面,但是如果一款應用程序被Google驅逐出Google Play,但是它還是可以登錄各種第三方應用市場,提供正常的下載和安裝。
所以,Android的這種天生短板,又催生出了一個「手機調校」的市場,並帶動了新的產業鏈。
「手 機調校」的第一級,在於系統層。在Android 4.4以及之後的Android L的規劃中,它將應用程序的運行模式由Dalvik換成了ART,其原理簡單來說是「預編譯」效果,即當一款應用程序在第一次被安裝到Android時, 它的位元組碼就已經被編譯成為了本地的機器碼,減少後續運行應用程序時的啟動和執行時間。
根據Google自己公布的結果,在不同的性能測試App中,ART的速度對比Dalvik的平均提升幅度達到了80%,在某些項目中,ART的提升幅度甚至超過了1.5倍,這個結果可謂非常喜人。
這 是Google希望從源頭解決Android卡慢問題的努力,但是這只是對性能優化有著作用,無法解決因為應用程序違規調用資源而產生的問題。同時,由於 在安裝應用程序時進行了「預編譯」,整個安裝時間將會變長,安裝完畢後生成的文件也會變大,比如最新的Google+安裝包只有6.9M,但是它安裝後的 APK大小達到了28.3M,這對Android手機儲存空間又存在過多佔用的問題。

2. Android 怎麼簡單實現預編譯

在C/C++開發中,常常會用到預編譯指令。在編譯程序的時候,根據不同環境生成不同的可執行文件。這種方式,把很多判斷工作由運行時轉移到編譯時,以犧牲編譯效率來換取運行效率。
在Android開發中,我們能不能實現這樣類似的功能呢?如果記得不錯的話,java目前應該沒有預編譯指令,那怎麼實現這樣效果呢?我們可以巧妙地利用常量來實現類似的功能。編譯的時候,一般會把常量進行硬編碼,並把不能抵達的代碼進行刪減。因此,我們有了下面類似的代碼:

[java] view plain
public final static boolean IsDebug= false;

public static String Uri=IsDebug?"http://www.dev.com":"http://www.res.com";

if(IsDebug){
Log.i(tag,msg);
}

3. Android 怎麼自定義共享庫

源碼根目錄下有個 vendor (供應商) 目錄,專門用於存放各個供應商的會有代碼。其中有一個個 sample 目錄,這是 Google 用於示範如何編寫自定義共享庫的示例,它展示了自定義共享庫、JNI 調用、對庫的使用方法及皮膚定製等功能。下面我們通過對該示例進行分析,讓大家熟悉這個輕量級的框架。


1、首先看一下 sample 目錄的結構:

sample
├── Android.mk
├── apps
│ ├── Android.mk
│ ├── client
│ └── upgrade
├── frameworks
│ ├── Android.mk
│ └── PlatformLibrary
├── MODULE_LICENSE_APACHE2
├── procts
│ ├── AndroidProcts.mk
│ └── sample_addon.mk
├── README.txt
├── sdk_addon
│ ├── hardware.ini
│ └── manifest.ini
└── skins
└── WVGAMedDpi

Android.mk: 該文件用於編寫構建規則,默認繼承 Android 的 make 框架。
frameworks: 該目錄在這里的意義等同於 Android 源碼中的 frameworks 。
PlatformLibrary: 該目錄就自定義共享庫。

apps: 該目錄用於編寫依賴該庫的應用程序。經過測試也可以用來編寫不依賴該庫的程序,這有個好處,讓開發商可以把自己特有的應用集成到框架中。
client 與 upgrade: 這是兩個依賴該庫的應用程序示例。
procts: 該目錄中的文件對包含該庫與 Android 框架集成的信息,如模塊名稱等。
AndroidProcts.mk: 指明該模塊的 make 配置文件的在哪裡。
sample_addon.mk :模塊的配置信息。

sdk_addon: 該目錄對該庫的硬體需求進行定義。
hardware.ini: 定義模塊對硬體的需求。
manifest.ini: 模塊的說明文件。名稱、供應商等。
skins: 該目錄用於存放自定義皮膚。
WVGAMedDpi: 已經定義好的一套皮膚。

2.如何封裝 Java 共享庫?

PlatformLibrary 為我們展示了封裝 Java 共享庫的方法。其目錄結構如下: frameworks/PlatformLibrary
├── Android.mk
├── com.example.android.platform_library.xml
├── java
│ └── com
│ └── example
│ └── android
│ └── platform_library
│ └── PlatformLibrary.java
└── README.txt

Android.mk: 該文件說明如何構建該模塊。
com.example.android.platform_library.xml: 該文件是模塊注冊時需要的文件。該文件需要被放置到 /system/etc/permissions 目錄下。
Java /*: Java 源碼所在目錄。具體步驟:

a、編寫 Java 庫,並將源碼放到 java 目錄下。這一步和編寫普通 Java 程序沒有差別。
b、編寫 Android.mk,內容如下:

# 獲得當前目錄,清空環境變數
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) # 源碼所在目錄,all-subdir-java-files 表示所有了目錄中的 Java 文件。
LOCAL_SRC_FILES := \
$(call all-subdir-java-files) # 該模塊是可選的。
LOCAL_MODULE_TAGS := optional # Java 模塊名稱
LOCAL_MODULE:= com.example.android.platform_library # 編譯為 Java 庫。最近以 jar 的形式而不是 apk 的形式存在。
include $(BUILD_JAVA_LIBRARY) # 構建該庫的 API 文檔
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-html-files)
LOCAL_MODULE:= platform_library

# 文檔對應的庫
LOCAL_DROIDDOC_OPTIONS := com.example.android.platform_library

# 庫的類型
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DROIDDOC_USE_STANDARD_DOCLET := true # 編譯為 Java API。
include $(BUILD_DROIDDOC)

c、編寫 com.example.android.platform_library.xml,內容如下:
< xml version="1.0" encoding="utf-8" >
<permissions>
<!-- 庫的名稱及對應的 Jar 文件位置 -->
<library name="com.example.android.platform_library"
file="/system/framework/com.example.android.platform_library.jar"/>
</permissions> 現在基本的庫我們已經編寫完成,現在需要對框架中的其它文件進行配置。
d、編寫 sample/frameworks/Android.mk, 內容如下:

# 包含子目錄中的所有 make 文件 include $(call all-subdir-makefiles) 該文件與 sample/Android.mk 文件相同。
e、編寫 sample/sdk_addon/manifest.ini,內容如下: # 該模塊的名稱、供應商及描述
name=Sample Add-On
vendor=Android Open Source Project
description=sample add-on # 構建該模塊的 Android 平台代號
api=3 # 模塊的版本號。必須為整數。
revision=1 # 該模塊中包括的共享庫列表
libraries=com.example.android.platform_library # 對每個庫的詳細定義,格式如下:
# <library.name>=<name>.jar;<desc> # <library.name>: 通過前面 libraies 定義的庫的名稱。
# <name>.jar: 包含庫 API 的 jar 文件。該文件放在 libs/add-on 下面。
com.example.android.platform_library=platform_library.jar;Sample optional plaform library 該文件還可包括該模塊的其它定義,如皮膚等,為了保持該文檔清晰易懂的初衷,這里不做介紹,需要了解可以給我郵件。
f、編寫 sample/procts/sample_addom.mk,內容如下:

# 要植入系統鏡像的應用及可選類庫。可以包括 Java 庫和本地庫。這里我們只有 Java 庫。
PRODUCT_PACKAGES := \ com.example.android.platform_library # 把 xml 文件復制到系統鏡像中相應的位置去。
PRODUCT_COPY_FILES := \ vendor/
sample/frameworks/PlatformLibrary/com.example.android.platform_library.xml:system/etc/permissions/
com.example.android.platform_library.xml # 這個擴展的名稱
PRODUCT_SDK_ADDON_NAME := platform_library # 把模塊的 manifest 和硬體配置文件復制到系統鏡像中相應的位置。 PRODUCT_SDK_ADDON_COPY_FILES := \
vendor/sample/sdk_addon/manifest.ini:manifest.ini \
vendor/sample/sdk_addon/hardware.ini:hardware.in # 把庫的 Jar 包復制到相應的位置。 PRODUCT_SDK_ADDON_COPY_MODULES := \
com.example.android.platform_library:libs/platform_library.jar # 文檔的名稱。必須與。
# LOCAL_MODULE:= platform_library
PRODUCT_SDK_ADDON_DOC_MODULE := platform_library # 這個擴展繼承系統擴展。 $(call inherit-proct, $(SRC_TARGET_DIR)/proct/sdk.mk) # 這個擴展的真實名字。這個名字會用於編譯。
# 用 'make PRODUCT-<PRODUCT_NAME>-sdk_addon' 的形式來編譯此擴展。
PRODUCT_NAME := sample_addon

g、編寫 sample/procts/AndroidProcts.mk,內容如下:
PRODUCT_MAKEFILES := \
$(LOCAL_DIR)/sample_addon.mk h、最後運行make -j8 PRODUCT-sample_addon-sdk_addon,編譯擴展。
至此,我們就完成了 Java 庫的封裝。

3、接下來我們再來看如何通過 JNI 的方式對 C 代碼進行封裝。

a、在 sample/frameworks/PlatformLibrary 目錄下添加一個文件夾,用於放置 JNI 本地代碼,目錄結構如下:

frameworks/PlatformLibrary/jni
├── Android.mk
└── PlatformLibrary.cpp

b、把 frameworks/PlatformLibrary/java/com/example/android/platform_library/PlatformLibrary.java
文件改寫為 JIN 調用介面,代碼如下 : package com.example.android.platform_library; import android.util.Config;
import android.util.Log; public final class PlatformLibrary {
static { / Load the library. If it's already loaded, this does nothing. System.loadLibrary("platform_library_jni");
private int mJniInt = -1; public PlatformLibrary() {} / Test native methods. public int getInt(boolean bad) {
// this alters mJniInt //
int result = getJniInt(bad); // reverse a string, for no very good reason //
String reverse = reverseString("Android!"); Log.i("PlatformLibrary", "getInt: " + result + ", '" + reverse + "'"); return mJniInt; //
/ Simple method, called from native code. private static void yodel(String msg) {
Log.d("PlatformLibrary", "yodel: " + msg); //
/ Trivial native method call. If "bad" is true, this will throw an
/ exception. native private int getJniInt(boolean bad); / Native method that returns a new string that is the reverse of
/ the original. This also calls yodel(). native private static String reverseString(String str);
}

c、在 frameworks/PlatformLibrary/jni/PlatformLibrary.cpp 中編寫 PlatformLibrary.java 中規定本地調用的具體實現。
d、編寫 frameworks/PlatformLibrary/jni/Android.mk,內容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional # JNI 模塊的名稱
LOCAL_MODULE:= libplatform_library_jni # 依賴的源代碼文件
LOCAL_SRC_FILES:= \
PlatformLibrary.cpp # 編譯時需要的庫
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
libnativehelper \
libcutils \
libutils # 沒有靜態庫
LOCAL_STATIC_LIBRARIES := # 包含必須的 JNI 頭文件
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) # 編譯器選項
LOCAL_CFLAGS += # 對該模塊不進行預編譯。使用預編譯可以提高模塊的性能。
LOCAL_PRELINK_MODULE := false # 把它編譯成動態共享庫
include $(BUILD_SHARED_LIBRARY) 該文件主要定義了本地庫的名字、依賴、編譯選項及編譯方式。
e、修改 frameworks/PlatformLibrary/Android.mk,在末尾添加如下兩行:

include $(CLEAR_VARS) # 調用子目錄中的 make 文件。
include $(call all-makefiles-under,$(LOCAL_PATH))

f、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加該 JNI 本地庫。

PRODUCT_PACKAGES := \
com.example.android.platform_library \
libplatform_library_jni

g、編譯即可。至此,添加 JNI 庫完畢。

4、添加接下來我們再看看如何添加原生應用程序

添加原生應用程序就很簡單了,只需要把按照 Android 應用開發的基本方法,寫好一個應用,該應用可以依賴這個擴展,也可以不依賴。如 sample 中的 client 應用,目錄結構如下: apps/client/
├── AndroidManifest.xml
├── Android.mk
└── src
└── com
└── example
└── android
└── platform_library
└── client
└── Client.java

a、在應用根目錄中添加一個 Android.mk 文件,內容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE_TAGS := user # 目標名稱
LOCAL_PACKAGE_NAME := PlatformLibraryClient # 只編譯這個apk包中的java文件
LOCAL_SRC_FILES := $(call all-java-files-under, src) # 使用當前版本的 SDK

LOCAL_SDK_VERSION := current # 依賴使用剛才編寫的擴展
LOCAL_JAVA_LIBRARIES := com.example.android.platform_library include $(BUILD_PACKAGE)

b、在 AndroidManifest.xml 中添加一句:
<uses-library android:name="com.example.android.platform_library" />

c、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加該 JNI 本地庫。

PRODUCT_PACKAGES := \
com.example.android.platform_library \
libplatform_library_jni \
PlatformLibraryClient

d、編譯即可。至此,添加 JNI 庫完畢。

5、其他功能如添加皮膚等,這里就不一一示範了,請參考<sdk-src>/vendor/sample。

4. Android 怎麼簡單實現預編譯

可以巧妙地利用常量來實現類似的功能。編譯的時候,一般會把常量進行硬編碼,並把不能抵達的代碼進行刪減。因此,我們有了下面類似的代碼:


[java]

public final static boolean IsDebug= false;

if(IsDebug){
Log.i(tag,msg);
}


可以對編譯後的文件,進行反編譯

5. 如何預編譯 Android 模擬器專用內核

Android源碼編譯之後生成的是ramdisk.img、system.img和userdata.img。而內核源碼編譯完成之後生成的是ZImage。在一般情況下Android源碼是不帶有內核源碼的,但是帶有一個鏡像,這樣在編譯完Android源碼之後就可以模擬器啟動了,如果要更換系統的內核,此時將高版本的內核源碼進行編譯生成ZImage然後替換Android系統的的鏡像。這樣使用模擬器啟動之後就可以查看內核是否已經被刷新。

6. android系統的系統版本

發布時間:發布於 2009 年 2 月
Android1.1主要特性:
鬧鍾
API 示例
瀏覽器
計算器
攝像頭
聯系人
開發工具包
撥號應用
電子郵件
地圖 (包含街景)
信息服務
音樂
圖片
設置 該版本又叫 「Cupcake」, 這是第一個主要版本,發布於 2009 年 5 月. 這個升級之後,Android 表現出來的能力才真正吸引了開發者的目光。 用戶界面得到了極大的改良,並且增添了以下功能:
Android1.5主要特性:
錄像
藍牙A2DP
自動藍牙連接
上傳視頻到 YouTube 以及 Picasa
復制/粘貼功能 搭載Android 1.6的HTC Hero獲得了意想不到的成功。Android 最終獲得了非Android用戶的關注,並且也讓競爭者蘋果和微軟更加警惕了。Android 1.6 「Donut」 2009 年 9 月發布。 這個版本包含了:
Android1.6主要特性:
Android 應用市場集成
照相、攝像以及瀏覽, 多選/刪除功能
手勢搜索
語音搜索應用集成
極大提升了語音閱讀功能
對非標准解析度有了更好的支持 2.0/2.1: 2009 年 10 月 26 日,又一個主要版本升級以創紀錄的速度放出。這次,大版本升級到了Android 2.0/2.1 「Eclair.」 它包含:
Android 2.0/2.1主要特性 提升硬體速度
更多屏幕以及解析度選擇
大幅度的用戶界面改良
支持 Exchange活動牆紙
大幅改進虛擬鍵盤
藍牙2.1
Google 地圖 3.1.2
Android 2.0.1 SDK 於 2009 年 12 月 3 日 發布,之後是2010 年 1 月 10 日的 2.1 版本。很多用戶和圍觀群眾可能會奇怪:「為什麼 Android 會用甜點作為它們系統版本的代號?」,這個命名方法開始於 Andoird 1.5 發布的時候。作為每個版本代表的甜點的尺寸越變越大,然後按照字母數序:小蛋糕,甜甜圈還有松餅。之前人們預計 2.2 版本的代號會是「餡餅」,但這個被最終證明是錯誤的,「FroYo」(凍酸奶)才是Android 2.2這個伴隨GoogleNexus One 發布的新版的最新代號。下一個版本的代號將會是「姜餅」。 該版本名字叫 「Froyo」,中文代號稱「凍酸奶」,Nexus One 的用戶已經開始接受 Android 2.2 「FroYo」 的無線更新,其他機型的用戶應該會在短時間內獲取到這一更新。這一版本包含大量讓其他手機用戶垂涎三尺的更新,包括了:
Android 2.2主要特性
完整的 Flash 10.1 支持
最高 5 倍速度提升
最多支持 8 個設備連接的移動熱點功能
有著專用鏈接的改進版主屏幕
大量Exchange支持改進,支持 Exchange 2010
攝像頭/視頻改進
多鍵盤語言支持
Android 雲信息將應用安裝在記憶卡上
藍牙語音撥號
支持720P視頻錄制 2010年12月7日凌晨的時候,谷歌在發布旗下Android2.3 Gingerbread(姜餅)系統正式亮相。相比2.2版本來說,新版的Android系統在多個方面都進行了有效的提升,下面我們一起來看看到底有哪些改進。
1.用戶界面更美觀
2.提升游戲體驗
3.提升多媒體能力
4.增加官方進程管理
5.改善電源管理
6.NFC近場通信
7.全局下載管理
8.改進的虛擬鍵盤
9.原生支持前置攝像頭
10.SIP網路電話 2011年2月2日, 3.0(Honeycomb 蜂巢)版本主要更新如下:
·優化針對平板
·全新設計的UI增強網頁瀏覽功能
·n-app purchases功能 2011年5月11日在Google I/O開發者大會宣布發布,版本主要更新如下:
Honeycomb蜂巢(改進3.0BUG)
經過優化的Gmail電子郵箱;
全面支持GoogleMaps
將Android手機系統跟平板系統再次合並從而方便開發者。
任務管理器可滾動,支持USB輸入設備(鍵盤、滑鼠等)。
支持 Google TV.可以支持XBOX 360無線手柄
widget支持的變化,能更加容易的定製屏幕widget插件。 2011年7月13日發布,Honeycomb (蜂巢)版本更新如下:
支持7英寸設備
引入了應用顯示縮放功能 2011年10月19日 在香港發布,
4.0(Android 4.0)Ice Cream Sandwich版本主要更新如下:
1、全新的ui
2、全新的Chrome Lite瀏覽器,有離線閱讀,16標簽頁,隱身瀏覽模式等。
3、截圖功能
4、更強大的圖片編輯功能
5、自帶照片應用堪比Instagram,可以加濾鏡、加相框,進行360度全景拍攝,照片還能根據地點來排序
6、Gmail加入手勢、離線搜索功能,UI更強大。
7、新功能People:以聯系人照片為核心,界面偏重滑動而非點擊,集成了Twitter、Linkedin、Google+等通訊工具。有望支持用戶自定義添加第三方服務。
8、新增流量管理工具,可具體查看每個應用產生的流量。
9、正在運行的程序可以像電腦一樣的互相切換
10、人臉識別功能
11、系統優化、速度更快
12、支持虛擬按鍵,手機可以不再擁有任何按鍵
13、更直觀的程序文件夾:
14、平板電腦和智能手機通用
15、支持更大的解析度
16、專為雙核處理器編寫的優化驅動
17、全新的Linux內核
18、增強的復制粘貼功能
19、語音功能
20、全新通知欄:
21、更加豐富的數據傳輸功能
22、更多的感應器支持
23、語音識別的鍵盤:
24、全新的3D驅動, 游戲支持能力提升
25、全新的谷歌電子市場
26、增強的桌面插件自定義 Android 4.2是谷歌新一代移動操作系統,它沿用了4.1版「果凍豆」(Jelly Bean)這一名稱,與Android 4.1相似性很高,但仍在細節之後做了一些改進與升級,比較重要的包括:Photo Sphere全景拍照;鍵盤手勢輸入;Miracast無線顯示共享;手勢放大縮小屏幕,以及為盲人用戶設計的語音輸出和手勢模式導航功能等。尤其令人關注的是,谷歌在Android 4.2中新加入了新的惡意軟體掃描功能。
安卓4.2簡介
谷歌原定於2012年10月30日召開Android發布會,但由於受到桑迪(Sandy)颶風的影響而臨時取消。
不過谷歌仍通過其官方博客發布了全新的Android 4.2系統,同時還發布了基於這種操作系統的Nexus 4智能手機和Nexus 10平板電腦。
Android 4.2操作系統的亮點是支持行業標準的WiFi顯示共享工具Miracast,這個工具允許Nexus 4向電視流傳輸音頻和視頻。針對現有電視的Miracast機頂盒預計將在不久以後上市,多家公司都可能提供這種產品。谷歌預計,Miracast機頂盒的售價將遠低於99美元。
本次網上發布的還有谷歌Nexus系列第四代手機LG Nexus 4,它配備了4.7英寸1280*768解析度屏幕,採用LG True HD屏幕顯示技術,表面為康寧大猩猩2代強化玻璃,並搭載高通驍龍S4 Pro四核處理器以及2GB RAM,後置800萬像素攝像頭,支持無線充電。售價方面,8GB版LG Nexus 4售299美元,約合人民幣1900元;16GB版本售價349美元,約合2200元,價格門檻大幅降低。後者還將擁有T-Mobile運營商定製版,兩年合約價199美元。
另外一款產品是谷歌與三星合作的平板電腦Nexus 10,外形採用弧線設計,採用最新的Android 4.2系統,屏幕解析度為2560x1600像素,像素密度達300ppi,是目前市售平板電腦中解析度最高的產品。硬體方面,它採用Cortex A15架構1.7GHz主頻Exynos 5250處理器、2GB RAM。攝像頭為500萬像素,並支持NFC、Wi-Fi、藍牙等功能。16GB版399美元,32GB版499美元。
Android 4.2將與Nexus 4 and Nexus 10一起上市,預計Galaxy Nexus和Nexus 7等其他Nexus設備也將在未來幾周中獲得更新。
Android4.2 操作系統的代號沿用了Jelly Bean(果凍豆),並推出了全球首款搭載Android 4.2的Nexus 10平板。
安卓4.2十大特點
1、完整的Chrome瀏覽器
Android 4.2的Web瀏覽器的變化將非常受歡迎,支持選項卡瀏覽系統以及書簽同步。這樣的設計為了使手機和平板電腦的使用和傳統PC使用無異。
2、全新的手機風景模式
作為Android 4.2,將集合手機以及平板電腦一體,在使用手機時,可以使用類似於平板電腦尺寸的風景模式,並且可以進行反轉。
3、全新的文件管理器
Android 4.2將集合一個全新的文件管理器,使用戶可以方便的管理SD卡上的文件,而不再依賴於第三方軟體。
4、文本輸入選項的改進
Android 4.2重新設計了鍵盤的布局,甚至將無用的數字和符號都一並略去了。
5、一個明確的升級方法
Google似乎已經對升級操作系統後產生的各種混亂場景感到非常厭倦,因此在5月份發布的升級,Google必須保證硬體方面足夠指標才能升級操作系統。希望這次Android 4.2新版的系統中,對於硬體方面的要求不再是個問題,這將使得所有用戶可以使用新的Android版本。
6、Android Key Lime Pie精簡版
這個版本有點像Windows XP的上網本,擁有大部分功能,但是對於硬體要求稍低。
7、具有開關切換的用戶界面
眾多Android生產廠商都會自定義Android,幫助手機更好的服務使用者。但與此同時,如果能停用某些用戶界面,而恢復到標準的Android將是一個不錯的功能。
8、全新的電源管理系統
全新的電源管理系統將有效的分配電池的合理使用,例如犧牲瀏覽下滑頁面的速度而因此獲得20分鍾發簡訊息的時間。
9、更為輕便的主題模式
Android 4.2是漂亮的,不只是黑色背景上的白色文字。當然,我們可以使用不同的圖片作為背景。
10、全新的鎖屏頁面
當進入鎖屏頁面時,Google已經試圖放入一些有關來電和消息的信息。雖然這樣做未免會有一些安全風險,但Android應該能人為的控制開關這個功能。
11、全新的時鍾界面
系統自帶時鍾在 4.2 上取得了飛躍式的進步。原本缺失的世界時鍾,計時器和秒錶功能都出現了,而且做得非常精緻。 2013年7月25日發布
新功能
1、用戶賬戶配製
在Android 4.2中,Google在平板中加入了多賬戶功能,和Windows桌面系統的相關功能差不多。在Android 4.3上,用戶可以為賬戶進行不同的配置,從而限制某一賬戶的功能。例如你可以限制兒童賬戶的應用內購買許可權,拒絕兒童賬戶訪問某一應用,和Windows Phone 8上的兒童中心類似。開發者也可以根據不同類型的賬戶讓應用展現不一樣的功能。
2、撥號盤聯系人自動補全
對於使用第三方Android UI的用戶來說,這項功能早就有了,不過原生Android進入聯系從或通過搜索框搜索。Android 4.3可以在撥號盤中輸入號碼和人名時自動搜索聯系人。
3、OpenGL 3.0
OpenGL 3.0可以使游戲更加順暢,畫面渲染更加精緻。
4、藍牙低耗電技術Android 4.3在藍牙上引入了Bluetooth Low Energy技術,可以適配各種節能設備,也減少了設備本身的電池消耗。在展示中,一個人在台上做全身運動,他的心率實時顯示在手機上。
5、WiFi關閉後保持位置功能
WiFi除連接網路的功能外還有一個重要的定位功能,GPS關閉時WiFi可以發揮定位的作用。在之前的Android版本中,把WiFi關閉的話定位功能也會隨之消失,而Android 4.3可以在WiFi關閉時仍然進行掃描,從而發揮定位的作用,同時電池的消耗也大幅下降。
6、其它特性 新的相機應用UI 新的開發者工具 通過郵件分享截屏時,日期和時間會自動加入進去。 Android 4.4,是由Google公司製作和研發的代號為KitKat的手機操作系統,於北京時間2013年9月4日凌晨對外公布了該Android新版本的名稱,為Android 4.4(代號 KitKat 奇巧)。
1、支持兩種編譯模式
除了默認的 Dalvik 模式,還支持 ART 模式。
2、RAM優化
Android 4.4 KitKat針對RAM佔用進行了優化,甚至可以在一些僅有512MB RAM的老款手機上流暢運行。它也進一步優化了系統在低配硬體上的運行效果, 支持內核同頁合並 KSM,zRAM 交換,似乎是為了更好地在眾多智能穿戴設備上運行。

3、新圖標、鎖屏、啟動動畫和配色方案
之前藍綠色的配色設計被更換成了白/灰色,更加簡約,另外圖標風格也進一步扁平化,還內置了一些新的動畫,整體來說界面更漂亮、佔用資源更少。另外,還加入了半透明的界面樣式,以確保狀態欄和導航欄在應用中發揮更好的效果。
4、新的撥號和智能來電顯示
首先,新的撥號程序會根據你的使用習慣,自動智能推薦常用的聯系人,方便快速撥號;同時,一些知名企業或是服務號碼的來電,會使用谷歌的在線資料庫進行匹配自動顯示名稱,即使你的手機中沒有存儲它們。

5、加強主動式語音功能
在Nexus 5上,可以通過說「OK,Google」來啟動語音功能,而不需要觸碰任何按鍵或是屏幕,但並非支持所有機型。另外,語音搜索功能的精度也提升了25%,更加准確,還支持買電影票等新功能。
6、集成Hangouts IM軟體
集成GMS的Android 4.4內置了Hangouts IM軟體,類似於國內的微信,可以實現跨平台的文字、語音聊天功能,也能夠傳輸圖片、視頻等各種文件。
7、全屏模式
不論你是在看電子書、或是使用任何應用程序,都能夠方便地進入到全屏模式,隱藏虛擬按鍵,帶來更投入的使用體驗。只需滑動屏幕邊緣,便可找回按鍵,也十分方便。
8、支持Emoji鍵盤
終於,Android也能夠支持豐富有趣的Emoji輸入了,可以讓你的郵件或是信息更加個性化。
9、輕松訪問在線存儲
你可以直接在手機或平板電腦中打開存儲在Google Drive或是其他雲端存儲的文件,支持相冊或是QuickOffice等軟體,十分方便。
10、無線列印
你可以使用谷歌Cloud Print無線列印手機內的照片、文檔或網頁,其他列印機廠商也將迅速跟進,發布相關應用。
11、屏幕錄像功能
Android 4.4增加了屏幕錄像功能,你可以將所有在設備上的操作錄制為一段MP4視頻,並選擇長寬比或是比特率,甚至是添加水印。
12、內置字幕管理功能
在播放視頻時可自行添加字幕。
13、計步器應用
Android 4.4內置了計步器等健身應用,谷歌也在加緊與晶元製造商的合作,為未來的智能手錶做准備。
14、低功耗音頻和定位模式
Android 4.4加入了低功耗音頻和定位模式, 進一步減少設備的功耗。
15、新的接觸式支付系統
雖然谷歌錢包還沒正式推出,但是Android 4.4中已經加入了新的接觸式支付功能,通過 NFC 和智能卡,可以在手機端輕松完成支付。
16、新的藍牙配置文件和紅外兼容性
Android 4.4內置了兩個新的藍牙配置文件,可以支持更多的設備,功耗也更低,包括滑鼠、鍵盤和手柄,還能夠與車載藍牙交換地圖。另外,新的紅外線遙控介面可以支持更多設備,包括電視、開關等等。 2014年穀歌正在對Android系統進行調整,簡單點說就是ART已經取代Dalvik成為默認選項。一直以來,Dalvik虛擬機背負著Android應用卡頓的罪名,原因則是應用在運行的過程中,虛擬機Dalvik通過一個叫JIT(Just-in-time)的解釋器動態的進行編譯並執行,這一過程也拖慢了運行效率。
與之形成鮮明對比的ART模式,則是在用戶安裝應用時就進行預編譯操作,將原本在程序運行中時的編譯動作提前到應用安裝時。在省去解釋代碼這一過程之後,應用的運行效率會更高。
此外,有開發者往Android開源項目中提交代碼時發現,ART已經取代Dalvik成為默認選項,不過Dalvik並沒有被放棄,這無疑是個不錯的消息,對於在2014年到來的大改版Android L來說,它的系統執行效率會更高。
谷歌公布Android L其界面相比4.x的版本來說,會有更大的變化,同時該系統還會加強平板的用戶體驗。
Android 5.0系統即徹底從Dalvik轉換到ART,那樣iOS開發人員和其用戶所引以為傲的流暢體驗將不再是一個值得炫耀的東西。
Android 5.0還為開發者帶來了5000個新API,從而讓設備間更具整體感及互聯性。谷歌表示,類似歌曲、照片、應用及搜索結果,都能夠在各種Android設備上無縫同步,這便是Android 5.0想要呈現的使用體驗。另外,Android 5.0還包括新的電池模式、多賬戶登錄、訪客模式以及通過藍牙設備解鎖等新功能。
總得來說,Android 5.0是繼4.0之後的一次重大更新,谷歌也希望通過新版本,來更好地統一Android的用戶體驗、設備交互能力,值得期待。 以下為AndroidPit盤點的Android5.1 新功能:
恢復在Android 5.0缺席的靜音模式;
系統穩定性獲總體提升;
RAM管理獲改善;
軟體閃退問題獲修復;
電池管理獲改善;
Wi-Fi自行切換至移動模式的問題得到修復;
無線連接問題獲修復;
Okay Google功能問題得到解決;
通知中心問題得到解決;
部分設備聲音問題獲修復;
其他一些升級和改變;
Material Design調色板得更改。

7. android在哪個版本上強制使用art為唯一的運行時環境

在安裝應用程序時會調用dex2oat將代碼轉換為機器語言以oat文件形式存儲在本地,這樣在運行程序時就不會每次都進行一次編譯了,執行效率也大大提升。
Android運行環境ART

安卓之前的版本運行機制是Dalvik,這個導致安卓卡慢,安卓4.4之後推出了ART,在5.0上完全使用了ART模式。

ART 的機制與 Dalvik 不同。在Dalvik下,應用每次運行的時候,位元組碼都需要通過即時編譯器轉換為機器碼,這會拖慢應用的運行效率,而在ART 環境中,應用在第一次安裝的時候,位元組碼就會預先編譯成機器碼,使其成為真正的本地應用。這個過程叫做預編譯(AOT,Ahead-Of-Time)。這樣的話,應用的啟動(首次)和執行都會變得更加快速。

通俗一點就是,ART增加APK安裝容量,實現了流暢度。

8. android 怎麼編譯so文件

android NDK編譯多個so文件

android編譯系統的makefile文件Android.mk寫法如下

(1)Android.mk文件首先需要指定LOCAL_PATH變數,用於查找源文件。由於一般情況下

Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:

LOCAL_PATH:=$(call my-dir)

上面的語句的意思是將LOCAL_PATH變數定義成本文件所在目錄路徑。

(2)Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始

以include $(BUILD_XXX)結束。

include $(CLEAR_VARS)

CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,

如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫

include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。

include $(BUILD_EXECUTABLE)表示編譯成可執行程序

(3)舉例如下(frameworks/base/libs/audioflinger/Android.mk):

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS) 模塊一

ifeq ($(AUDIO_POLICY_TEST),true)

ENABLE_AUDIO_DUMP := true

endif

LOCAL_SRC_FILES:= \

AudioHardwareGeneric.cpp \

AudioHardwareStub.cpp \

AudioHardwareInterface.cpp

ifeq ($(ENABLE_AUDIO_DUMP),true)

LOCAL_SRC_FILES += AudioDumpInterface.cpp

LOCAL_CFLAGS += -DENABLE_AUDIO_DUMP

endif

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_CFLAGS += -DGENERIC_AUDIO

endif

LOCAL_MODULE:= libaudiointerface

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_SRC_FILES += A2dpAudioInterface.cpp

LOCAL_SHARED_LIBRARIES += liba2dp

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

LOCAL_C_INCLUDES += $(call include-path-for, bluez)

endif

include $(BUILD_STATIC_LIBRARY) 模塊一編譯成靜態庫

include $(CLEAR_VARS) 模塊二

LOCAL_SRC_FILES:= \

AudioPolicyManagerBase.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libmedia

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudiopolicybase

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_A2DP

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

include $(BUILD_STATIC_LIBRARY) 模塊二編譯成靜態庫

include $(CLEAR_VARS) 模塊三

LOCAL_SRC_FILES:= \

AudioFlinger.cpp \

AudioMixer.cpp.arm \

AudioResampler.cpp.arm \

AudioResamplerSinc.cpp.arm \

AudioResamplerCubic.cpp.arm \

AudioPolicyService.cpp

LOCAL_SHARED_LIBRARIES := \

libcutils \

libutils \

libbinder \

libmedia \

libhardware_legacy

ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)

LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase

LOCAL_CFLAGS += -DGENERIC_AUDIO

else

LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy

endif

ifeq ($(TARGET_SIMULATOR),true)

LOCAL_LDLIBS += -ldl

else

LOCAL_SHARED_LIBRARIES += libdl

endif

LOCAL_MODULE:= libaudioflinger

ifeq ($(BOARD_HAVE_BLUETOOTH),true)

LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP

LOCAL_SHARED_LIBRARIES += liba2dp

endif

ifeq ($(AUDIO_POLICY_TEST),true)

LOCAL_CFLAGS += -DAUDIO_POLICY_TEST

endif

ifeq ($(TARGET_SIMULATOR),true)

ifeq ($(HOST_OS),linux)

LOCAL_LDLIBS += -lrt -lpthread

endif

endif

ifeq ($(BOARD_USE_LVMX),true)

LOCAL_CFLAGS += -DLVMX

LOCAL_C_INCLUDES += vendor/nxp

LOCAL_STATIC_LIBRARIES += liblifevibes

LOCAL_SHARED_LIBRARIES += liblvmxservice

# LOCAL_SHARED_LIBRARIES += liblvmxipc

endif

include $(BUILD_SHARED_LIBRARY) 模塊三編譯成動態庫

(4)編譯一個應用程序(APK)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory-->直譯(建立在java子目錄中的所有Java文件)

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build-->直譯(創建APK的名稱)

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK-->直譯(告訴它來建立一個APK)

include $(BUILD_PACKAGE)

(5)編譯一個依賴於靜態Java庫(static.jar)的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# List of static libraries to include in the package

LOCAL_STATIC_JAVA_LIBRARIES := static-library

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

# Tell it to build an APK

include $(BUILD_PACKAGE)

(6)編譯一個需要用平台的key簽名的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := platform

# Tell it to build an APK

include $(BUILD_PACKAGE)

(7)編譯一個需要用特定key前面的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := vendor/example/certs/app

# Tell it to build an APK

include $(BUILD_PACKAGE)

(8)添加一個預編譯應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Mole name should match apk name to be installed.

LOCAL_MODULE := LocalMoleName

LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

(9)添加一個靜態JAVA庫

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)

# Any libraries that this library depends on

LOCAL_JAVA_LIBRARIES := android.test.runner

# The name of the jar file to create

LOCAL_MODULE := sample

# Build a static jar file.

include $(BUILD_STATIC_JAVA_LIBRARY)

(10)Android.mk的編譯模塊中間可以定義相關的編譯內容,也就是指定相關的變數如下:

LOCAL_AAPT_FLAGS

LOCAL_ACP_UNAVAILABLE

LOCAL_ADDITIONAL_JAVA_DIR

LOCAL_AIDL_INCLUDES

LOCAL_ALLOW_UNDEFINED_SYMBOLS

LOCAL_ARM_MODE

LOCAL_ASFLAGS

LOCAL_ASSET_DIR

LOCAL_ASSET_FILES 在Android.mk文件中編譯應用程序(BUILD_PACKAGE)時設置此變數,表示資源文件,

通常會定義成LOCAL_ASSET_FILES += $(call find-subdir-assets)

LOCAL_BUILT_MODULE_STEM

LOCAL_C_INCLUDES 額外的C/C++編譯頭文件路徑,用LOCAL_PATH表示本文件所在目錄

舉例如下:

LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

LOCAL_C_INCLUDES += $(LOCAL_PATH)/src

LOCAL_CC 指定C編譯器

LOCAL_CERTIFICATE 簽名認證

LOCAL_CFLAGS 為C/C++編譯器定義額外的標志(如宏定義),舉例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1

LOCAL_CLASSPATH

LOCAL_COMPRESS_MODULE_SYMBOLS

LOCAL_COPY_HEADERS install應用程序時需要復制的頭文件,必須同時定義LOCAL_COPY_HEADERS_TO

LOCAL_COPY_HEADERS_TO install應用程序時復制頭文件的目的路徑

LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp為文件後綴,你可以通過LOCAL_CPP_EXTENSION指定C++文件後綴名

如:LOCAL_CPP_EXTENSION := .cc

注意統一模塊中C++文件後綴必須保持一致。

LOCAL_CPPFLAGS 傳遞額外的標志給C++編譯器,如:LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CXX 指定C++編譯器

LOCAL_DX_FLAGS

LOCAL_EXPORT_PACKAGE_RESOURCES

LOCAL_FORCE_STATIC_EXECUTABLE 如果編譯的可執行程序要進行靜態鏈接(執行時不依賴於任何動態庫),則設置LOCAL_FORCE_STATIC_EXECUTABLE:=true

目前只有libc有靜態庫形式,這個只有文件系統中/sbin目錄下的應用程序會用到,這個目錄下的應用程序在運行時通常

文件系統的其它部分還沒有載入,所以必須進行靜態鏈接。

LOCAL_GENERATED_SOURCES

LOCAL_INSTRUMENTATION_FOR

LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME

LOCAL_INTERMEDIATE_SOURCES

LOCAL_INTERMEDIATE_TARGETS

LOCAL_IS_HOST_MODULE

LOCAL_JAR_MANIFEST

LOCAL_JARJAR_RULES

LOCAL_JAVA_LIBRARIES 編譯java應用程序和庫的時候指定包含的java類庫,目前有core和framework兩種

多數情況下定義成:LOCAL_JAVA_LIBRARIES := core framework

注意LOCAL_JAVA_LIBRARIES不是必須的,而且編譯APK時不允許定義(系統會自動添加)

LOCAL_JAVA_RESOURCE_DIRS

LOCAL_JAVA_RESOURCE_FILES

LOCAL_JNI_SHARED_LIBRARIES

LOCAL_LDFLAGS 傳遞額外的參數給連接器(務必注意參數的順序)

LOCAL_LDLIBS 為可執行程序或者庫的編譯指定額外的庫,指定庫以"-lxxx"格式,舉例:

LOCAL_LDLIBS += -lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin

LOCAL_MODULE 生成的模塊的名稱(注意應用程序名稱用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)

LOCAL_MODULE_PATH 生成模塊的路徑

LOCAL_MODULE_STEM

LOCAL_MODULE_TAGS 生成模塊的標記

LOCAL_NO_DEFAULT_COMPILER_FLAGS

LOCAL_NO_EMMA_COMPILE

LOCAL_NO_EMMA_INSTRUMENT

LOCAL_NO_STANDARD_LIBRARIES

LOCAL_OVERRIDES_PACKAGES

LOCAL_PACKAGE_NAME APK應用程序的名稱

LOCAL_POST_PROCESS_COMMAND

LOCAL_PREBUILT_EXECUTABLES 預編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用,指定需要復制的可執行文件

LOCAL_PREBUILT_JAVA_LIBRARIES

LOCAL_PREBUILT_LIBS 預編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用, 指定需要復制的庫.

LOCAL_PREBUILT_OBJ_FILES

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES

LOCAL_PRELINK_MODULE 是否需要預連接處理(默認需要,用來做動態庫優化)

LOCAL_REQUIRED_MODULES 指定模塊運行所依賴的模塊(模塊安裝時將會同步安裝它所依賴的模塊)

LOCAL_RESOURCE_DIR

LOCAL_SDK_VERSION

LOCAL_SHARED_LIBRARIES 可鏈接動態庫

LOCAL_SRC_FILES 編譯源文件

LOCAL_STATIC_JAVA_LIBRARIES

LOCAL_STATIC_LIBRARIES 可鏈接靜態庫

LOCAL_UNINSTALLABLE_MODULE

LOCAL_UNSTRIPPED_PATH

LOCAL_WHOLE_STATIC_LIBRARIES 指定模塊所需要載入的完整靜態庫(這些精通庫在鏈接是不允許鏈接器刪除其中無用的代碼)

LOCAL_YACCFLAGS

OVERRIDE_BUILT_MODULE_PATH

熱點內容
一台存儲可以配幾個擴展櫃 發布:2025-02-08 01:53:22 瀏覽:564
分布式存儲技術優缺點 發布:2025-02-08 01:51:37 瀏覽:244
linuxsuse重啟 發布:2025-02-08 01:49:27 瀏覽:410
java對稱加密 發布:2025-02-08 01:48:04 瀏覽:521
java報表框架 發布:2025-02-08 01:47:59 瀏覽:928
方舟手游怎麼防止踢出伺服器 發布:2025-02-08 01:42:44 瀏覽:690
c語言中函數的聲明函數 發布:2025-02-08 01:41:08 瀏覽:70
編譯termux 發布:2025-02-08 01:39:42 瀏覽:650
王者榮耀安卓哪裡看ios國服榜 發布:2025-02-08 01:25:54 瀏覽:630
解壓帶教程 發布:2025-02-08 01:16:33 瀏覽:760