编译 lineageos 14.1 on OnePlus3
breakfast oneplus3
命令的主要作用是
1.执行 vendorsetup.sh
2. variant 默认设置为 userdebug
3. 根据机型判断 调用 lunch cm 或是 lineage
breakfast () { target=$1; local variant=$2; CM_DEVICES_ONLY="true"; unset LUNCH_MENU_CHOICES; add_lunch_combo full-eng; for f in `/bin/ls vendor/cm/vendorsetup.sh 2> /dev/null`; do echo "including $f"; . $f; done; unset f; if [ $# -eq 0 ]; then lunch; else echo "z$target" | grep --color=auto -q "-"; if [ $? -eq 0 ]; then lunch $target; else if [ -z "$variant" ]; then variant="userdebug"; fi; if ! check_product lineage_$target && check_product cm_$target; then echo "** Warning: '$target' is using CM-based makefiles. This will be deprecated in the next major release."; lunch cm_$target-$variant; else lunch lineage_$target-$variant; fi; fi; fi; return $? }
命令:brunch oneplus3
本质是调用mka 命令
mka
mka () { local T=$(gettop); if [ "$T" ]; then case `uname -s` in Darwin) make -C $T -j `sysctl hw.ncpu|cut -d" " -f2` "$@" ;; *) mk_timer schedtool -B -n 10 -e ionice -n 7 make -C $T -j$(grep "^processor" /proc/cpuinfo | wc -l) "$@" //调用make命令 ;; esac; else echo "Couldn't locate the top of the tree. Try setting TOP."; fi }
使用mmm 或 mmma 或 mm 或 mma 编译失败
使用 make 模块名 却可以成功
--------
获取boot.img system.img 等镜像
首先需要手机root权限
查看 /dev/.....
1. recover.img 和 boot.img 是一种文件类型,用 unpackbootimg 解包img ,mkbootimg 制作img (项目位置 aosp安卓源码的 /system/core/mkbootimg 目录下),解包后用 cat ramdisk文件 | cpio -i 的方式再解包 ramdisk ( 打包所需要的参数要和解包后的参数文件中给出的要一致,打包参数为16进制,需要再参数值前加 0x 前缀)
2. system.img userdata.img 是另一类文件类型
写入:
制作好的 boot.img 用 adb push 放到 /sdcard ,然后重启进入twrp,安装镜像即可
或者 先将 /dev/null > /dev/分区对应块设备 ,然后将img > 写入块设备
查看分区和块设备的对应关系:
低版本系统: /dev/mtd
高版本系统:
-----
以下为流水账
-----
Android_Id
当设备在第一次启动时,系统会随机产生一个64位的数字,然后以16进制的形式保存在设备上,且API提供了获取这一参数的方法:
Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
当设备重新初始化或者刷机的时候,会被重置
1.不同的设备可能会产生相同的android_id。
2.有的厂商设备无法获取android_id,会返回null。
3.对于CDMA的设备,ANDROID_ID和TelephonyManager.getDeviceId() 的值相同。
4.不同的android系统版本稳定性不同。
//低版本稳定,高版本不稳定
295a4fbf716094ee
IMEI
手机序列号 15-17 位,一般为15位,双卡双待有2个IMEI
用于在移动电话网络中识别每一部独立的手机等移动通信设备,相当于移动电话的身份证。序列号共有15~17位数字,前8位(TAC)是型号核准号码(早期为6位),是区分手机品牌和型号的编码。接着2位(FAC)是最后装配号(仅在早期机型中存在),代表最终装配地代码。后6位(SNR)是串号,代表生产顺序号。最后1位(SP)一般为0,是检验码,备用。国际移动设备识别码一般贴于机身背面与外包装上
第一部分 TAC,Type Allocation Code,类型分配码,由8位数字组成(早期是6位),是区分手机品牌和型号的编码,该代码由GSMA及其授权机构分配。其中TAC码前两位又是分配机构标识(Reporting Body Identifier),是授权IMEI码分配机构的代码,如01为美国CTIA,35为英国BABT,86为中国TAF。
第二部分 FAC,Final Assembly Code,最终装配地代码,由2位数字构成,仅在早期TAC码为6位的手机中存在,所以TAC和FAC码合计一共8位数字。FAC码用于生产商内部区分生产地代码。
第三部分 SNR,Serial Number,序列号,由第9位开始的6位数字组成,区分每部手机的生产序列号。
第四部分 CD,Check Digit,验证码,由前14位数字通过Luhn算法计算得出。(也称为“模10”(Mod 10)算法, 它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意攻击。)
- 从校验位开始,从右往左,偶数位乘2(例如,7*2=14),然后将两位数字的个位与十位相加(例如,10:1+0=1,14:1+4=5);
- 把得到的数字加在一起(本例中得到67);
- 将数字的和取模10(本例中得到7),再用10去减(本例中得到3),得到校验位。
第五部分 SVN,Software Version Number,软件版本号,区分同型号手机出厂时使用的不同软件版本,仅在部分品牌的部分机型中存在.(有的话就是2位))
TAC-(FAC)-SNR-CD-SVN
设备品牌和型号 – 装配地代码 – 序列号
2位RBI 分配机构标识 6位品牌和型号 - (2位数字(生产商内部编码)) - 6位序列号数字 – 1位数字Luhn验证码 – (2位数字(一般不存在)软件版本号)
86 123456 ,123456,1
1.新格式
8 + 6 + 1 = 15 ( 15 + 2 = 17)
TT TTTTTT,SSSSSS,C (,SS)
2.老格式
6 + 2 + 6 + 1 = 15 (15 + 2 = 17)
TTTTTT,FF,SSSSSS,C (,SS)
硬件序列号(SERIAL)
Build.SERIAL
可能不存在
WTK7N16923005607
指纹
Build.FINGERPRINT
由设备的多个信息拼接合成。
honor/FRD-AL00/HWFRD:6.0/HUAWEIFRD-AL00/C00B171:user/release-keys
手机号码
IMSI
WIFI-MAC
WIFI-Name
安卓系统版本 Build.VERSION.SDK_INT Build.VERSION.RELEASE
ROM固件 Build.TIME 固件推出日期 Build.getRadioVersion() 获取无线电固件版本 Build.VERSION.BASE_OS 基带版本
手机型号 Build.HARDWARE Build.BOARD 主板 Build.MANUFACTURER 产品/硬件的制造商 Build.MODEL 型号 Build.PRODUCT 产品的名称 Build.DISPLAY 构建id号
手机品牌 Build.MANUFACTURER 产品/硬件的制造商 Build.HOST (可能可以由用户修改,主机名字)
CPU型号 /device/cpu/*
手机制造商 Build.MANUFACTURER 产品/硬件的制造商
GPS定位
通话记录模拟、手机短信模拟、等各类安卓手机系统信息的修改工具
在不需要用户权限的前提下,网上最完美的方案是将android_id和硬件序列号,如果其中任意一种失效就使用另外一种
其他可能使用的信息
4.Build.TIME 固件推出日期 示例:1477442228000
5.Build.VERSION.INCREMENTAL 源码控制版本号 示例: C00B171
6.Build.getRadioVersion() 获取无线电固件版本 示例:21.210.03.00.031,21.210.03.00.031
7.Build.HARDWARE 硬件名称 示例:hi3650
8.Build.VERSION.SECURITY_PATCH 用户可见安全补丁level(这里我得到的是日期,可能是补丁修复的时间)示例:2016-10-01
9.当前设备是12/24时制:Settings.System.getString(context.getContentResolver(), Settings.System.TIME_12_24) 示例:null(有的手机可以获取)
10.Build.VERSION.SDK_INT SDK版本号 (一般讲是与系统版本号一一对应的) 示例:23
11.Build.SUPPORTED_32_BIT_ABIS 支持32位ABIs的列表(数值)示例:[armeabi-v7a,armeabi]
12.Build.SUPPORTED_64_BIT_ABIS 支持64位ABIs的列表(数值)示例:[arm64-v8a]
13.Build.BOOTLOADER 系统启动程序版本号 示例:unknown
14.Build.VERSION.RELEASE 用户可见版本 示例: 6.0
- Build.SUPPORTED_ABIS 支持ABIs的列表(数值)示例:[arm64-v8a,armeabi-v7a,armeabi]
16.Build.BOARD 主板 示例:FRD-AL00
17.Build.BRAND 系统定制商 示例:honor
- Build.CPU_ABI CPU指令集 示例:arm64-v8a
- Build.CPU_ABI2 CPU指令集2 示例:空值
- Build.DEVICE 设备参数 示例:HWFRD
21.Build.HOST 示例:huawei-RH2288H-V2-12L
- Build.ID 修订版本列表 示例:HUAWEIFRD-AL00
23.Build.MANUFACTURER 产品/硬件的制造商 示例:HUAWEI
- Build.MODEL 示例:FRD-AL00
25.Build.PRODUCT 产品的名称 示例:FRD-AL00
26.Build.TAGS 描述Build的标签(Comma-separated tags describing the build, like "unsigned,debug".) 示例:release-keys
- Build.TYPE 描述Build的类型(The type of build, like "user" or "eng".) 示例:user
28.Build.USER 描述Build的USER 示例:jslave
- Build.DISPLAY A build ID string meant for displaying to the user 示例:FRD-AL00C00B171
30.Build.VERSION.CODENAME 当前开发代号,或者字符串“REL”(如果是正式的发布版本) 示例: REL
31.Build.VERSION.BASE_OS 基带版本 The base OS build the product is based on. 示例:空值
32.自定义字符串或自定义数组
ROM
Android系统文件系统分区
Boot system recovery data cache misc
Sd卡文件系统分区
Sd卡
Sd-ext
/boot
启动分区,包括kernel和 ramdisk(如proc等文件系统的结构包含在这(整个根文件系统))
刷机包中有/boot 的写入,代表会修改kernel或ramdisk
Boot.img
/system
包含android系统,除kernel外的部分,framwork包含在这里,HAL的驱动是否包含在这里呢?(vendor)
System.img
/data
用户应用程序的安装分区,如 /data/data/app*
Userdata.img
/cache
缓存
/misc
包含一些开关配置,CID ,运营商区域ID,USB配置,硬件设置等(那VENDRO相关的信息会存在这里吗?)
如果它已损坏或丢失,设备的某些功能将无法正常运行。
/sdcard
Sd卡
/sd-ext
Data2ext 或 app2sd 可以支持把应用安装到此分区所在的sd卡上
/recovery
例如 Twrp安装在这里
LinageOS
第三方的开源ROM,支持机型比较多
安装:
- 解锁手机bootloader(官方工具支持)
- 通过bootloader刷第三方 twrp recover (通过fastboot 刷 /recover 的img)
- 通过twrp 刷linageOS对应机型的ROM 的 img文件
升级:
- 设置里点更新系统
- 从PC端用linageOS官方出的升级脚本 push_update
- 手机进入sidload(Recovery模式),在pc 用 adb sideload 加载要刷的zip包
降级:
和重新安装系统一样
下载 linageOS 14.1 源码
Git,repo 都下好
但是 repo init 的时候提示一个错误
于是单独clone repo 下载
git clone -v https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
结果还是失败
Cloning into 'git-repo'...
fatal: unable to access 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo/': Failed to connect to gerrit-googlesource.lug.ustc.edu.cn port 443: Connection refused
后来将地址换为
git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
然后将 当前目录下的 git-repo 文件夹重新命名为 repo 移动到当前目录的.repo 下
然后执行
repo init -u https://github.com/LineageOS/android.git -b cm-14.1
最然中间报了个错
curl: (22) The requested URL returned error: 404 Not Found
Server does not provide clone.bundle; ignoring.
remote: Enumerating objects: 5286, done.
但最后
成功了!
这种莫名奇妙的换url,而且也不知道新的url换成了什么,感到十分困惑
而且 googlesource 的 repo 和 mirrors.tuna 的repo 下载后是不一样的。。。
接下来用
~/bin/repo sync
还是提示很多失败
error: Cannot fetch device/common from https://android.googlesource.com/device/common
fatal: unable to access 'https://android.googlesource.com/platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/': Failed to connect to android.googlesource.com port 443: Connection refused
估计是科(ke)学(xue)上(shang)网(wang)的问题
android.googlesource.com
换成国内镜像
打开.repo/manifest.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"
最后运行
repo sync --no-clone-bundle
正常了
编译一加3T 手机 CM 14.1 ROM
源码下载好后,需要将特定手机型号的驱动等特有代码准备好
参考http://www.kokojia.com/article/17859.html
方法1. 使用脚本从手机中提取出驱动(是哪些?原理是?)
参考 https://www.cnblogs.com/jiaoxiake/p/6875864.html
方法2. 从网上下现有的驱动
找到设备相关代码
https://github.com/TheMuppets/proprietary_vendor_oneplus/tree/cm-14.1/oneplus3
该仓库下的 cm14.1分支中的 oneplus3 文件夹
参考 https://www.jianshu.com/p/44f359c40ceb
方法3. LineageOS卡刷包中获取。
步骤1. 下载linageOS公共部分代码
考虑到需要的驱动也许和特定版本的ROM是匹配的(兼容性问题),所以选择在github上下载cm14.1分支的驱动,而不去提取手机中的(我手机上是高于7.1的版本的系统)
选择方法2
首先执行
source build/envsetup.sh
breakfast oneplus3 // breakfast "device name"这里是同步机型的信息以及内核文件
就会开始从LineageOS 下载设备相关内核等源码
<manifest>
<project name="LineageOS/android_device_oneplus_oneplus3" path="device/oneplus/oneplus3" remote="github" />
<project name="LineageOS/android_device_oppo_common" path="device/oppo/common" remote="github" />
<project name="LineageOS/android_kernel_oneplus_msm8996" path="kernel/oneplus/msm8996" remote="github" />
<project name="LineageOS/android_vendor_nxp-nfc_opensource_frameworks" path="vendor/nxp-nfc/opensource/frameworks" remote="github" />
<project name="LineageOS/android_vendor_nxp-nfc_opensource_libnfc-nci" path="vendor/nxp-nfc/opensource/libnfc-nci" remote="github" />
<project name="LineageOS/android_vendor_nxp-nfc_opensource_Nfc" path="vendor/nxp-nfc/opensource/Nfc" remote="github" />
</manifest>
这一步主要下载kernel,Vendor,device 等文件夹下的文件
这里的remote属性指定的是 .repo/manifest.xml 中定义的远程仓库,如
<remote name="github"
fetch="https://github.com/" />
接着,根据网络情况等意外因素出现各种问题
问题1.
下载到一半网络问题导致卡住
Fetching project LineageOS/android_hardware_broadcom_wlan
问题2.
443
fatal: unable to access 'https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android_frameworks_minikin/': Failed to connect to mirrors.tuna.tsinghua.edu.cn port 443: Connection refused
把manifest.xml 里的 linage 仓库地址改成 github上的,不用镜像服务器试试
文件不存在?
产生问题3.
fatal: unable to access 'https://github.com/LineageOS/android_packages_providers_ContactsProvider/': Operation timed out after 0 milliseconds with 0 out of 0 bytes received
链接超时?
问题4.
设备特有代码
^Cerror: Cannot fetch LineageOS/android_device_qcom_common from https://github.com/LineageOS/android_device_qcom_common
aborted by user
如果网络问题比较严重,而每次执行上面命令或 repo sync 都会检测已经同步过的仓库,会非常耗费时间
可以手动下载需要的依赖仓库中的文件到指定目录
方式:
依赖链的头可以从第一个仓库中找到
android_device_oneplus_oneplus3 中的 lineage.dependencies
[ |
|
|
{ |
|
"repository": "android_device_qcom_common", |
|
"target_path": "device/qcom/common" |
|
}, |
|
{ |
|
"repository": "android_packages_resources_devicesettings", |
|
"target_path": "packages/resources/devicesettings" |
|
} |
|
] |
Repository 是依赖的其他仓库
device/qcom/common 是从该仓库下载文件放到的目录
其他仓库也能依赖另外的仓库,所以打开被依赖仓库的时候也需要看有没 lineage.dependencies 存在
还有一种情况是aosp或lineageOS 依赖的项目无法下载下来,可能是镜像中不存在这个文件
手动到github lineage中下载
问题5.
fatal: unable to access xxxxxxxx gnutls_handshake() failed: Error in the pull function.
https相关的tls握手问题。
但是为什么会失败?
问题 6.
fatal: unable to access 'https://github.com/LineageOS/android_frameworks_opt_telephony/': GnuTLS recv error (-9): A TLS packet with unexpected length was received.
解决
用openssl 替换 gnutls 重新编译git
重新编译git
ubuntu16.04需要
点击系统右上角,系统设置-》软件&更新-》并启用“源代码”
然后点确定更新
然后运行
sudo apt-get build-dep git
输入 yes
Mkdir gitopenssl
Cd gitopenssl
apt-get source git
在debian/control 文件中
替换所有 libcurl4-gnutls-dev 为 libcurl4-openssl-dev
在debian/rules文件中
删除 "TEST =test" 行
执行
sudo apt-get install libcurl4-openssl-dev
安装依赖的openssl包
sudo dpkg-buildpackage -rfakeroot –b
构建安装包
可能提示的错误
dpkg-checkbuilddeps: error: Unmet build dependencies: libcurl4-openssl-dev
dpkg-buildpackage: warning: build dependencies/conflicts unsatisfied; aborting
dpkg-buildpackage: warning: (Use -d flag to override.)
解决:
在执行完 sudo apt-get build-dep git
之后执行 sudo apt-get install libcurl4-openssl-dev
完成后可能提示
gpg: skipped "Leonidas S. Barbosa <leo.barbosa@canonical.com>": No secret key
gpg: dpkg-sign.jvQVk_ef/git_2.7.4-0ubuntu1.6_amd64.changes: clearsign failed: No secret key
dpkg-buildpackage: error: failed to sign .changes file
签名问题,不用管。
返回上级目录,会看到
git_2.7.4-0ubuntu1.6_amd64.deb
运行dpkg -i ./git_2.7.4-0ubuntu1.6_amd64.deb
安装
再次 repo sync
结果还是有很多报错
fatal: unable to access 'https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/android_packages_apps_EmergencyInfo/': Unknown SSL protocol error in connection to mirrors.tuna.tsinghua.edu.cn:443
fatal: unable to access 'https://mirrors.tuna.tsinghua.edu.cn/git/lineageOS/LineageOS/cve_tracker/': SSL read: error:00000000:lib(0):func(0):reason(0), errno 104
fatal: unable to access 'https://github.com/LineageOS/android_packages_apps_WundergroundWeatherProvider/': Failed to connect to github.com port 443: Connection refused
没有去追根求底,只想赶快解决
各种网络问题。手动一个个下吧。。。
下好了并解压,根据 manifest.xml 中配置的path 放到对应目录
当aosp和lineageOS的机型无关代码同步好了后
步骤2. 下载设备相关部分代码
2.1同步设备公开代码
把当前用于同步的 repo 文件复制到 ~/bin/repo
接下来运行
Breakfast oneplus3
这条命令会把一些机型相关代码的仓库同步下来(并且会在.repo/local_manifests/roomservice.xml中添加所需要依赖的项目),并且会用到 ~/bin/repo 文件
2.2同步设备私有库
Github中有一个 TheMuppets 账号,在这账号下的仓库集里搜 oneplus3 ,找到对应仓库,然后做如下操作
仓库中有一个清单的项目,里面提供了所有的清单,你只需要将对应你机型的厂商vendor的代码添加到LineageOS/.repo/local_manifests/roomservice.xml文件中就行了
<project name="TheMuppets/proprietary_vendor_oneplus" path="vendor/oneplus" remote="github" revision="cm-14.1" />
加好后文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<project name="TheMuppets/proprietary_vendor_oneplus" path="vendor/oneplus" remote="github" revision="cm-14.1">
</manifest>
然后执行 repo sync
同步过程还是太多网络问题了
所以参考:
https://www.cnblogs.com/daimadebanyungong/p/7765218.html
使用脚本来下载(下载了很久很久,很多次)
但是注意:这个脚本用流量判断是否卡住,但是 repo sync 有2个阶段 1:网络下载 2:在每个下好的子目录中进行 checkout 操作
所以说用这个脚本只能解决阶段1的问题,而进入了阶段2可能会误杀进程
如果看到进行到阶段2了,就可以手动停止使用这个脚本,然后手动执行一次 repo sync 等他执行到
Checking out project LineageOS/android_vendor_qcom_opensource_cryptfs_hw
Checking out project LineageOS/android_vendor_qcom_opensource_dataservices
Checking out project LineageOS/android_vendor_qcom_opensource_dpm
Checking out project LineageOS/android_vendor_qcom_opensource_time-services
Syncing work tree: 100% (587/587), done.
这里 按回车 才真正完成所有的同步
另外 下载阶段完成的日志会是这样:
Checking out project LineageOS/android_device_qcom_sepolicy
Checking out project device/sample
Fetching projects: 100% (587/587)
Fetching projects: 100% (587/587), done.
如果需要用lineage 自带脚本从真实设备中抽取文件
Adb不识别usb设备的处理办法:
https://blog.csdn.net/u013398960/article/details/72511309
开始编译
Croot
brunch oneplus3
遇到错误:
warning: string 'user_image_take_photo' has no default translation.
warning: string 'user_nickname' has no default translation.
packages/apps/EmergencyInfo/res/layout/preference_category_material_settings.xml:33: error: Error: No resource found that matches the given name (at 'fontFamily' with value '@*android:string/config_headlineFontFamilyMedium').
packages/apps/EmergencyInfo/res/layout/preference_category_material_settings.xml:33: error: Error: No resource found that matches the given name (at 'textColor' with value '@color/emergency_contacts_text_color').
packages/apps/EmergencyInfo/res/layout/restricted_popup_menu_item.xml:35: error: Error: No resource found that matches the given name (at 'layout_width' with value '@dimen/config_restricted_icon_size').
packages/apps/EmergencyInfo/res/layout/restricted_popup_menu_item.xml:35: error: Error: No resource found that matches the given name (at 'layout_height' with value '@dimen/config_restricted_icon_size').
[ 80% 27308/33878] Building bootanimation
ninja: build stopped: subcommand failed.
build/core/ninja.mk:151: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1
make: Leaving directory '/android/los/tuna-cm-14.1'
#### make failed to build some targets (02:03:22 (hh:mm:ss)) ####
单独进packages/apps/EmergencyInfo/ 目录用
git reset –hard
git pull lineage cm-14.1
更新了一次
结果还是不行
@*android:string/config_headlineFontFamilyMedium 是系统资源
在系统资源下找不到,@color/emergency_contacts_text_color 这类应该是app自定义的资源,更新后还是搜不到。不知解决思路是什么。
直接将整个EmergencyInfo删除(从名字粗略的看,怕是日后地震预警之类的用不了了吧,这次编译只是给开发机用于开发,不是日常生活用)。
继续编译
最后
running: java -Xmx2048m -Djava.library.path=/android/los/tuna-cm-14.1/out/host/linux-x86/lib64 -jar /android/los/tuna-cm-14.1/out/host/linux-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /tmp/tmpA8djqM /android/los/tuna-cm-14.1/out/target/product/oneplus3/lineage_oneplus3-ota-9a1b472753.zip
done.
[100% 7996/7996] build bacon
Package Complete: /android/los/tuna-cm-14.1/out/target/product/oneplus3/lineage-14.1-20190811-UNOFFICIAL-oneplus3.zip
make: Leaving directory '/android/los/tuna-cm-14.1'
#### make completed successfully (57:53 (mm:ss)) ####
编译成功了
把/android/los/tuna-cm-14.1/out/target/product/oneplus3/ lineage-14.1-20190811-UNOFFICIAL-oneplus3.zip 放到sd卡
进入twrp recover 刷入此包
重启,进入系统
完