JetBrains Quest (March 13, 2020) Write-Up

废话少说,直接上图:

SGF2ZSB5b3Ugc2VlbiB0aGUgcG9zdCBvbiBvdXIgSW5zdGFncmFtIGFjY291bnQ/

看着像是BASE64编码后的

尝试BASE64解码,可以得到:Have you seen the post on our Instagram account?

所以直达https://jb.gg/kotlin_quest。有一段代码,简单阅读后直接改成这样爆破:

fun main() {
    val s = "Zh#kdyh#ehhq#zrunlqj#552:#rq#wkh#ylghr#iru#wkh#iluvw#hslvrgh#ri#wkh#SksVwrup#HDS1#Li#zh#jdyh#|rx#d#foxh/#lw#zrxog#eh#hdv|#dv#sl1"

    for (n in 1..10) {
        for (c in s) {
            print(c - n)
        }
        print('\n')
    }
}

然后第三行是规律的:We have been working 22/7 on the video for the first episode of the PhpStorm EAP. If we gave you a clue, it would be easy as pi.

那么根据提示就很容易搜到What’s Coming in PhpStorm 2020.1 – EAP Series | Season 2020.1 Episode 122/7pi都似乎在提示3.14,确实3分14秒左右画面出现了抖动,于是开到0.25倍:

右下角设置可以调整播放速率

放慢后注意到了,很明显那个homepage的地址变了一下:

homepage那个键值对的值在3分14秒的时候变成了这个

所以访问https://jb.gg/31415926,JetBrains Quest Quiz,是个答题游戏,建议把他家年度报告打开,还有Google。

第一段还好,第二段就不知道他在bb什么了,不过你会发现首字母都大写了,拿出来好像是一句话:.net day call for speakers blog post image hides the next clue。

那么能找到这篇文章JetBrains .NET Day Online 2020 – Call for Speakers – .NET Tools Blog.NET Tools Blog。图片查看源码能看到文件名写了要去下载版本号为201.6303的社区版IDEA,下一步在每日提示里。然后我就不想干了。

可以在IDEA 2020.1 Quest Build Edition – IntelliJ IDEA – Confluence下载并安装。

每日提示可以在主界面的Help->Tip of the Day中触发,打开主界面的时候默认应该也会打开的。看到大家的图是要求斐波那契数列的第50000000项的前4位和后4位。感觉有点奥数题的样子,应该是能找到规律的,另外我感觉递推来爆破应该问题也不大(Google Codelabs,启动!)。

直接搜的话能看到这篇文章The Mathematical Magic of the Fibonacci Numbers,后4位是15000一个周期,前4位似乎没看到?有空再想想吧,先这样了(先糊弄一下)。

JetBrains Quest (March 11, 2020) Write-Up

第二波解谜,可以在https://twitter.com/jetbrains/status/1237694815283879943找到。

原推文

给出了一段字符串:

.spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT

仔细看一下就会发现是倒序

比较明显是倒序的,先尝试复原:

fun main() {
    val string = ".spleh A+lrtC/dmC .thgis fo tuo si ti semitemos ,etihw si txet nehw sa drah kooL .tseretni wohs dluohs uoy ecalp a si ,dessecorp si xat hctuD erehw esac ehT .sedih tseuq fo txen eht erehw si ,deificeps era segaugnal cificeps-niamod tcudorp ehT"
    print(string.reversed())
}

会得到:The product domain-specific languages are specified, is where the next of quest hides. The case where Dutch tax is processed, is a place you should show interest. Look hard as when text is white, sometimes it is out of sight. Cmd/Ctrl+A helps.

比较明显:

MPS

来到MPS: The Domain-Specific Language Creator by JetBrains,能发现这里有个:

搜索Dutch tax

打开报告,根据提示,全选来尝试看到白色的文字:

全选即可发现有白色的文字

复制出来可以得到:This is our 20th year as a company, we have shared numbers in our JetBrains Annual report, sharing the section with 18,650 numbers will progress your quest.

所以前往JetBrains 2019 Annual Highlights – Celebrating 20 Years!,找了半天没发现哪里有18650,后面才发现原来是这个加起来刚好是18650:

进去后慢慢翻,有个图片:

有一段火星文?可以慢慢看,也可以看看图片的alt属性:

能勉强看出来是:Did you know JetBrains is always hiring? Check out the kareers(careers) page and see if there is a job for you or a quest challenge to go further at least.

在招聘页面能找到这个Fearless Quester在https://www.jetbrains.com/careers/jobs/fearless-quester-356/,但是忘记截图了,现在已经404了,有点尴尬。

一直觉得自己执行力好差啊…还是要想办法做到今日事今日毕才行…

根据提示后续要到Game Development Tools by JetBrains,用科乐美秘技触发,有一个打砖块游戏,打完砖块就出现了:

CLion嵌入式开发上手

CLion从2019.1开始正式加入了对嵌入式开发的支持,虽然仅仅是整合了之前已经有的OpenOCD和STM32CubeMX的插件,但也有很强的可玩性了。其实大概一年前这个特性刚出来的时候我就试过,因为某些原因不了了之,具体内容可以在我原来博客的存档里面找到。好久没有做嵌入式了,这次因为选修嵌入式课程开始重操旧业。

现在是2020年3月,我正在Windows 10上面使用CLion 2019.3.4,Toolbox检查已是最新版本。还是要说明,这篇文章不是什么教程,仅仅只是我个人尝试的经历,分享出来希望能和大家一起交流,如果有哪里不好烦请不吝赐教。底部有评论区,恳请大家留点经验意见。

表情包来自互联网,侵删。

准备工作

在开始之前,你需要准备一些东西:

一块开发板(废话)。等了几天快递,今天终于刚到手一块NUCLEO-F446RE。用什么板子应该是无所谓的,最多是后面选Board config file的时候没有,要自己写(其实大部分都没几句话,应该问题不大)。

表情包来自互联网,侵删。

有了开发板还要调试器,通常还要给调试器安装驱动程序,由于NUCLEO板载ST-LINK/V2,所以去到STSW-LINK009 – ST-LINK, ST-LINK/V2, ST-LINK/V2-1 USB driver signed for Windows7, Windows8, Windows10 – STMicroelectronics安装驱动程序。

事先安装好CLion(废话)。我推荐先安装JetBrains Toolbox,然后再通过Toolbox安装CLion,使用Toolbox来管理这些IDE会比较方便。当然,要是你真的从头到尾都只使用他家的CLion的话,直接安装CLion也没啥问题。

Toolbox长这样的,方便管理各个工具和最近的项目

Mingw-w64。我是使用MSYS2安装的,不用应该也可以(比如那些预构建包,在MinGW-w64 – for 32 and 64 bit Windows download | SourceForge.net)。

平时偶尔写写C/C++,所以事先基本包已经怼上了

这个环境是用来构建C/C++程序的,这里主要好像只是用到了make(就是那个mingw32-make.exe)。根据文档,你想使用MinGW应该也没有问题。另外,我之前用子系统Ubuntu(官方文档没说可以)的工具链好像构建总是会失败,忘记报错信息了,你可以试试然后来分享一下。

OpenOCD。不是很了解,不敢瞎BB。看到这篇好像不错?跟我一起学OpenOCD(一) – 知乎,有空再看看文档。根据官方文档,如果有MSYS2,那么安装比较简单:

pacman -S mingw-w64-x86_64-openocd

没有好像也没关系,Getting OpenOCD « Open On-Chip Debugger下面有非官方的预构建包可以下载,解压后即可使用。随后都需要在设置中指定其位置(找不到可以两下Shift来Search Everywhere,然后搜你想要的)。

Settings->Build, Execution, Deployment->Embedded Development
测试一下

STM32CubeMX。用来生成代码框架等,官网下载安装即可,如果是默认的安装路径的话CLion中应该能自动检测到。

STM32CubeMX

gcc-arm-none-eabi。最重要的工具,交叉编译用。虽然GitHub – msys2/MINGW-packages: Package scripts for MinGW-w64 targets to build under MSYS2.里面有PKGBUILD:

但是根据How to install mingw-w64-arm-none-eabi-gcc · Issue #4068 · msys2/MINGW-packages · GitHub,需要自行构建,pacman暂时没法直接装上。不过可以直接到ARM的官网上下载预编译好的工具链,链接找不到可以点上面的。CLion此时的文档仍然是写的支持2019-q3或者2018-q2及之前的版本。看了一下,2019-q3是GCC 8,2019-q4是GCC 9,估计是没测试完就没写支持吧,自己斟酌。而且印象中这个时候的CLion对于版本高于8的gdb仍然会给出不支持的警告(虽然还是能用)。

我下载的.zip包,解压到了MSYS2环境里(自己建了个3rd文件夹),放哪里应该都是无所谓的。然后要到设置中手动指定arm-none-eabi-gcc.exearm-none-eabi-g++.exearm-none-eabi-gdb.exe。(这个方法是我突然想到的,感觉应该有更好的?)

Settings->Build, Execution, Deployment->Toolchains

你会注意到,如果这个配置文件在队列里不是第一个的话,并不会显示default,也就是说平时并没有用这个配置。如果你平时在使用多个Toolchain于不同用途,你并不需要一直在这里切换,而是可以在这里为每个Project单独设置:

Settings->Build, Execution, Deployment->CMake

你会注意到上面有个地方可以设置环境变量,因为我没有在PATH中设置编译器位置时,后续建好Project的时候CMake还是会找不到,像这样:

Reload CMake Project

你可以写一个.cmake文件来设置,不过我在这里直接给这个Project设置环境变量(这样不会影响系统的):

Settings->Build, Execution, Deployment->CMake->Environment

此时应该就没有问题了:

开工吧!

准备了这么多东西,现在该来尝试一下了。你需要先打开CLion,然后新建一个Project,就像这样:

New Project

项目名字自己起一个,尽量别untitled一路下来(我真的见过一堆项目untitled一直到untitled200的)。

点击打开STM32CubeMX来配置

默认上来的型号通常不是你想要的,点击Open with STM32CubeMX来启动STM32CubeMX。你可以在这里点击型号来改变:

点按STM32F030F4Px
搜索你的开发板或是MCU等

这是文档里这么干的,感觉有点奇怪。这并不能直接改型号,而是新建了一个Project,我感觉还不如直接新建好,然后再用CLion打开呢…因为这是新建的,所以你需要到这里来设置好名称和工具链。你需要保证生成的代码的位置和刚刚你在CLion中新建的Project一样,不然就白折腾了半天。就像下面这样:

Project Manager

此时点按GENERATE CODE来生成代码,会提示是否覆盖CLion自动生成的那份.ioc文件。覆盖吧,反正没啥用。总之我感觉这么干有点多此一举。

生成正常的话,现在就可以回到CLion中了。此时右下角应该会有气泡窗口显示已经自动检测到了:

这次弹窗要我选择Board config file,由于这里有现成的,就直接用了:(没有的话,应该在OpenOCD目录下的scripts里面可以依葫芦画瓢一下)

Board Config File

由于我之前设置环境变量是单独为Project设置的,所以每次新建都需要设置,不然就会:

Reload CMake Project

同样地,像上面那样设置好环境变量就OK了。回来再点击一下上一个图里左上角这个Reload CMake Project图标,应该就没有问题了。

注意到右上角,要执行任务的配置还是没设置好,此时还不能Run:

右上角,Edit Configurations

很简单,点按Edit Configurations…来修复错误。注意到窗口下方的错误信息是:

Edit Configurations下方有错误信息

那么只要指定Target就好了:

指定Target

此时Run和Debug的图标应该就不是灰色的了。插上开发板,点按Run(此时的配置应该是那份OCD的而不是CMake的),顺利的话应该很快就会:

此时应该已经烧录成功了,你也可以尝试着写点小程序来测试一下。

只能Run还不够,Debug也很重要。打上断点,点按Debug图标来启动,应该没有问题的:

下方的Debug窗口应该会显示变量、堆栈等信息。不知道你会不会在Debug窗口的第一栏看到这个很好使的小工具:

划重点,点按后即可在当前现场执行你想要的语句,有点像脚本语言一样?总之很好使就对了。

如果你想查看引脚信息,需要导入.svd文件,根据SVD files on ARM website – Keil forum – Software Tools – Arm Community,你可以在MDK5 Software Packs里先下载pack,然后从里面拿到。

如果你之前就在使用Keil做嵌入式开发,那么你应该已经有了这个pack,直接去找就好了。导入后就可以正常查看了。

应该暂时就这么多吧。想到啥再补充。

引用:(文中已做超链接的就不再列出了)
CLion 2019.1 EAP: CLion for Embedded Development, Part III | CLion Blog
STM32CubeMX Projects – Help | CLion
CLion for embedded development | CLion Blog
CLion for Embedded Development Part II | CLion Blog
MSYS2 installation · msys2/msys2 Wiki · GitHub
How to cross compile with cmake + arm-none-eabi on windows? – Stack Overflow
[柴工带你学习LiteOS系列]之—Windows下的GCC环境搭建_云博客_云社区-华为云
使用CLion做嵌入式开发 | 王晓磊贴代码用的Blog

JetBrains Quest (March 9, 2020) Write-Up

这篇文章是事先写好的,等到解谜到期后(“You have until the 15th of March at 12:00 CET to finish all the quests.”,也就是北京时间当日19:00)才放出的。总之我觉得,在结束前就到处发题解,大概就只能是破坏解谜气氛和便宜了黑产吧。

48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f

比较明显的十六进制的特征

看着很像是16进制表示的内容,尝试着转为ASCII字符。改行写Kotlin了,以后看到脚本长得跟你平时看见的不一样不要觉得奇怪…

import java.util.*

fun main() {
    val string = "48 61 76 65 20 79 6f 75 20 73 65 65 6e 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 4a 65 74 42 72 61 69 6e 73 20 77 65 62 73 69 74 65 3f"
    val scanner = Scanner(string)
    while (scanner.hasNextInt(16)) {
        print(scanner.nextInt(16).toChar())
    }
}
输出的结果

得到输出:Have you seen the source code of the JetBrains website?

应该是一个提示。去看看官网的源码。访问JetBrains: Developer Tools for Professionals and Teams,然后Ctrl+U查看源代码(或者直接在网址前面打上view-source:)。比较长,于是尝试Ctrl+F搜索quest,发现了一段注释:

官网源代码中的注释,给出了hint

画个重点:

JetBrains has a lot of products, but there is one that looks like a joke on our Products page, you should start there… (hint: use Chrome Incognito mode)

产品页中有一个看起来像是个玩笑?提示用Chrome的无痕浏览。

其实还有一个更重要的重点:

It’s dangerous to go alone take this key: Good luck! == Jrrg#oxfn$

有一个奇怪的key。

先跳转产品页,也就是All Developer Tools and Products by JetBrains。3月12日的时候,直接访问相比Chrome的无痕浏览模式访问,会多出一个:

哈哈哈哈哈…很难笑欸
复制一个玩,当纪念吧。

点开康康:

仍然是hint

要求计算500到5000范围内的质数的数量。这个时候可能很多人会默默开始写脚本了,然而我选择WolframAlpha:

直接得到有574个质数

所以应该访问https://jb.gg/574。有一说一,这个域名挺难听的…被跳转到了https://www.jetbrains.com/help/pycharm/getting-help.html#quest

PyCharm的文档页

有用过YouTrack,或者是曾经发现JetBrains家的IDE有问题的人应该会知道这个编号的含义的。不知道的话,看上面的图标应该也能猜到要去看看这个产品是啥。到YouTrack的官网搜这个事件编号就可以了,甚至粗暴地Google一下也可以。所以就是访问JetBrains Quest : MPS-31816

有一串密文

考虑到之前给出的hint:Good luck! == Jrrg#oxfn$。能发现两个o都对应了r,应该只是进行了替换而已。好了,开工:

fun main() {
    val string = "Qlfh\$#Li#|rx#duh#uhdglqj#wklv#|rx#pxvw#kdyh#zrunhg#rxw#krz#wr#ghfu|sw#lw1#Wklv#lv#rxu#lvvxh#wudfnhu#ghvljqhg#iru#djloh#whdpv1#Lw#lv#iuhh#iru#xs#wr#6#xvhuv#lq#Forxg#dqg#iru#43#xvhuv#lq#Vwdqgdorqh/#vr#li#|rx#zdqw#wr#jlyh#lw#d#jr#lq#|rxu#whdp#wkhq#zh#wrwdoo|#uhfrpphqg#lw1#|rx#kdyh#ilqlvkhg#wkh#iluvw#Txhvw/#qrz#lw“v#wlph#wr#uhghhp#|rxu#iluvw#sul}h1#Wkh#frgh#iru#wkh#iluvw#txhvw#lv#‟WkhGulyhWrGhyhors†1#Jr#wr#wkh#Txhvw#Sdjh#dqg#xvh#wkh#frgh#wr#fodlp#|rxu#sul}h1#kwwsv=22zzz1mhweudlqv1frp2surpr2txhvw2"
    val stringBuilder = StringBuilder()
    string.forEach {
        stringBuilder.append(when (it) {
            'J' -> 'G'
            'r' -> 'o'
            'g' -> 'd'
            '#' -> ' '
            'o' -> 'l'
            'x' -> 'u'
            'f' -> 'c'
            'n' -> 'k'
            '$' -> '!'
            else -> it
        })
    }
    print(stringBuilder.toString())
}

得到的输出是这样的:

仍然是乱码

继续观察一下,结合ASCII表就发现,密文只是相对于明文右移了3位而已。那么可以尝试还原了:

fun main() {
    val string = "Qlfh\$#Li#|rx#duh#uhdglqj#wklv#|rx#pxvw#kdyh#zrunhg#rxw#krz#wr#ghfu|sw#lw1#Wklv#lv#rxu#lvvxh#wudfnhu#ghvljqhg#iru#djloh#whdpv1#Lw#lv#iuhh#iru#xs#wr#6#xvhuv#lq#Forxg#dqg#iru#43#xvhuv#lq#Vwdqgdorqh/#vr#li#|rx#zdqw#wr#jlyh#lw#d#jr#lq#|rxu#whdp#wkhq#zh#wrwdoo|#uhfrpphqg#lw1#|rx#kdyh#ilqlvkhg#wkh#iluvw#Txhvw/#qrz#lw“v#wlph#wr#uhghhp#|rxu#iluvw#sul}h1#Wkh#frgh#iru#wkh#iluvw#txhvw#lv#‟WkhGulyhWrGhyhors†1#Jr#wr#wkh#Txhvw#Sdjh#dqg#xvh#wkh#frgh#wr#fodlp#|rxu#sul}h1#kwwsv=22zzz1mhweudlqv1frp2surpr2txhvw2"
    val stringBuilder = StringBuilder()
    string.forEach {
        stringBuilder.append(it - 3)
    }
    print(stringBuilder.toString())
}

这下直接得到结果了:Nice! If you are reading this you must have worked out how to decrypt it. This is our issue tracker designed for agile teams. It is free for up to 3 users in Cloud and for 10 users in Standalone, so if you want to give it a go in your team then we totally recommend it. you have finished the first Quest, now it’s time to redeem your first prize. The code for the first quest is “TheDriveToDevelop”. Go to the Quest Page and use the code to claim your prize. https://www.jetbrains.com/promo/quest/

也就是前往上面这个链接兑奖就可以了。

片刻即可收到邮件:

三个月全家桶,算是个小惊喜吧。

Windows 10下使用Windows+Shift+S截图

好消息,好消息!如果你正在使用较新的Windows 10,那么截图只要:Windows徽标键+Shift+S即可触发截图和草图应用来抓取矩形截图、任意形状截图、窗口截图或是全屏幕截图Windows徽标键+PrtSc即可触发截图和草图应用直接抓取全屏幕截图不用再为了截图打开微信或QQ啦。

截图和草图应用

如果你觉得这个快捷键比较难按,你可以在设置->轻松使用->键盘中修改:

修改热键为PrtScn

什么?你说我火星了?好像不是我,是我的朋友们…(无中生友ing)

好,来说说这个功能。根据此文章Why doesn’t the screen clipping tool work anymore? – OneNote所述,该热键本是OneNote用户用于截图的,自Windows 10创意者更新(也就是1703)后,由截图与草图应用接管。相关文章还包括:What’s New in Windows 10’s Creators UpdateHow to take and annotate screenshots on Windows 10

还要注意的是,根据Snip & Sketch…. : Windows10 – Reddit。截取屏幕后,你通常直接从剪贴板中取得图片,但是在:%LOCALAPPDATA%\Packages\Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy\TempState\ScreenClip路径下仍然保存有图片的副本(也就是C:\Users\%USERNAME%\AppData\Local\Packages\Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy\TempState\ScreenClip)。可能有隐私泄露风险,请务必注意。

Chrome 离线安装

推荐同学用Google Chrome作为日常的浏览器,但是他表示很难下载成功。为了省事,我决定直接弄个离线安装包给他。

直接搜索chrome offline installer,找到了官方文档:下載及安裝 Google Chrome – 電腦 – Google Chrome說明。文中说明了在离线状态下安装Chrome,需要在联网的主机上下载备用Chrome安装程序,就是我想要的离线安装包了。

只要打开上述链接再点击下载Chrome就可以得到离线安装包了。

仔细看了一下那个链接,其实本质上只是在Chrome的官方网址https://www.google.com/chrome/后面加上?standalone=1而已。即:https://www.google.com/chrome/?standalone=1

访问试一下,没有问题,有图有真相:

IDM抓取到的,看文件名和大小应该没有问题。

类似问题:Google Chrome 离线安装包的官方下载地址是什么? – 知乎

Foobar2000 简单上手

Foobar2000是一个强大的音乐播放器。好久没有拿出来用了,今天简单记录一下。

官网:foobar2000

Monkey’s Audio files (.APE)

下载安装就不用说了。印象中默认是不能直接播放ape格式的文件的,需要安装解码器(decoder)。可以在官网找到:foobar2000: Components Repository – Monkey’s Audio Decoder。正常情况下下载后直接双击这个插件就可以安装了。

双击后应该会弹出插件列表

双击后应该会弹出插件列表,点击Apply即可。

如果没有弹出插件列表,可能是插件的文件格式没有被关联上,这个时候只需要到插件列表里手动安装即可:

进入设置,设置里的第一个(Components)就是了
点击Install,并找到你刚下载好的插件就可以了

安装会要求重启Foobar2000,重启后就可以播放ape格式的文件了。

Free Encoder Pack

想要转换格式的时候发现,如果想要转换成flac等格式的文件,会发现缺少编码器,要求你提供flac.exe的位置。

同样地,要解决这个问题,可以在官网上找到一个整合了很多编码器的包:foobar2000: Free Encoder Pack,描述称:这个包内含多个用于转换的编码器文件。下载安装即可。

安装后再执行转换就不会要求你选择编码器了。

音乐库扫描内含*.cue的文件

默认音乐库只扫描个人文件夹下的音乐文件夹,可以在设置中自行设置。打开设置(Preferences,偏好项),点击媒体库(Media Library)即可自行修改目录。

Preferences->Media Library

注意到了Exclude项,它默认排除识别*.cue文件,这通常不是我们想要的,因为这样会使得那些完全依赖cue文件进行分轨的整轨音乐无法被识别为多个音乐文件。在某些时候可以考虑删除它,此时应该能正常识别了。

此外,Shell Integration中也默认排除*.cue文件,自行根据需要调整吧。

要指出的是,某些安全软件会阻止你修改这些选项,有点迷…

大概就先这样吧,想到什么再补。

安卓 通过adb将TF(SD)卡用作内置存储

手上有个360 N6,平时当备用机,存点音乐视频什么的,存储空间不太够,于是乎买了张TF卡插上。(其实应该去看看紫光的超级SIM卡能不能用的,深圳联通公众号上也发可以参加预存话费赠卡的活动了)

我的第一部智能手机买的是黑莓Priv,插卡之后会提示格式化成外置的便携式存储(可以拔出来在不同设备,比如电脑上交换数据)还是内置存储(不能用在其它机器上),并且使用非常正常。

好了问题来了,N6插卡之后只能格式化成外置存储(?),这就很蛋疼,插卡的意义似乎就不大。后面发现其实可以用adb开启,虽然好像还是有点问题。

But how?

可以用sm来做到。

首先连续多次点按设置->系统->关于手机->版本号,打开开发者选项,然后在开发者选项打开USB调试。此时可以把手机连接到电脑上了。

我正在使用Android Studio,安装过Android SDK,可以直接在C:\Users\domain\AppData\Local\Android\Sdk\platform-tools中找到adb工具。没有也没关系,从SDK平台工具版本说明 | Android 开发者 | Android Developers可以下载到独立的工具包。

已经有了platform-tools之后,进入该目录,按住Shift再点击鼠标右键可以在该目录打开PowerShell。此时运行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
1f95707d        unauthorized

显示未授权,此时手机上应该会弹窗是否允许电脑进行调试(以及一个密钥),允许后再次执行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
1f95707d        device

此时可以:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe shell
QK1707:/ $

有了手机的Shell了,尝试sm工具查看存储:

QK1707:/ $ sm list-disks
disk:179,64

如果手机允许:

QK1707:/ $ sm has-adoptable
true

反之则可能需要尝试sm set-force-adoptable true。接下来 就可以:

QK1707:/ $ sm partition disk:179,64 private

来将存储卡格式化为内置存储。如果执行:

QK1707:/ $ sm partition disk:179,64 mixed 30

可以将部分空间格式化为内置存储,另一部分(30%)作为便携式存储。

此时可以在设置中看到存储卡已经被设置为内置存储了。发现容量显示有问题,而且迁移也有点问题。网友分享格机后,安装应用不要打开马上迁移就没有问题。决定这几天格机再试一下。

引用:
android – How to turn a portable SD card into internal storage via ADB command? – Stack Overflow
透過ADB方式開啟與配置Adoptable Storage空間(免root) @ 老梁’s blog :: 隨意窩 Xuite日誌
360N7Lite免root安装应用到内存卡的方法及其它玩机教程-更新自动安装到内存卡_360社区