當前位置:首頁 » 編程軟體 » android開發編譯

android開發編譯

發布時間: 2025-03-18 18:07:11

㈠ 怎麼樣將自己開發的Android應用程序編譯到系統Image中

1. 搭建編譯環境
編譯環境: Ubuntu 10.10
Android版本:Android 2.2

編譯過程中可能需要在Ubuntu上安裝必要的一些軟體,我安裝過的包含如下軟體,不同的系統可能會有差別:
jdk6(Android官方建議裝jdk5,但是我在編譯時會遇到java override問題,改用6沒有任何問題), bison, lib64z1-dev, libasound2-dev, flex, gperf, libncurses5-dev

2. 應用程序存放目錄
SimpleJNI是採用Android NDK和Java編寫的程序,包含apk和so庫文件,它的源代碼在source tree的development/samples/目錄下。
實際上package在編譯時所放的目錄並沒有明確限定,編譯後apk和so存放的位置是根據目錄下Android.mk所指定的編譯類型所決定的,例如:
SimpleJNI根目錄下的Android.mk中有一行include $(BUILD_PACKAGE),表示將該目錄下的模塊編譯成package,即apk文件,默認存放的位置為/system/app。
SimpleJNI/jni目錄下的Android.mk中有一行為include $(BUILD_SHARED_LIBRARY),表示將該目錄下的native.cpp編譯為共享庫文件,即so文件,默認存放的位置為/system/lib

因此,如果我們想要將自己編寫的程序編譯至image中,只需要將Eclipse下完成的整個工程到source tree下的某個目錄即可,我一般習慣放到packages/apps下。

3. 添加Android.mk
完成了上一步,可以知道,Android.mk在編譯中起著至關重要的作用,這其實就是Android編譯環境中的make file。為了完成我們的工作,需要在源代碼中添加Android.mk。添加自己的Android.mk可以仿照SimpleJNI中的Android.mk,稍微修改即可。我們首先看看SimpleJNI目錄下的兩個Android.mk的內容:
根目錄下的Android.mk

TOP_LOCAL_PATH:= $(call my-dir)

# Build activity

LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

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

LOCAL_PACKAGE_NAME := SimpleJNI

LOCAL_JNI_SHARED_LIBRARIES := libsimplejni

LOCAL_PROGUARD_ENABLED := disabled

include $(BUILD_PACKAGE)

# ============================================================

# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))

根目錄下的Android.mk決定了整個工程編譯的配置,其中,

LOCAL_PATH 定義了當前的目錄

LOCAL_MUDULE_TAGS 定義了當前模塊的類型,編譯器在編譯時會根據類型的不同有些差別,有些tags的mole甚至不會被編譯至系統中。LOCAL_MUDULE_TAGS主要有如下幾種:user debug eng tests optional samples shell_ash shell_mksh。optional表示在所有版本的編譯條件下都被編譯至image中,剩下的表示在該版本中才會被編譯只image中,如user表示在user版本下才會被編譯至image中。
對於包含LOCAL_PACKAGE_NAME的mk文件,該項默認為optinal,具體可以參看build/core/package.mk。SimpleJNI中定義為samples的具體作用我也不太清楚,為了保險起見,我自己的apk一般定義為optional。

LOCAL_SRC_FILES 定義了編譯apk所需要的java代碼的目錄

LOCAL_PACKAGE_NAME 這里需要改成自己的package的名字

LOCAL_JNI_SHARED_LIBRARIES 定義了要包含的so庫文件的名字,如果你的程序沒有採用JNI,這行不需要。

LOCAL_PROGUARD_ENABLED 定義了Java開發中的ProGuard壓縮方法,主要用來分析壓縮程序的,在我自己的應用中我沒有加這行。

include $(BUILD_PACKAGE) 這行是build的關鍵,表示當前java代碼build成apk

include $(call all-makefiles-under,$(LOCAL_PATH)) 表示需要build該目錄下的子目錄的文件,這樣編譯系統就會在當前目錄下的子目錄尋找Android.mk來編譯so等其它程序。

根據上述所寫,創建我自己的Android.mk如下:

TOP_LOCAL_PATH:= $(call my-dir)

# Build activity

LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

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

LOCAL_PACKAGE_NAME := TestJniApp

LOCAL_JNI_SHARED_LIBRARIES := libtestjniapp

include $(BUILD_PACKAGE)

# ============================================================

# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))
看起來很簡單吧,基本不需要改動即可。

Jni目錄下的Android.mk

由於我們的TestJniApp是用JNI完成的,包含C源代碼,因此也需要一個jni目錄下的Android.mk。同樣首先看看SimpleJNI中jni目錄下的Android.mk的內容:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

# This is the target being built.
LOCAL_MODULE:= libsimplejni

# All of the source files that we will compile.
LOCAL_SRC_FILES:= /
native.cpp

# All of the shared libraries we link against.
LOCAL_SHARED_LIBRARIES := /
libutils

# No static libraries.
LOCAL_STATIC_LIBRARIES :=

# Also need the JNI headers.
LOCAL_C_INCLUDES += /
$(JNI_H_INCLUDE)

# No special compiler flags.
LOCAL_CFLAGS +=

# Don't prelink this library. For more efficient code, you may want
# to add this library to the prelink map and set this to true. However,
# it's difficult to do this for applications that are not supplied as
# part of a system image.

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)
LOCAL_MODULE 當前模塊的名字,即編譯後的so文件的名字

LOCAL_SRC_FILES 所要編譯的文件

LOCAL_SHARED_LIBRARIES, LOCAL_STATIC_LIBRARIES 該模塊要鏈接的動態庫和靜態庫。

LOCAL_C_INCLUDES 要包含的頭文件

LOCAL_CFLAGS C語言編譯選項

LOCAL_PRELINK_MODULE 定義是否使用prelink工具,它用事先鏈接代替運行時鏈接的方法來加速共享庫的載入,不僅可以加快起動速度,還可以減少部分內存開銷。

經過修改後,我自己的TestJniApp中jni目錄下的Android.mk如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libtestjniapp
LOCAL_SRC_FILES := com_test_app_Jni.c
LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

這里有一點需要注意,如果要將so文件編譯入image,必須要修改LOCAL_MODULE_TAGS,將原有的值samples修改為user,或者可以直接刪掉 。刪掉是因為對於包含LOCAL_MODULE的mk文件,如果沒有指定LOCAL_MODULE_TAGS,該項默認為user,而只有定義為user的情況下,才會將so文件編譯入image,具體定義可以參看build/core/base_rule.mk。

4. 修改/bulid/target/proct/generic.mk 把工程編譯到系統中
至此,還有最後一部工作。為了將工程編譯進入image,還需要在/bulid/target/proct/generic.mk文件中將package name添加進去

PRODUCT_PACKAGES := /
AccountAndSyncSettings /
CarHome /
DeskClock /
……
SyncProvider /
TestJniApp

完成上面這些步驟後,在source tree根目錄下編譯image就可以了。

㈡ 新人求教,編譯一個最簡單的Android程序,提示下面的錯誤咋解決

未說明具體問題,以下未說明具體問題,以下供你參考
1、32位系統下的編譯

如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

首先修改build/core/main.mk,修改的內容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq
(i686,$(findstring i686,$(build_arch)))

$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四個文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

從編譯規則上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
endif

在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

3、AIDL 編譯報couldn't find import for class原因
「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
實現 android.os.Parcelable介面的類。需要導入(import)。
其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api

4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
表現方式。

更改jdk版本為1.6即可

5、編譯alsa-lib庫錯誤

android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:
LOCAL_ARM_MODE := arm
android的編譯系統中LOCAL_ARM_MODE變數的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb
prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

collect2: ld returned 1 exit status
make: *** [out/target/proct/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1
解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:
#define VERSIONED_SYMBOLS

開發過程中碰到過很多錯誤,後續再一一總結記錄下來,有些忘記了。。

在android.mk中編譯:

include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出現提示需要定義:LOCAL_MODULE_TAGS := optional 一般修改方法是:

build\core\definitions.mk 中的宏定義變數:

define include-prebuilt
include $$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL_BUILT_MODULE_STEM := $(1)
LOCAL_MODULE_SUFFIX := $$(suffix $(1))
LOCAL_MODULE := $$(basename $(1))
LOCAL_MODULE_CLASS := $(2)
include $$(BUILD_PREBUILT)
endef

在這里增加一個LOCAL_MODULE_TAGS := optional

但是這需要修改android源碼,如果不是自已的android系統,這么做就麻煩了,所以必須想其它辦法解決:

#include $(CLEAR_VARS)
#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL_BUILT_MODULE_STEM := libyfcdca.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := yfcdca
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

如此即可了。供你參考
1、32位系統下的編譯

如果需要在32位系統中編譯android系統,在編譯前需要對部分makefile進行修改

首先修改build/core/main.mk,修改的內容如下所示:

-ifneq (64,$(findstring 64,$(build_arch)))

+ifneq
(i686,$(findstring i686,$(build_arch)))

$(warning
************************************************************) $(warning You are attempting to build on a 32-bit system.)

$(warning Only 64-bit build environments are supported beyond froyo/2.2.)

其次修改如下四個文件:

external/clearsilver/cgi/Android.mk
external/clearsilver/java-jni/Android.mk
external/clearsilver/util/Android.mk
external/clearsilver/cs/Android.mk # This forces a 64-bit build for Java6
-LOCAL_CFLAGS += -m64
-LOCAL_LDFLAGS += -m64
+LOCAL_CFLAGS += -m32
+LOCAL_LDFLAGS += -m32即將LOCAL_CFLAGS和LOCAL_LDFLAGS由-m64改為-m32,從而指定使用32位系統進行編譯如果使用 64bit 的操作系統編譯,這些就都不用修改,但記得需要安裝:For 64-bit servers the following extra packages may be needed:
"sudo apt-get install libc6-dev-i386" (libc6-dev-amd64 if AMD CPU)
"sudo apt-get install g++-multilib lib32ncurses5-dev lib32z1-dev"
還有 jdk64bit 的版本編譯2 、build/core/base_rules.mk:128:*** frameworks/opt/emoji/jni:
.... libgl2jni already defined by framwworks/base/opengl/tests/gl2_jni/jni 停止

從編譯規則上看:
# Make sure that this IS_HOST/CLASS/MODULE combination is unique.
mole_id := MODULE.$(if \
$(LOCAL_IS_HOST_MODULE),HOST,TARGET).$(LOCAL_MODULE_CLASS).$(LOCAL_MODULE)
ifdef $(mole_id)
$(error $(LOCAL_PATH): $(mole_id) already defined by $($(mole_id)))
endif

在framwworks/base/opengl/tests/gl2_jni/下面定義的android.mk定義了:
LOCAL_MODULE := libgl2jni
include $(BUILD_SHARED_LIBRARY)
導致生成的動態庫重復,這是不對的,修改tests這個目錄不參與編譯即可,最直接的辦法刪除掉framwworks/base/opengl/tests/gl2_jni這個文件夾

3、AIDL 編譯報couldn't find import for class原因
「AIDL服務只支持有限的數據類型,因此,如果用AIDL服 務傳遞一些復雜的數據就需要做更一步處理。AIDL服務支持的數據類型如下:
Java的簡單類 型(int、char、boolean等)。不需要導入(import)。String和 CharSequence。不需要導入(import)。
List和 Map。但要注意,List和Map對象的元素類型必須是AIDL服務支持的數據類型。不需要導入(import)。AIDL自動生成 的介面。需要導入(import)。
實現 android.os.Parcelable介面的類。需要導入(import)。
其中後兩種數據類 型需要使用import進行導入,傳遞不需要 import的數據類型的值的方式相同。傳遞一個需要import的數據類型的值(例如,實現android.os.Parcelable 介面的類)的步 驟略顯復雜。除了要建立一個實現android.os.Parcelable介面的類外,還需要為這個類單獨建立一個aidl文件,並使用parcelable關鍵字進行定義。」
沒有加LOCAL_AIDL_INCLUDES += xxx ,所以找不到我的parcelable aidl文件。

修改android源碼根目錄下的build/core/pathmap.mk把你的目錄加進去,此時再make update-api

4、老是提示 @Override錯誤 方法未覆蓋其父類的方法
使 用JDK1.6編譯沒有問題,使用JDK1.5編譯,會報@Override方法未覆蓋其父類的方法。實際上這個方法是類實現的介面中方法,
但是,這個語 法的jdk1.6的下面是可以通過的,也就是說jdk1.6認為類覆蓋父類方法與實現介面方法都叫override,而jdk1.5不
是這樣認為的,不知 道這是當初jdk1.5的bug,還是當初就是認為覆蓋父類方法與實現介面方法是不一樣的,不得而知。但是從
OO角度來看,覆蓋父類方法與實現介面方法都 可以認為override,因為他們目的都是一樣的,都是為了重用,都是多態的一種
表現方式。

更改jdk版本為1.6即可

5、編譯alsa-lib庫錯誤

android系統開發移植alsa-lib庫的過程中編譯的時候出現了如下的錯誤
/tmp/cckyaR40.s: Assembler messages:
/tmp/cckyaR40.s:2763: Error: selected processor does not support `mrs ip,cpsr'
/tmp/cckyaR40.s:2764: Error: unshifted register required -- `orr r2,ip,#128'
/tmp/cckyaR40.s:2765: Error: selected processor does not support `msr cpsr_c,r2
字面的意思報的是匯編錯誤,選擇的處理器不支持mrs和msr指令。
原來的ARM指令有32位和16位兩種指令模式,16位為thumb指令集,thumb指令集編譯出的代碼佔用空間小,
而且效率也高,所以android的arm編譯器默認用的是thumb模式編譯,問題在於alsa的代碼中有部分的內容
用到了32位的指令,所以才會報如下的錯誤,修改的方法也很簡單,在Android.mk中加入如下內容即可:
LOCAL_ARM_MODE := arm
android的編譯系統中LOCAL_ARM_MODE變數的取值為arm或者thumb,代表32位和16位兩種arm指令集,默認為thumb
prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/../lib/gcc/arm-eabi/4.4.0/../../../../arm-eabi/bin/ld: failed to set dynamic section sizes: Bad value

collect2: ld returned 1 exit status
make: *** [out/target/proct/merlin/obj/SHARED_LIBRARIES/libasound_intermediates/LINKED/libasound.so] 錯誤 1
解決此問題將alsa-lib/include/config.h文件中的如下宏定義去掉即可:
#define VERSIONED_SYMBOLS

開發過程中碰到過很多錯誤,後續再一一總結記錄下來,有些忘記了。。

在android.mk中編譯:

include $(CLEAR_VARS)
$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

出現提示需要定義:LOCAL_MODULE_TAGS := optional 一般修改方法是:

build\core\definitions.mk 中的宏定義變數:

define include-prebuilt
include $$(CLEAR_VARS)
LOCAL_SRC_FILES := $(1)
LOCAL_BUILT_MODULE_STEM := $(1)
LOCAL_MODULE_SUFFIX := $$(suffix $(1))
LOCAL_MODULE := $$(basename $(1))
LOCAL_MODULE_CLASS := $(2)
include $$(BUILD_PREBUILT)
endef

在這里增加一個LOCAL_MODULE_TAGS := optional

但是這需要修改android源碼,如果不是自已的android系統,這么做就麻煩了,所以必須想其它辦法解決:

#include $(CLEAR_VARS)
#$(call add-prebuilt-files, STATIC_LIBRARIES, libyfcdca.a)

include $(CLEAR_VARS)
LOCAL_SRC_FILES := libyfcdca.a
LOCAL_BUILT_MODULE_STEM := libyfcdca.a
LOCAL_MODULE_SUFFIX := lib
LOCAL_MODULE := yfcdca
LOCAL_MODULE_CLASS := STATIC_LIBRARIES
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

如此即可了。

㈢ 在Eclipse中怎樣將Android程序編譯成apk文件

運行Android程序時,我們可以通過Eclipse將項目編譯成apk文件。具體步驟如下:

首先,如果你已經Run As Android Application過,那麼可以到工作目錄的bin文件夾下尋找與項目同名的apk文件。這個文件就是編譯後的結果。

其次,你可以選擇另外兩種方法進行編譯:

方法一:選中項目,右鍵點擊後在彈出菜單中選擇Android Tools,再選擇Export Unsigned Application Package,然後直接保存。這樣得到的apk文件是未簽名的。

方法二:同樣選中項目,右鍵點擊後在彈出菜單中選擇Android Tools,再選擇Export Signed Application Package,接下來按照提示一步步操作,完成簽名後保存。這樣得到的apk文件是已經簽名的。

這兩種方法都可以將Android程序編譯成apk文件,區別在於是否進行了簽名。未簽名的apk文件可以直接安裝,而簽名的apk文件則需要在Google Play等應用商店發布。

在選擇編譯方法時,可以根據實際需求進行選擇。如果只是個人開發測試使用,未簽名的apk文件就足夠了。如果需要將應用發布到應用商店,則需要進行簽名。

以上就是在Eclipse中將Android程序編譯成apk文件的具體步驟,希望對你有所幫助。

熱點內容
安卓手機怎麼反色 發布:2025-03-19 06:15:19 瀏覽:820
安卓開視頻時聲音小怎麼辦 發布:2025-03-19 06:08:18 瀏覽:578
文件伺服器訪問速度慢 發布:2025-03-19 05:45:36 瀏覽:636
python的下載與安裝 發布:2025-03-19 05:41:38 瀏覽:770
安卓怎麼用手電筒檢測換屏 發布:2025-03-19 05:30:33 瀏覽:674
蘋果6怎麼設置短密碼 發布:2025-03-19 04:44:41 瀏覽:20
三人樂隊怎麼配置 發布:2025-03-19 04:34:42 瀏覽:917
趣編程入口 發布:2025-03-19 04:25:09 瀏覽:942
a的存儲形式 發布:2025-03-19 04:24:00 瀏覽:792
android鍵盤修改 發布:2025-03-19 04:21:45 瀏覽:167