Manjaro下 Lineage OS(17.1) 编译环境搭建

脱离Android系统开发已经数以年计了,新的公司职位上已经没有太多关于Android系统开发,更多的是一些涉密的项目以及逆向相关的工作。由于业务需要,需要脱一个带有爱加密企业版壳的App,几经周折,常规的方式并不容易脱,正巧用于脱壳的虚拟机也罢工了,最后是通过真机脱掉的,至此就想说重新捡起Android系统开发,搭一个开发环境,编一份源码以备不时之需(真机脱壳还是方便不少,虚拟机一方面大多壳都有反虚拟机,需要修改相应的源码规避,另一方面就是真的ZJB卡)。
在网上搜了搜,本想再下个好用点的Ubuntu,突然发现Manjaro被吹上天了,我瞬间就把电脑上的Ubuntu虚拟机镜像Shift+Del了,高高兴兴的搞起来了Manjaro。Android系统就选用了支持市面手机较多的Lineage。
在此也给广大关注我OpenGL文集的朋友道个歉,断更两年多至今未续更,每次看到有新的粉丝(虽然都是一个两个,但我知道你们都是为了这个)我都有一种愧疚感,真对不住大家了。

Manjaro的安装

安装环境

  • Windows7 x64
  • VMware 15.0.4 build-12990004 x64
    神秘代码:AZ312-2FE41-M81LP-R6WEZ-NA2Z4
  • manjaro-kde-20.0.3
    如果下载链接失效的话自行到Manjaro官网下载
    打开官网->Try Manjaro->选择KDE版本(针对开发者,有集成较多开发工具--当然也可以使用其他版本)->Download
  • LineageOS-17.1
    后面在虚拟机中下载

安装Manjaro

  • 安装 VMware
    (略) - 这个不用教程吧!!!
  • 安装Manjaro系统
    虚拟机的配置
    打开VMware->文件->新建虚拟机->典型安装->选择下载的Manjaro镜像->选择 其他Linux 4.x或更高版本内核 64 位-> ...
    最终配置如下(200G硬盘、4G内存、网络为NAT模式)
    虚拟机配置
  • 启动安装
    选择创建好的虚拟机,启动他
    lang选择中文,driver选择nonfree,Boot选项上回车
    (其实我测试似乎选择free更流畅一点)
    系统安装配置(不重要)
  • 插播一条题外话

    当启动到这个界面的时候,我特么被惊讶到了,我以为特么已经安装完了,系统操作起来贼流畅,大部分的工具也都能用,我特么就开始装环境,下源码,为了快速启动每次都是挂起虚拟机,可是特么每次源码下一部分就死机黑屏,心中一万只草泥马,差点就干他三代了。后来才发现这只是用于安装系统用了,跟装win7的pe一个意思,我内存设置4G,当下载文件填满4G后就宕机了,这很正常。只能说这安装环境太完善了!
  • 启动安装
    点击左上角的 Install Manjaro Linux 就正式开始安装了
    启动安装

    这时候如果发现虚拟机不能连接网络,也确认虚拟机网络配置成NAT模式,但是屏幕右下角的网络图标被打叉了,那你首先要确认一下VMware的DHCP服务是不是被禁了(如果你装了火绒那就恭喜你了)
    计算机(右键)->管理->服务和应用程序->服务->把VMware开头的那几个服务手动启动起来,此时你就会发现你的虚拟机有网了(记得到你的杀毒软件中解禁这几个服务)
    服务
  • 安装配置
    这部分也简单,磁盘选择抹除磁盘就好了,都是傻瓜式的安装
    磁盘

    帐号

    安装完重启之后,点击屏幕左下角就能看到终端了
    桌面

优化你的Manjaro

此时你的Manjaro已经安装完成了,为了让你的Manjaro更好用可以先做下优化:

  • 修改源
// 获取国内源
# sudo  pacman-mirrors -i -c China -m rank

然后会弹出一个窗口,把三个都勾上

中国镜像

其实也就是添加三个地址到 /etc/pacman.d/mirrorlist(在 /etc/pacman.conf 中引用) 而已,也可以自己手动用 vim 添加 (默认没有装 vim,自己装一下)
镜像地址

// 添加完国内源后记得同步更新一下软件源
# sudo  pacman -Syy
  • 安装 open-vm-tools
    (如果已经可以自动切换鼠标,拖拽文件正常就不需要重新装了)
    这里要装 open-vm-tools,千万不能装VMware自带的(兼容性问题,窗口不能适应客户机,分辨率永远只有600x800)。
// gtkmm gtkmm3也是必要的 (不然在VMware下会有窗口无法适配客户机的问题)
# sudo pacman -S open-vm-tools gtkmm gtkmm3
// 重启生效
# reboot
  • 安装AUR
// 安装AUR主要是为了安装一些野包(没有认证的)。
// 跟 pacman 用法基本一致(yay -S xxx),不需要 root 权限,需要root权限时会提示输入root密码
# sudo pacman -S yay
  • 添加archlinuxcn软件源
# sudo vim /etc/pacman.conf // 编辑

在最下方添加如下内容(主要是导入key用)

[archlinuxcn]
SigLevel = Optional TrustedOnly
Server =https://mirrors.ustc.edu.cn/archlinuxcn/$arch

导入key

// 安装key (安装国内的软件源需要的key,没有的话安装软件会被拒绝或者卡在导入key过程)
# sudo pacman -Sy archlinuxcn-keyring
  • 重命名Home目录下的目录名 (非必须)
    如果你安装的是中文版的,用于开发的话 home 目录下都是中文目录很不方便,可以修改一下映射改成英文,然后又保留其它界面的中文环境(这部分修改后会导致虚拟桌面出问题,需要重新添加一下)
// 没有 vim 的自己装一下(yay -S vim)
# vim ~/.config/user-dirs.dirs

将文件修改为如下内容(中文部分重命名)

XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Download"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Public"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"

重命名文件夹

// 重命名
# mv ~/桌面 ~/Desktop
# mv ~/下载 ~/Download
# mv ~/模板 ~/Templates
# mv ~/公共 ~/Public
# mv ~/文档 ~/Documents
# mv ~/音乐 ~/Music
# mv ~/图片 ~/Pictures
# mv ~/视频 ~/Videos

确认无误后重启,其它有需要的软件就自己安装
如果重启后出现不能适应客户机了,那就重装一下 gtkmm 和 gtkmm3 就可以了(重启生效),如果还不行你可能需要重装了。

安装 Lineage OS(17.1) 编译环境

可能这一步很多人句直接打开官方网站教程就开始撸了,包括我也是,但是走了不少弯路,话费了不少时间。

  • 安装 platform-tools (manjaro系统自带了)
    这个主要是要使用 adb 和 fastboot 工具,如果你不打算在 linux 上用这两个是可以不用安装的。
// 下载
# wget https://dl.google.com/android/repository/platform-tools_r29.0.5-linux.zip
// 解压
# unzip platform-tools-latest-linux.zip -d ~

添加环境变量
打开~/.profile,在文件末尾添加如下内容。这里添加的路径($HOME/)是刚刚解压的路径,如果你解压到别的地方,这里路径跟着相应修改就可以了,正常的 linux 工具安装方法,没什么特别的。

# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
    PATH="$HOME/platform-tools:$PATH"
fi

source 一下文件,让配置立刻生效

# source ~/.profile // 使配置立即生效
  • 安装工具链
    这里大家可能就直接按官方教程那样,直接安装这些工具链:

    然后你就会惊奇的发现,有一大堆包装不上了,即使你用 yay 也是如此,然后你可能会去寻找那些装不上的包在 manjaro 上的替换包,从此踏上一条不归路。。。
    原因是这些工具链是 Ubuntu 上的,并不是 manjaro 上的(有些时候我在想,manjaro 吹上天,怎么这么多包不兼容或者换名字?),所以我们换个方向想问题可能会有不同的收获。我们反向去找 manjaro 上怎么安装 Android 编译工具链,很幸运,我这 archlinux 的 wiki 上找到了 Lineage OS 的工具链教程
    工具链

    我们可以看到有一部分包是需要用 AUR 包的,有一部分是要替换掉的,看到最后发现人家还打包好了,经过漫长折磨的我看到这个心里是多么的五味杂陈。。。
// 安装工具链
# yay -S lineageos-devel

// 如果安装过程出现错误可能是因为缺少开发包或者版本太旧,可以更新一下基础开发包
# sudo pacman -S base-devel // 可以安装指定的也可以全部安装

安装工具链是交互式的,第一步会让你选择安装的 jdk 版本,我们要编译 Lineage OS 17.1 选择默认(open-jdk14),如果编译老版本则要选择对应的jdk版本(cm-14.1=>openjdk8 ),这里我们直接回车,接下来的都按默认,有提示是否安装的就输入 y 回车就行,只要你主机有联网很快就能装好了。



注:如果安装工具链出现有些包找不到之类的,你可以尝试换一下软件源。要自己装 jdk 的话使用 pacman -S jdkX-openjdk (X替换成要安装的版本)

  • 切换 Python 版本
    manjaro 系统已经自带了 Python ,默认是 Python3 ,然而 Lineage OS 14.1 编译则需要使用 Python2 否则会报一些莫名其妙的问题。
    如果上面工具链安装没问题的话你系统中就已经安装了 Python2 ,此时你只要把链接文件指向 Python2 就行了:
// 查看 python 安装位置
// # which python
// 切换到 python 安装位置 (/usr/bin/)
// # cd /usr/bin/
// 修改链接文件 (ln -snf [新链接目标] [软链接地址])
# sudo ln -snf python2-config /usr/bin/python-config
# sudo ln -snf python2 /usr/bin/python

此时你可以在终端上输入 python 验证一下 Python 版本是否正常。

  • 添加虚拟内存
    编译 Lineage OS 需要大量的内存(经测试需要8G以上的内存,使用10G时能编译通过),一般使用虚拟机的不会分配到这么多内存,所以我们就需要添加一个虚拟内存。
    添加之前先查看本机有没有已经有了,如果有就先删掉以前的再添加。
// 查看内存状态,swap(交换) 为 0 表示没有虚拟内存
# free
// 查看虚拟内存路径(也可以查看 /etc/fstab 文件)
# swapon -s 
# swapoff /var/swap // 关闭当前的虚拟内存
# sudo rm -rf /var/swap  // 删除当前的虚拟内存文件

// 添加新的虚拟内存
# su  // 切换到 root 用户
// if 表示 input_file 输入文件;of 表示 output_file 输出文件;bs 表示 block_size 块大小;count 表示计数
# dd if=/dev/zero of=/var/swap bs=1M count=8192 // 新建虚拟内存文件 -- 8G (8192*1M=8G)
# mkswap /var/swap      // 格式化文件
# swapon /var/swap // 启用虚拟内存

开机自动加载虚拟内存
在 /etc/fstab 文件中添加如下内容(如果之前已经添加过虚拟内存记得替换掉)

/var/swap swap swap defaults 0 0
  • 配置samba (非必须)
    创建共享目录 (目录可自行定义,这里为根目录下的workspace文件夹)
# sudo mkdir /workspace
# sudo chmod 777 /workspace // 记得带执行权限,否则会提示没有访问权限

在/etc/samba/下添加smb.conf文件,文件内容如下

[global]      
# 所要加入的工作组或者域
workgroup = WORKGROUP 
# 用于在 Windows 网上邻居上显示的主机名
netbios name = Manjaro    
server string = Samba Server      
# 定义安全级别   
# security = user  
server role = standalone server    
# 将所有samba系统主机所不能正确识别的用户都映射成guest用户
# map to guest = bad user       
# 是否开启dns代理服务    
dns proxy = no    
# 来宾账户(默认为nobody)    
# guest account = huayu
# log
log file = /var/log/samba/%m.log
# 单位为kb
max log size = 50
                 
# [homes]
# comment = Home Directories
# browseable = no
# writable = yes                 
                 
# 共享目标(名字为显示的共享目录名--可任意)
[workspace]    
# 共享路径 
path = /workspace 
# 有效用户(可访问的用户)
valid users = huayu  
# 共享的目录是否让所有人可见
browsable = yes              
# 是否可写       
writable = yes  
available = yes
browseable = yes 
  
# 是否允许匿名(guest)访问
# guest ok = yes      
# 客户端上传文件的默认权限         
create mask = 0777     
# 客户端创建目录的默认权限      
directory mask = 0777     

#注意共享文件在系统本地的权限不能低于以上设置的共享权限

添加samba帐号 (这里和系统帐号是分开的,可以同名但需要再配置一次)

// gpasswd [用户组] -a [用户名] (groups可以查看所有的用户组)
# sudo gpasswd huayu -a huayu
// smbpasswd -a [用户名] 稍后提示配置密码
# sudo smbpasswd -a huayu

启用smaba 服务

# systemctl enable smb nmb
# systemctl start smb nmb

编译 Lineage OS

  • 初始化仓库
    看官方教程点击这里
// 安装源码下载工具 repo
# sudo pacman -S repo
// 创建源码目录
# mkdir -p Desktop/android/lineage
# cd Desktop/android/lineage

// 切换 repo 的源为清华源,因为 repo init 会从远端同步 repo-project 然而因为墙的原因会导致失败(fatal: error [Errno 101] Network is unreachable)
// 所以要修改源
# export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/' 
// 添加 git 帐号 (第一次使用需要配置)
# git config --global user.email "you@example.com"
# git config --global user.name "Your Name"
// 初始化仓库 (从清华大学的镜像站同步)
# repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android.git -b lineage-17.1
  • 下载 Lineage OS
    在同步之前我们需要先修改一下代码工程是源(原来的源有时也很快,可以先尝试直接同步,如果不行再修改源)
    打开.repo/manifest/default.xml,将
  <remote  name="github"
           fetch=".."
           review="review.lineageos.org" />

改成

  <remote  name="github"
           fetch="https://github.com/" />

  <remote  name="lineage"
           fetch="https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/"
           review="review.lineageos.org" />

  <remote  name="aosp"
           fetch="https://android.googlesource.com"

改成

  <remote  name="aosp"
           fetch="https://aosp.tuna.tsinghua.edu.cn"

  <default revision="..."
           remote="github"

改成

  <default revision="..."
           remote="lineage"

同步源码树(以后只需执行这条命令来同步):

// 部分仓库如 Lineage_framework_base 同步的时候会出现 bundle 错误,可以使用命令 repo sync --no-clone-bundle 进行同步
# repo sync // 加 -c 可以只同步当前分支

漫长的等待,何时完成就随缘吧!

  • 指定平台
    Lineage OS 是可以适配多个平台的,所以需要将工程先配置到我们需要的平台,我这里目标手机是用小米Note2,所以是 scorpio,其它平台对应不同的名字
// 同样需要一段时间的下载
# source build/envsetup.sh
// 这里还会从仓库下载一些文件(可能会提示错误,多试几下,可能需要FQ)
# breakfast scorpio 
  • 添加设备驱动
    Android 本身是开源的,但为了保护厂商的利益,在驱动层是不开源的(这也是 Android 被踢出 Linux 的一大原因),这里也是一样,设备相关的驱动也是没有源码的,但可以从别的地方获取编译好的驱动程序。官方就提供了两种办法,一是从手机上直接提取,二是从官方或第三方的ROM中提取。
    手机上提取
    1、连接手机到电脑,连上adb
    2、然后在 android/lineage/device/xiaomi/cancro 目录下执行 extract-files.sh 脚本即可
    ROM 中提取
    1、从官方或者其他渠道下载到可用的 ROM 包,提取出 system.img (可能会涉及到镜像格式转换: br->dat->img)
    2、将 system.img 镜像挂载到一个目录上 sudo mount system.img android/system_dump/system/
    3、同样,执行 extract-files.sh 脚本提取驱动 ./extract-files.sh xxx/android/system_dump/
    点我获得官方详细的导出教程
    不过不知道什么原因,用这两个方法提取文件后,在编译的时候总是会有几个文件找不到。通过导出脚本,知道需要导出哪些文件,手动东拼西凑凑够了(其实有些是目录变了,不同的包也正好文件能有所互补)
    链接:https://pan.baidu.com/s/1_NcoAWSzUmvPoD0KJiyZVg
    提取码:feh5
  • 编译
    这最后一步有一些坑还是需要注意一下,不过最最最主要的还是内存一定要大、内存一定要大、内存一定要大,否则总会有一些莫名其妙的问题(原本以为没有使用JACK 编译器了应该内存使用上会比较好,事实呵呵哒),本人测试发现在编译过程中系统消耗的总内存达到 10G 以上(无其他操作),编译过程大多在6G左右,但是在编译一些模块时(doc)内存会急剧升高,在内存耗尽时不会立刻out of memory而是会一直在等待内存,如果一直没有其他地方释放内存大概在一两个小时候溢出(坑B,我特么以为一直在编译)。本菜鸡是在 12G 内存(物理12G+虚拟8G)下才成功编译过的。
// 基本配置,可以放在.bashrc文件里面,这样内存启动终端就会自动设置
# export USE_CCACHE=1
# export CCACHE_EXEC=/usr/bin/ccache
# ccache -M 50G
# export CCACHE_COMPRESS=1
// 编译,进入源码根目录
# source build/envsetup.sh
// # export LC_ALL=C // 清除本地化配置(中文可能会不显示,字符集问题)
// 限定内存,不然很容易崩,测试 10G 是可以的,8G 以下全部狗带 (当然,你实际可用内存要大于这个,不然就 Out of memory 了)
// # export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx10G" 
// 漫长的编译,等吧。我好像编了 6 小时
# brunch scorpio

Lineage OS 目前编译后只有卡刷包,你可以先刷一个第三方的 Recovery (twrp)。或者像我一样,下一个小米官方的线刷包,将编译后的 img 文件替换掉小米官方线刷包中的同名文件(并没有一一匹配,替换重名的就行),我目前是这么刷的使用上并没有发现有问题,当然最好还是先刷一个 Recovery 再用 Recovery 刷卡刷包了,后续更新就可以用 adb 刷有更新的镜像了(一般也就内核和 system.img 了)

刷机

刷入recovery

因为官方的recovery会校验ROM包,非官方包是刷不了的,所以需要先将recovery替换掉。这里可以替换成LineageOS的recovery(在编译后的out目录中有),也可以刷成其他第三方的,如twrp:

// 重启到fastboot
# adb reboot bootloader // 获取按住开机键和音量下键开机
# fastboot flash recovery twrp-3.4.0-0-scorpio.img
// 重启到recovery(注意,刷完recovery不能直接重启开机,否则刷入的recovery会被还原)
# fastboot boot twrp-3.4.0-0-scorpio.img

在recovery进行双清,并且刷入新系统的ROM(zip包)

root

  • 下载root框架
    原先的SuperSu框架慢慢的被magisk框架(面具)替换了,所以这里刷magisk吧 magisk官网
    这里需要下载两个文件,一个是框架的zip包和权限管理的apk,zip包用twrp刷进系统,apk直接装系统上就行。

其他linux命令

  • linux间文件拷贝
// 目录拷贝 scp -r [目标主机用户]@[目标主机]:[源目录] [目的目录]
# scp -r huayu@172.16.18.2:/home/ /home/

各种问题集结

  • ninja 未安装
    编译的时候可能会提示 ninja 没有安装,原则上会自己编译安装,也可以手动自己安装,不过即使不安装编译也能正常通过,似乎不是必须的
# yay -S ninja   // 手动安装
  • multiple definition of 'yylloc'
    /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x50): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
    collect2: 错误:ld 返回 1
    ...
    gcc版本问题,从gcc-9.3升级到gcc-10.1出现编译内核出错,需要降级gcc
// 安装降级工具 downgrade 
# sudo pacman downgrade
// 降级gcc(选择要降级的版本,gcc-9.3.0),这里降级可能失败,不过先把软件包下载下来
# sudo downgrade gcc
// 强制降级(选择downgrade下载的缓存,也可以自己其他渠道下载软件包)
# sudo pacman -Udd /var/cache/pacman/pkg/gcc-9.3.0-1-x86_64.pkg.tar.zst

// 强制降级方法2
// 先删除原软件包再降级安装
# sudo manpac -R gcc
# sudo pacman downgrade
  • VMware中添加了共享文件夹,但manjaro中不显示
// 创建挂载点
# sudo mkdir /mnt/hgfs
// 挂载(重启后需要重新挂载)
# sudo /usr/bin/vmhgfs-fuse -o allow_other -o auto_unmount /mnt/hgfs
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容