中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
自己動(dòng)手編譯Android源碼(超詳細(xì))

Android Studio代碼調(diào)試一文中,簡(jiǎn)單的介紹了Android Studio代碼調(diào)試的一些技巧.現(xiàn)在呢,我們來(lái)談?wù)刟ndroid源碼編譯的一些事.(俺認(rèn)為,作為android developer人人都應(yīng)該有一份自己Android源碼,這樣我們就可以隨時(shí)對(duì)自己有疑惑的地方通過(guò)親手調(diào)試來(lái)加強(qiáng)理解).

本文使用最新的Ubuntu 16.04,在開(kāi)始之前,請(qǐng)首先確保自己已經(jīng)安裝了Git.沒(méi)安裝的同學(xué)可以通過(guò)以下命令進(jìn)行安裝:

sudo apt-get install git git config –global user.email “test@test.com” git config –global user.name “test”

其中test@test.com為你自己的郵箱.

在步入正題之前,我們先來(lái)說(shuō)一下android源碼編譯的四個(gè)流程:1.源碼下載;2.構(gòu)建編譯環(huán)境;3.編譯源碼;4運(yùn)行.下文也將按照該過(guò)程進(jìn)行講述.


源碼下載

由于某墻的原因,這里我們采用國(guó)內(nèi)的鏡像源進(jìn)行下載.目前,可用的鏡像源一般是科大和清華的,具體使用差不多,這里我選擇清華大學(xué)鏡像進(jìn)行說(shuō)明.參考:(科大源,清華源)

repo工具下載及安裝

通過(guò)執(zhí)行以下命令實(shí)現(xiàn)repo工具的下載和安裝

mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a x ~/bin/repo

這里,我來(lái)簡(jiǎn)單的介紹下repo工具,我們知道AOSP項(xiàng)目由不同的子項(xiàng)目組成,為了方便進(jìn)行管理,Google采用Git對(duì)AOSP項(xiàng)目進(jìn)行多倉(cāng)庫(kù)管理.在聊repo工具之前,我先帶你來(lái)聊聊多倉(cāng)庫(kù)項(xiàng)目:

我們有個(gè)非常龐大的項(xiàng)目Pre,該項(xiàng)目由很多個(gè)子項(xiàng)目R1,R2,...Rn等組成,為了方便管理和協(xié)同開(kāi)發(fā),我們?yōu)槊總€(gè)子項(xiàng)目創(chuàng)立自己的倉(cāng)庫(kù),整個(gè)項(xiàng)目的結(jié)構(gòu)如下:


這里寫(xiě)圖片描述

將一個(gè)項(xiàng)目Pre進(jìn)行分庫(kù)后會(huì)遇到這么一個(gè)問(wèn)題:如果我們想要?jiǎng)?chuàng)建Pre分支來(lái)做feature開(kāi)發(fā),這就意味著,我們需要到每個(gè)子項(xiàng)目中分別創(chuàng)建對(duì)應(yīng)的分支,這個(gè)過(guò)程如果純粹靠手工做,那簡(jiǎn)直是個(gè)災(zāi)難,利索當(dāng)然我們會(huì)想寫(xiě)個(gè)自動(dòng)化處理程序(我們假設(shè)這個(gè)工具叫做RepoUtil)來(lái)幫助我們解決這個(gè)問(wèn)題.這個(gè)RepoUtil也會(huì)有版本管理之類的需求,因此我們也用Git對(duì)其管理,并為其創(chuàng)建對(duì)應(yīng)的倉(cāng)庫(kù).此時(shí)整個(gè)項(xiàng)目的結(jié)構(gòu)如下:


這里寫(xiě)圖片描述


這里RepoUtil知道整個(gè)項(xiàng)目Pre下的每個(gè)子項(xiàng)目(即維護(hù)子項(xiàng)目的列表),同時(shí)需要提供對(duì)這些子項(xiàng)目的管理功能,比如統(tǒng)一創(chuàng)建分支等.但是從'單一職責(zé)'角度來(lái)看,RepoUitl這個(gè)工具的功能過(guò)于復(fù)雜,我們完全可以將維護(hù)子項(xiàng)目列表這個(gè)功能抽取出來(lái)作為一個(gè)新項(xiàng)目sub_projects,因?yàn)樽禹?xiàng)目也會(huì)變化,因此,為其創(chuàng)建對(duì)應(yīng)的倉(cāng)庫(kù),并用Git管理,這樣的化,RepoUtil只需要通過(guò)簡(jiǎn)單的對(duì)ub_projects進(jìn)行依賴即可,此時(shí)整個(gè)項(xiàng)目的結(jié)構(gòu)如下:


這里寫(xiě)圖片描述

AOSP項(xiàng)目結(jié)構(gòu)和我上文的描述非常類似.repo工具對(duì)應(yīng)RepoUtil,mainfest對(duì)應(yīng)sub_projects.
總結(jié)一下:repo就是這么一種工具,由一系列python腳本組成,通過(guò)調(diào)用Git命令實(shí)現(xiàn)對(duì)AOSP項(xiàng)目的管理.

建立源碼文件夾

熟悉Git的同學(xué)都應(yīng)該知道,我們需要為項(xiàng)目在本地創(chuàng)建對(duì)應(yīng)的倉(cāng)庫(kù).同樣,這里為了方便對(duì)代碼進(jìn)行管理,我們?yōu)槠鋭?chuàng)建一個(gè)文件夾.這里我在當(dāng)前用戶目錄下創(chuàng)建了source文件夾,后面所有的下載的源碼和編譯出的產(chǎn)物也都放在這里,命令如下:

mkdir sourcecd source

初始化倉(cāng)庫(kù)

我們將上面的source文件夾作為倉(cāng)庫(kù),現(xiàn)在需要來(lái)初始化這個(gè)倉(cāng)庫(kù)了.通過(guò)執(zhí)行初始化倉(cāng)庫(kù)命令可以獲取AOSP項(xiàng)目master上最新的代碼并初始化該倉(cāng)庫(kù),命令如下:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest

或者使用:

repo init -u git://aosp.tuna.tsinghua.edu.cn/aosp/platform/manifest

兩者實(shí)現(xiàn)的效果一致,僅僅只是協(xié)議不同.
如果執(zhí)行該命令的過(guò)程中,如果提示無(wú)法連接到 gerrit.googlesource.com,那么我們只需要編輯 ~/bin/repo文件,找到REPO_URL這一行,然后將其內(nèi)容修改為:

REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'

然后重新執(zhí)行上述命令即可.

不帶參數(shù)的manifest命令用于獲取master上最新的代碼,有時(shí)候,我們想要指定的某個(gè)版本的源碼,此時(shí)可以通過(guò)-b參數(shù)指定獲取某個(gè)特定的android版本,比如我們想要獲取android-4.0.1_r1分支,那么命令如下:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.0.1_r1

(這里AOSP項(xiàng)目當(dāng)前所有的分支列表可以在官網(wǎng)查看:分支列表)

同步源碼到本地

初始化倉(cāng)庫(kù)之后,就可以開(kāi)始正式同步代碼到本地了,命令如下:

repo sync

以后如果需要同步遠(yuǎn)程代碼到本地,也只需要執(zhí)行該命令即可.在同步過(guò)程中,如果因?yàn)榫W(wǎng)絡(luò)原因中斷,使用該命令繼續(xù)同步即可.不出意外,5個(gè)小時(shí)便可以將全部源碼同步到本地.所以呢,這個(gè)過(guò)程可以放在晚上睡覺(jué)期間完成.

(提示:一定要確定代碼完全同步了,不然在下面編譯過(guò)程出現(xiàn)的錯(cuò)誤會(huì)讓你痛不欲生,不確定的童鞋可以多用repo sync同步幾次)


構(gòu)建編譯環(huán)境

源碼下載完成后,就可以構(gòu)建編譯環(huán)境了.在開(kāi)始之前,我們先來(lái)看看一些編譯要求:

1. 硬件要求:
64位的操作系統(tǒng)只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那么需要32位的操作系統(tǒng).
磁盤(pán)空間越多越好,至少在100GB以上.意思就是,你可以去買(mǎi)個(gè)大點(diǎn)的硬盤(pán)了啊
如果你想要在是在虛擬機(jī)運(yùn)行l(wèi)inux,那么至少需要16GB的RAM/swap.
(實(shí)際上,我非常不推薦在虛擬機(jī)中編譯2.3.x以上的代碼.)

2. 軟件要求:
1. 操作系統(tǒng)要求
AOSP開(kāi)源中,主分支使用Ubuntu長(zhǎng)期版本開(kāi)發(fā)和測(cè)試的,因此也建議你使用Ubuntu進(jìn)行編譯,下面我們列出不同版本的的Ubuntu能夠編譯那些android版本:

Android版本編譯要求的Ubuntu最低版本
Android 6.0至AOSP masterUbuntu 14.04
Android 2.3.x至Android 5.xUbuntu 12.04
Android 1.5至Android 2.2.xUbuntu 10.04

2. JDK版本要求
除了操作系統(tǒng)版本這個(gè)問(wèn)題外,我們還需要關(guān)注JDK版本問(wèn)題,為了方便,同樣我們也列出的不同Android版本的源碼需要用到的JDK版本:

Android版本編譯要求的JDK版本
AOSP的Android主線OpenJDK 8
Android 5.x至android 6.0OpenJDK 7
Android 2.3.x至Android 4.4.xOracle JDK 6
Android 1.5至Android 2.2.xOracle JDK 5

更具體的可以參看:Google源碼編譯要求

我現(xiàn)在在Ubuntu 16.04下編譯AOSP主線代碼,因此需要安裝OpenJDK 8,執(zhí)行命令如下:
sudo apt-get install openjdk-8-jdk
如果你需要在Ubuntu 14.04下編譯AOSP主線代碼,同樣需要安裝OpenJDK 8,此時(shí)需要執(zhí)行如下命令:

sudo apt-get updatesudo apt-get install openjdk-8-jdk

如果你要編譯的是Android 5.x到android 6.0之間的系統(tǒng)版本,需要采用openjdk7.但是在Ubuntu 15.04及之后的版本的在線安裝庫(kù)中只支持openjdk8和openjdk9的安裝.因此,如果你想要安裝openjdk 7需要首先設(shè)置ppa:

sudo add-apt-repository ppa:openjdk-r/ppa sudo apt-get update

然后再執(zhí)行安裝命令:

sudo apt-get install openjdk-7-jdk

有時(shí)候,我們需要編譯不同版本的android系統(tǒng),就可能使用不同的jdk版本.關(guān)于jdk版本切換,可以使用如下命令:

sudo update-alternative --config javasudo update-alternative --config javac

3. 其他要求

Google官方構(gòu)建編譯環(huán)境指南中已經(jīng)說(shuō)明了Ubuntu14.04,Ubuntu 12.04,Ubuntu 10.04需要添加的依賴,這里我們就不做介紹了.我原先以為,Ubuntu16.04的設(shè)置和Ubuntu14.04的依賴設(shè)置應(yīng)該差不多,但是只能說(shuō)too young too simple.
下面是Ubuntu16.04中的依賴設(shè)置:

sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g -multilib sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-devsudo apt-get install git-core gnupg flex bison gperf build-essential sudo apt-get install zip curl zlib1g-dev gcc-multilib g -multilib sudo apt-get install libc6-dev-i386 sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4sudo apt-get install lib32z-dev ccache

(其中幾個(gè)命令中參數(shù)是重復(fù)的,但不妨礙我們)

初始化編譯環(huán)境

確保上述過(guò)程完成后,接下來(lái)我們需要初始化編譯環(huán)境,命令如下:

source build/envsetup.sh

執(zhí)行該命令結(jié)果如下:


這里寫(xiě)圖片描述


不難發(fā)現(xiàn)該命令只是引入了其他執(zhí)行腳本,至于這些腳本做什么,目前不在本文中細(xì)說(shuō).
該命令執(zhí)行成功后,我們得到了一些有用的命令,比如最下面要用到的lunch命令.


編譯源碼

初始化編譯環(huán)境之后,我們正式進(jìn)入源碼編譯階段.這個(gè)階段又包括兩個(gè)階段:選擇編譯版本及執(zhí)行編譯.

選擇編譯目標(biāo)

通過(guò)lunch指令設(shè)置要要編譯的具體版本.比如,在這里我們要編譯aosp_arm64-eng,因此執(zhí)行指令:

lunch aosp_arm64-eng

如果你不知道自己要編譯什么版本,那么只需要執(zhí)行不帶參數(shù)的lunch指令.之后,控制臺(tái)會(huì)列出當(dāng)前源碼支持的所有設(shè)備型號(hào)及編譯類型:


這里寫(xiě)圖片描述


然后根據(jù)你的需要選擇即可,輸入相應(yīng)的數(shù)字即可.通常,我們選擇aosp_arm-eng即可,但是在ubuntu 16.04(64位)中編譯完成后啟動(dòng)虛擬機(jī)時(shí)可能會(huì)遇到卡在黑屏或者無(wú)響應(yīng)的情況,此時(shí)不妨采用aosp_arm64-eng.這里,我選擇2,即aosp_arm64-eng

我們簡(jiǎn)單的介紹,編譯版本的命令規(guī)則,其形式都是BUILD-BUILDTYPE.
BUILD指的是特定功能的組合特定代碼集合的名稱,源碼可以運(yùn)行在什么環(huán)境,比如full表示模擬器等.

BUILD TYPE則指的是編譯類型,通常有三種:
-user:首先的訪問(wèn),適用于發(fā)行版的產(chǎn)品.
-userdebug:和user模式類似,但是具有root權(quán)限并具有調(diào)試功能,適用于調(diào)試.
-eng:工程機(jī)模式,包含額外的調(diào)試工具.
不難發(fā)現(xiàn),我們需要以eng模式進(jìn)行編譯,以便我們調(diào)試.

開(kāi)始編譯

通過(guò)make指令進(jìn)行代碼編譯,該指令可以指定-j參數(shù)來(lái)設(shè)置參與編譯的線程數(shù)量,以提高編譯速度.比如這里我們?cè)O(shè)置8個(gè)線程同時(shí)編譯:

make -j8

需要注意的是,參與編譯的線程并不是越多越好,通常是根據(jù)你機(jī)器cup的核心來(lái)確定:core*2,即當(dāng)前cpu的核心的2倍.比如,我現(xiàn)在的筆記本是雙核四線程的,因此根據(jù)公式,最快速的編譯可以make -j8.
(通過(guò)cat /proc/cpuinfo查看相關(guān)cpu信息)

如果一切順利的化,在幾個(gè)小時(shí)之后,便可以編譯完成.看到### make completed successfully (01:18:45(hh:mm:ss)) ###表示你編譯成功了.


運(yùn)行模擬器

在編譯完成之后,就可以通過(guò)以下命令運(yùn)行Android虛擬機(jī)了,命令如下:

source build/envsetup.shlunch(選擇剛才你設(shè)置的目標(biāo)版本,比如這里了我選擇的是2)emulator

如你是在編譯完后立刻運(yùn)行虛擬機(jī),由于我們之前已經(jīng)執(zhí)行過(guò)source及l(fā)unch命令了,因此現(xiàn)在你只需要執(zhí)行命令就可以運(yùn)行虛擬機(jī):

emulator

不出意外,在等待一會(huì)之后,你會(huì)看到運(yùn)行界面:


這里寫(xiě)圖片描述

既然談到了模擬器運(yùn)行,這里我們順便介紹模擬器運(yùn)行所需要四個(gè)文件:

  1. Linux Kernel
  2. system.img
  3. userdate.img
  4. ramdisk.img
    (這里,暫時(shí)不做解釋)
    如果你在使用lunch命令時(shí)選擇的是aosp_arm-eng,那么在執(zhí)行不帶參數(shù)的emualtor命令時(shí),Linux Kernel默認(rèn)使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目錄下的kernel-qemu文件;而android鏡像文件則是默認(rèn)使用source/out/target/product/generic目錄下的system.img,userdata.img和ramdisk.img,也就是我們剛剛編譯出來(lái)的鏡像文件.

上面我在使用lunch命令時(shí)選擇的是aosp_arm64-eng,因此linux默認(rèn)使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件則是使用的source/out/target/product/generic64目錄下的system.img,userdata.img和ramdisk.img.


模塊編譯

通過(guò)make命令編譯可以整個(gè)android源碼,這種需求相對(duì)較少.更多的情況是,我們修改或者新增一些模塊,那么如何編譯單獨(dú)的模塊呢?

Google也為開(kāi)發(fā)者提供了相應(yīng)的命令來(lái)支持單獨(dú)的模塊的編譯.上面我們提到envsetup.sh為我們提供了一些命令,除了我們上邊用到的lunch之外,還有這些:

- croot: Changes directory to the top of the tree. - m: Makes from the top of the tree. - mm: Builds all of the modules in the current directory. - mmm: Builds all of the modules in the supplied directories. - cgrep: Greps on all local C/C files. - jgrep: Greps on all local Java files. - resgrep: Greps on all local res/*.xml files. - godir: Go to the directory containing a file.

這里我最為常用的就是mmm,也就是用來(lái)編譯指定目錄.通常來(lái)說(shuō),每個(gè)目錄只包含一個(gè)模塊.比如這里我們編譯Launcher2模塊:

mmm packages/apps/Launcher2/

稍等一會(huì)之后,如果提示### make completed success fully ###即表示編譯完成,此時(shí)在out/target/product/gereric/system/app就可以看到編譯的Launcher2.apk文件了.

編譯好指定模塊后,如果我們想要將該模塊對(duì)應(yīng)的apk集成到系統(tǒng)鏡像中,需要借助make snod.這樣我們新生成的system.img中就包含了我們剛才編譯的Launcher2模塊了.重啟模擬器之后生效.

我們?cè)诓粩嗟男薷哪承┠K,總不能每次重新編譯完成后都要重新打包system.img,然后重啟手機(jī)吧.有沒(méi)有什么簡(jiǎn)單的方法呢?
此時(shí)我們?cè)诰幾g完后,借助adb install命令直接將生成的apk文件安裝到設(shè)備上即可,相比使用make snod,快了很多.

我們簡(jiǎn)單的來(lái)介紹out/target/product/generic/system目錄下的常用目錄:
Android系統(tǒng)自帶的apk文件都在out/target/product/generic/system/apk目錄下;
一些可執(zhí)行文件(比如C編譯的執(zhí)行),放在out/target/product/generic/system/bin目錄下;
動(dòng)態(tài)鏈接庫(kù)放在out/target/product/generic/system/lib目錄下;
硬件抽象層文件都放在out/targer/product/generic/system/lib/hw目錄下.


SDK編譯

如果你需要自己編譯SDK使用,很簡(jiǎn)單,只需要執(zhí)行命令make sdk即可.


錯(cuò)誤集合

在編譯過(guò)程中,基本上會(huì)遇到各種各樣的錯(cuò)誤,大部分錯(cuò)誤我們都可以在google搜到響應(yīng)的解決方案.這里只簡(jiǎn)單的列舉我遇到的幾個(gè)錯(cuò)誤:
錯(cuò)誤一: You are attemping to build with the incorrect version.具體錯(cuò)誤如下:


這里寫(xiě)圖片描述


如果你認(rèn)真看了構(gòu)建環(huán)境的的要求,那么這個(gè)問(wèn)題是可以避免的.當(dāng)然,發(fā)生了也很容易解決:安裝openjdk 8,別忘了使用sudo update-alternative命令切換jdk版本.

錯(cuò)誤二: Out of memory error.具體錯(cuò)誤如下:


這里寫(xiě)圖片描述


這個(gè)錯(cuò)誤比較常見(jiàn),尤其是在編譯AOSP主線代碼時(shí),常常會(huì)因?yàn)镴VM heap size太小而導(dǎo)致該錯(cuò)誤.
此時(shí)有兩種解決方法:
方法一:
在編譯命令之前,修改prebuilts/sdk/tools/jack-admin文件,找到文件中的這一行:
JACK_SERVER_COMMAND='java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME'
然后在該行添加-Xmx4096m,如:
JACK_SERVER_COMMAND='java -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME'
然后再執(zhí)行time make -8j

方法二:
在控制臺(tái)執(zhí)行以下命令:

export JACK_SERVER_VM_ARGUMENTS='-Dfile.encoding=UTF-8 -XX: TieredCompilation -Xmx4096m'out/host/linux-x86/bin/jack-admin kill-serverout/host/linux-x86/bin/jack-admin start-server

如圖:


這里寫(xiě)圖片描述


執(zhí)行完該命令后,再使用make命令繼續(xù)編譯.某些情況下,當(dāng)你執(zhí)行jack-admin kill-server時(shí)可能提示你命令不存在,此時(shí)去你去out/host/linux-x86/bin/目錄下會(huì)發(fā)現(xiàn)不存在jack-admin文件.如果我是你,我就會(huì)重新repo sync下,然后從頭來(lái)過(guò).

錯(cuò)誤三:使用emulator時(shí),虛擬機(jī)停在黑屏界面,點(diǎn)擊無(wú)任何響應(yīng).此時(shí),可能是kiner內(nèi)核問(wèn)題,解決方法如下:
執(zhí)行如下命令:

./out/host/linux-x86/bin/emulator -partition-size 1024 -kernel ./prebuilts/qemu-kernel/arm/kernel-qemu-armv7

通過(guò)使用kernel-qemu-armv7內(nèi)核 解決模擬器等待黑屏問(wèn)題.而-partition-size 1024 則是解決警告: system partion siez adjusted to match image file (163 MB >66 MB)問(wèn)題.

如果你一開(kāi)始編譯的版本是aosp_arm-eng,使用上述命令仍然不能解決等待黑屏問(wèn)題時(shí),不妨編譯aosp_arm64-eng試試.

到現(xiàn)在為止,我們已經(jīng)說(shuō)明了整個(gè)android編譯的流程,除此之外,也簡(jiǎn)單的android源碼的多倉(cāng)庫(kù)管理機(jī)制.下面,你需要的就是,自動(dòng)動(dòng)手,為自己編譯一份源碼.后面,我會(huì)繼續(xù)在此基礎(chǔ)上增加一些原理的說(shuō)明,并結(jié)合Android Studio進(jìn)行源碼調(diào)試.

著作權(quán)歸作者所有

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android8.1源碼編譯實(shí)踐(Mac)
Ubuntu 下載 & 編譯 Android5.1 源碼
提供android 5.0 AOSP源碼下載
Ubuntu環(huán)境下 Android平臺(tái)源碼的下載及編譯
Android 4.3源碼的下載和編譯環(huán)境的安裝及編譯
android4.0源碼下載 編譯 系統(tǒng)體驗(yàn)~圖解
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服