2019年10月17日木曜日

在 Ubuntu 18.04 上架設 GitLab

就像這篇的標題一樣
這篇主要是用來記錄怎麼架設 GitLab
GitLab 主要有 2 個版本
一個是 CE
一個是 EE
CE 是 Community Edition
EE 是 Enterprise Edition
因為 CE 不用錢
所以這篇裝的是 CE 版

TL;DR

安裝指令

sudo apt update
sudo apt upgrade -y
sudo apt install curl openssh-server ca-certificates postfix -y

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash
sudo apt install gitlab-ce -y

設定

安裝完之後開啟 /etc/gitlab/gitlab.rb 這個檔案

sudo gedit /etc/gitlab/gitlab.rb

找到 external_url 這行
然後把 URL 寫進去
看起來會像下面這樣

external_url 'http://any.address'

然後讓 gitlab 做一次重新設定

sudo gitlab-ctl reconfigure

最後設定防火牆

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https
sudo ufw enable

下面這行可以確認防火牆服務的狀態

sudo ufw status

就這樣沒了!!



硬體需求

根據官方文件描述

CPU 的部分

1 core supports up to 100 users but the application can be a bit slower due to having all workers and background jobs running on the same core
2 cores is recommended minimum number of cores and supports up to 100 users
4 cores supports up to 500 users
8 cores supports up to 1,000 users
32 cores supports up to 5,000 users

基本上如果有大於 5,000 使用者的需求
就需要做其他的設定來換取系統的效能
不過因為我用不到這麼多人的需求
所以就不考慮了

是說現在這個時間點也找不到一台 1 核心的電腦就是了
當然如果是用 VM 架的那就另當別論了...

記憶體的部分

4GB RAM + 4GB swap supports up to 100 users but it will be very slow
8GB RAM is the recommended minimum memory size for all installations and supports up to 100 users
16GB RAM supports up to 500 users
32GB RAM supports up to 1,000 users
128GB RAM supports up to 5,000 users

官方文件上是建議最少 8GB 啦
雖然它說 4GB 也可以
但是另外 4GB 是靠 swap 來運作的話基本上就慢了呀 @@
而且根據 repo 的大小有可能會需要更多或更少的記憶體
這就要看使用情況而定了

資料庫的部分

官方建議至少 5 ~ 10 GB
看需求而定
目前 12.1 以上的版本是支援 PostgreSQL
之前的 MySQL/MariaDB 建議是在升級之前移動到 PostgreSQL 去

支援的網頁瀏覽器

Firefox
Chrome/Chromium
Safari
Microsoft Edge
Internet Explorer 11
※不支援 JavaScript disabled 的環境

安裝

更新 package

反正在 ubuntu 上不管做什麼
只要用到 package 相依的東西就會要做這個動作
不過其實也不是這麼必要就是了
就自己選擇看要不要做就好...

sudo apt update
sudo apt upgrade -y

安裝相依套件

sudo apt install curl openssh-server ca-certificates postfix -y

安裝 GitLab

先追加 GitLab package repository

curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

追加完之後先暫停一下
在執行安裝之前
要講一個東西叫做 EXTERNAL_URL
這個東西就是之後要被外部存取的 URL
依照官方文件的描述
要先指定這個變數再進行安裝
所以看起來會像下面這樣

sudo EXTERNAL_URL="https://gitlab.example.com" apt install gitlab-ce

但是如果這個時候還沒有要決定 url 的話也沒關係
就直接向下面這樣給他安裝也不會有問題

sudo apt install gitlab-ce -y

為什麼要把這個拿出來講的的原因是因為
我一開始沒有看文件就隨邊敲了個安裝指令
然後他就跳警告訊息了 =口=

不過這個值可以從檔案直接改所以也沒什麼影響就是了w
這個檔案是 /etc/gitlab/gitlab.rb
找個 editor 把這個檔案打開

sudo gedit /etc/gitlab/gitlab.rb

然後在裡面可以找到一行

external_url 

然後空空的東西
這邊就是可以填入 url 的地方
填完看起來會像下面這樣

external_url 'http://192.168.8.106'

這邊因為沒有要上 global 的需求
所以只給個 local ip 就可以了

然後就是跑一次 GitLab 的重新設定

sudo gitlab-ctl reconfigure

防火牆設定

這個沒設的話可能會沒辦法存取喔...
這裡用 ufw 來設定

sudo ufw allow ssh
sudo ufw allow http
sudo ufw allow https

然後啟動它

sudo ufw allow enable

檢查它的狀態

sudo ufw status

其他

HTTP server

是說因為 GitLab 本身已經內建 Nginx 了
所以原本如果有執行其他 httpd 的話可能會衝突
它的預設 port 是 80
如果已經有其他 web 也佔用了的話
這樣就要另外設定了!!

GitLab 的啟動跟停止

sudo gitlab-ctl stop
sudo gitlab-ctl start

2019年7月24日水曜日

Windows 10 的 WSL 中使用 Ubuntu 18.04 啟動 SSH 遇到的問題

在一般普通的 Ubuntu 底下
通常可以使用 systemd 來做 server management
但是 WSL 的 Ubuntu 有自己的 init system
所以基本上 systemctl 指令是沒有辦法使用的

遇到的問題

在敲下面這個 SSH 啟動的指令的時候就遇到了問題

sudo systemctl start sshd

解決的方法就是回歸最原始的 service 指令
sudo service ssh restart

不過事情好像沒那麼簡單 因為馬上就跳出了另外一個錯誤
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
 * Restarting OpenBSD Secure Shell server sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key

這時候只要敲一個指令就行了

sudo ssh-keygen -A

然後看到下面這個訊息就行了

ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519

然後在重啟 ssh service

sudo service ssh restart

這時候會看到下面這行訊息就表示成功了

 * Restarting OpenBSD Secure Shell server sshd            [ OK ]

參考資料

Windows Subsystem for Linuxにssh接続する

2019年7月22日月曜日

YUYV 轉 RGB 的 C code

YUYV(YUV422) to RGB

YUYV to RGB

void yuyv_to_rgb(unsigned char* yuv,unsigned char* rgb, int image_width, int image_height)
{
    unsigned int i;
    unsigned char* y0 = yuv + 0;   
    unsigned char* u0 = yuv + 1;
    unsigned char* y1 = yuv + 2;
    unsigned char* v0 = yuv + 3;
 
    unsigned  char* r0 = rgb + 0;
    unsigned  char* g0 = rgb + 1;
    unsigned  char* b0 = rgb + 2;
    unsigned  char* r1 = rgb + 3;
    unsigned  char* g1 = rgb + 4;
    unsigned  char* b1 = rgb + 5;

    float rt0 = 0, gt0 = 0, bt0 = 0, rt1 = 0, gt1 = 0, bt1 = 0;
 
    for(i = 0; i <= (image_width * image_height) / 2 ;i++)
    {
        bt0 = 1.164 * (*y0 - 16) + 2.018 * (*u0 - 128); 
        gt0 = 1.164 * (*y0 - 16) - 0.813 * (*v0 - 128) - 0.394 * (*u0 - 128); 
        rt0 = 1.164 * (*y0 - 16) + 1.596 * (*v0 - 128); 
   
        bt1 = 1.164 * (*y1 - 16) + 2.018 * (*u0 - 128); 
        gt1 = 1.164 * (*y1 - 16) - 0.813 * (*v0 - 128) - 0.394 * (*u0 - 128); 
        rt1 = 1.164 * (*y1 - 16) + 1.596 * (*v0 - 128); 
      
        if(rt0 > 250)   rt0 = 255;
        if(rt0 < 0)     rt0 = 0; 
 
        if(gt0 > 250)  gt0 = 255;
        if(gt0 < 0) gt0 = 0; 
 
        if(bt0 > 250) bt0 = 255;
        if(bt0 < 0) bt0 = 0; 
 
        if(rt1 > 250) rt1 = 255;
        if(rt1 < 0) rt1 = 0; 
 
        if(gt1 > 250) gt1 = 255;
        if(gt1 < 0) gt1 = 0; 
 
        if(bt1 > 250) bt1 = 255;
        if(bt1 < 0) bt1 = 0; 
     
        *r0 = (unsigned char)rt0;
        *g0 = (unsigned char)gt0;
        *b0 = (unsigned char)bt0;
 
        *r1 = (unsigned char)rt1;
        *g1 = (unsigned char)gt1;
        *b1 = (unsigned char)bt1;
 
        yuv = yuv + 4;
        rgb = rgb + 6;
        if(yuv == NULL)
          break;
 
        y0 = yuv;
        u0 = yuv + 1;
        y1 = yuv + 2;
        v0 = yuv + 3;
  
        r0 = rgb + 0;
        g0 = rgb + 1;
        b0 = rgb + 2;
        r1 = rgb + 3;
        g1 = rgb + 4;
        b1 = rgb + 5;
    }   
}

usage

int image_width = 1920;
int image_height = 1080;
unsigned char * p_yuyv_data = (unsigned char *)malloc(sizeof(unsigned char) * image_width * image_height * 2);
unsigned char * p_rgb_data = (unsigned char *)malloc(sizeof(unsigned char) * image_width * image_height * 3);

// yuyv の処理
// ... 省略

yuyv_to_rgb(p_yuyv_data, p_rgb_data);

// rgb の処理
// ... 省略
free(p_yuyv_data);
free(p_rgb_data);

在 Ubuntu 18.04 make AOSP 8.1 遇到的錯誤

這陣子一直在搞 AOSP
但是 build AOSP 的時候好像很容易就出現錯誤了= =

TL;DR

$ export LC_ALL=C



遇到的錯誤訊息

flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
Aborted (core dumped)
ninja: build stopped: subcommand failed.
ninja failed with: exit status 1




解決方法

$ export LC_ALL=C
locale 這個東西是用來設定執行的程式的不同語言環境用的
基本上包括了 Language、Territory、Codeset
locale 總共分成 12 類
所以有 12 個 define 值
LC_CTYPE
LC_NUMERIC
LC_COLLATE
LC_TIME
LC_MONETARY
LC_MESSAGES
LC_NAME
LC_ADDRESS
LC_TELEPHONE
LC_MEASUREMENT
LC_PAPER
LC_IDENTIFICATION
而 LC_ALL 的優先級別則高於上述的全部
所以設定 LC_ALL 的時候
就會完全不管上述的 locale sensitive 的設定
LC_ALL=C 的 “C” 指的是 POSIX
這意味著你的程式根本不管 locale 的設定
這樣就和多國語言的設計理念看起來有點衝突了的說= =

2019年7月21日日曜日

用 Android Studio 對 AOSP 進行除錯


這篇主要是要說
怎麼在 android studio 導入 aosp-based 的專案進行除錯
這篇拿 vamrs 的 rock960 的 android sdk 當範例

TL;DR

前提是這個專案已經 make 完了!!
$ cd ${project_root}
$ source build/envsetup.sh
$ mmm development/tools/idegen/
$ sudo development/tools/idegen/idegen.sh



需要的東西

  1. android studio
  2. 已經 make 過的 aosp-based project
因為這篇的重點是要除錯
所以一定要是 make 完的專案
如果只是要看 aosp 的 source 的話
基本上不需要 make 過的專案!!

執行環境設定

基本上只要能 make aosp-based project 就不需要在額外設定了
如果不行的話
也許可以參考之前寫的這篇:用 Ubuntu 18.04 建立 Android 系統建置環境

產生 idegen.jar

$ source build/envsetup.sh
$ mmm development/tools/idegen/

















產生的 idegen.jar 會在下面這個路徑裡
out/host/linux-x86/framework/idegen.jar
這個東西是用來等等要產生 android studio 用的 project config 用的
所以一定要確定這個東西有產生!!












產生 android.iml 和 android.ipr

有了剛剛產生的 idegen.jar 之後就可以產生 android studio 用的 config 了
而 android.iml 和 android.ipr 就是所謂的 project config 了
這時候只要執行 idegen.sh 就行了
$ development/tools/idegen/idegen.sh










怎麼可能呢...
事情竟然沒有這麼單純…@@
竟然被說沒有權限了!!
看了一下這個路徑還真的被劃了一個X...















加個 sudo 試試看
結果竟然可以了!!
$ sudo development/tools/idegen/idegen.sh





然後輸出的 android.iml 和 android.ipr 會在專案的根目錄下














導入 AOSP

接下來就輪到 android studio 出場了














選 [Open an existing Android Studio project]
然後找到剛剛的 android.ipr




















然後就跳出了個警告@@











然後直接選 [Convert] 就好
它不太會有什麼影響
接著就會看到整個專案被導入了













不對…
好像怪怪的=口=
仔細看了一下 IDE 底下的 log 才發現竟然出錯了@@
他說看起來剛剛產生的 iml 檔好像壞掉了( ´・д・)エッ
Load Settings: Cannot load settings from file 'android.iml'
最後看起來檔案好好的
只是因為 android studio 讀檔太慢了= =
所以不要緊張!!
它自己產生的 bug !!
幫它放置一段時間之後
它自己讀完就好了!!
它最後就會把整個專案讀進來了!!












這時候卻又報了一個警告
External file changes sync may be slow
The current inotify(7) watch limit is too low. More details.


讓我題外話一下
這個時候我突然想到一件事
前陣子在用 visual studio code 的時候
因為導入整個 linux kernel 5.x 全部的 source files
結果太大導致 VSC 吃不完
所以就調整了 fs.inotify 的監看數量















就是因為這個數值可能大了點…
所以換 android studio 抱怨檔案太多速度會變慢了=口=


結果 android studio 同步完整個專案花了超多時間地說OTL
就是 sync + indexing 大概花了 30 分鐘左右的時間
(i7-8559U + 16GB DDR4-3200 + Plextor m9peg 1TB)

設定 JDK

基本上如果只是要看 aosp 的 source 的話其實這個不太重要
不過因為要除錯
所以需要整個 framework 的 source 才行
不然它會去抓一些不是你想看的東西來用
這樣是沒辦法除錯的!!
打開 [File]->[Project Structures]
然後找到左邊 SDKs 的 Tab
按一下上面的 [+] 來新增一個 JDK












然後它會跳出一個對話框讓你選 JDK 的路徑
直接 [OK] 就好






















然後新增加出來的這個 jdk 的 [Name] 隨便取就好
那不太重要
可以認得出它就行了















然後找到下面的 Android API 28 Platform
把 Java SDK 選項換成剛剛新增的 JDK
















接著到左邊的 TAB 中找到 [Project Settings]->[Project]















把 剛剛新增加的 SDK 指定給現在這個 project















在旁邊的 TAB 找到 [Project Settings]->[Modules]
然後找到 [Dependencies]















把它們全部刪掉!!
但是要記得留下一些東西
像下面這張圖這樣















找到右邊的[+]
把 frameworks 和 external 兩個路徑給加進去












在追加路徑的時候
它會出現一個對話框
也是直接按[OK]就好




















加完之後看起來會像下面這張圖這樣















這時候 project tree 會在剛剛那兩個路徑後面顯示[library root]















然後就可以打開 source 下斷點進行除錯了!












大概就是這樣了(´∀`)ノシ

在 ubuntu 18.04 上遇到的 SSH 連線問題

最近在存取遠端的 git repository
突然遇到 ssh 報錯
所以記錄一下

The authenticity of host 'www.ooo.com (xxx.xxx.xxx.xxx)' can't be established.  
ECDSA key fingerprint is SHA256:******************************************.  
Are you sure you want to continue connecting (yes/no)?

然後不管怎麼敲 yes 都沒有用
反正他就只會一直問同樣的問題而已 =口=

TL;DR

就結論來說
這篇沒有解決任何問題
因為我把之前備份的 ssh key 重新覆蓋之後問題就解決了
我都不知道我花那麼多時間在幹嘛了...(´・ω・`)



增加 ssh key 遇到的一些問題

本來只是想說增加個 private key 給他
結果就被說 too open 了 (´・ω`・)エッ?



所以就只好變更一下權限
把他們從 777 變成 600


然後就看起來沒問題了


突然發現 .ssh 的資料夾也很 open 的說...



所以也順便幫它改一下
把它從 775 變成 700

這篇就這樣了!!

2019年7月20日土曜日

在 Ubuntu 18.04 上安裝 pyenv

這篇主要是在講 python 的版本管理
前一陣子遇到了很多 python 2.x 跟 3.x 一直切換來切換去的問題
雖然手動一個一個慢慢換也是可以
不過就是麻煩
所以就只好來用一下現成的工具管理 python 了

TL;DR

在 terminal 裡面一行一行的敲完就會裝好囉ヾ(´∇`)ノ゙

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

$ source ~/.bash_profile



把 pyenv 抓回來

這裡的範例是在 ~/ 目錄下弄一個 .pyenv 目錄把它放進去
看情況可以自己隨便找個喜歡的位置放就好
基本上這樣就裝好了!!

$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv

環境變數的設定

基本上每次啟動都要敲一次環境變數很麻煩
所以這裡就直接找個地方寫進去
讓開機的時候可以自動執行
這樣就不用每次都手動慢慢敲了
至於環境變數要加在哪裡其實不是太重要的事
要寫在 ~/.bash_profile 還是 ~/.bashrc 或其他地方都可以
反正只要開機執行的到就可以啦
這裡用 bash_profile 當例子
在 terminal 敲下面這幾行
~/.bash_profile 裡面就會多出這些東西了

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

或是你喜歡自己用 editor 把文件打開來寫
又或是你喜歡單次在 terminal 敲也是可以的

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

最後就是把剛剛寫進去的檔案 reload 一次讓它生效

$ source ~/.bash_profile

大概就是這樣了




沒事來湊一下篇幅順便紀錄一下東西
講一下 pyenv 和 virtualenv 和 pyenv-virtualenv 的關係

pyenv

用來管理 python 的版本的東西
簡單來說就是可以用來切換各種不同版本的 python
假設電腦裡同時存在 2.6, 2.7, 3.5, 3.6, 3.7 的版本
它就可以在這些不同的版本中進行切換
而且可以指定特定資料夾使用特定的版本

virtualenv

用來管理 package 的版本的東西
它不會管你的 python 到底是哪個版本
它只在意它底下的 package 是哪個版本而已

pyenv-virtualenv

這個就是把 virtualenv 當作外掛
然後綁在 pyenv 上的東西
簡單來說就是上面兩個的相加就是了
所以這個可以管理 python 版本也可以管理 package 的版本

用 pyenv 切換 python 版本

local 是用來切換當前路徑底下的版本
global 是反映整台電腦的版本

$ pyenv local 2.7.10
$ pyenv global 3.5.0

這篇就這樣沒了(´∀`)ノシ

2019年5月27日月曜日

[Deep Learning] 用 RTX2070 跑 tensorflow-gpu


網路上找了一堆 solution 結果都沒有能用的
最後找到了一個可以成功的
所以記錄一下

原本用 CPU 跑都沒事,但是換成 GPU 之後就一直出現這個錯誤
看了半天感覺是版本的問題
試了半天結果都沒什麼效果
















後來找到了下面這篇
[RTX2080でTensorflow-gpu]
http://blog.abars.biz/archives/52458625.html

裡面有提到
去下面這個地方抓人家打包好的檔案來用
https://github.com/fo40225/tensorflow-windows-wheel

CUDA Toolkit:
RTX 20 系列基本上可以用 cuda v10 以上的版本

cuDNN:
根據上面選的 whl 檔來決定要裝哪個版本就好
這個相對沒影響

2019年4月15日月曜日

Visual Studio 版本跟 VC 版本的關係

##memo用


_MSC_VER 跟 VC++ version 的關係

VC4~VC12
計算公式 (VC++ version + 6)×100
e.g. VC12: (12 + 6)×100 = 1800

VC14~
計算公式 (VC++ version + 5)×100
e.g. VC14: (14 + 5)×100 = 1900


_MSC_VERと_MSC_FULL_VERをまとめる
https://qiita.com/yumetodo/items/8c112fca0a8e6b47072d#visual-studio%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A8%E5%88%A4%E5%88%A5%E3%83%9E%E3%82%AF%E3%83%AD

2019年4月1日月曜日

[Linux] 用 git 把 Linux Kernel 的 source code 抓下來的方法

抓 kernel source 最簡單的方法當然就是直接到官網 → kernel.org

然後把 source code 以 tarball 的方式抓下來






















不過這次要講的不是這個方法

這次要講的是用 git 把它從遠端 repo 給抓回來的方法

在 kernel 的 repo 中有多到不行的東西




















不過我們這次只是要抓穩定版的 kernel source

所以直接往下找到 stable 的地方





















這個 repo 就是我們要的東西了

所以把它給抓回來

向下面這樣

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git








抓完就會在資料夾裡面看到完整的 kernel source code 了















是說測試完發現

git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

好像會自動導向

git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git


所以不管是哪個好像都可以的樣子

大概就是這樣了




2019年3月20日水曜日

[docker]在 Ubuntu 18.04 下安裝和使用 docker

首先 Ubuntu 官方的 repo 中所提供的 docker 並不一定是最新的。

所以改從 Docker 官方的 repo 來安裝。

先更新 package list

sudo apt update


然後安裝必要的 package

而且這些 package 必須要可以通過 HTTPS

sudo apt install apt-transport-https ca-certificates curl software-properties-common


接著將 docker 官方 repo 的 key 加到系統中

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -


把 docker 的 repo 加到 apt source 裡

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"



然後再更新一次 package list

sudo apt update


為了確保我們安裝的是 docker 官方的版本

而不是 ubuntu 所提供的版本

這時候可以先用 apt-cache policy 檢查一下優先性

apt-cache policy docker-ce


然後就是安裝docker 了

sudo apt install docker-ce


安裝完之後

沒意外的話 docker 應該就會自己活著了

這時候可以用 systemctl 確認 docker 的狀態

sudo systemctl status docker



到這邊基本上 docker 的安裝就算完成了。

接下來就是執行的部份了

先抓個 ubuntu 映像檔回來

從 docker 的 repo 中搜尋 ubuntu

docker serach ubuntu


當然不要 ubuntu 的話也可以考慮裝其他的

不過我偷懶只想裝 ubuntu

所以我只抓 ubuntu 下來

抓下來的指令就一行

docker pull ubuntu


然後就可以啟動它了

docker run -it ubuntu


最後要保存 docker 的狀態的話

先用下面的指令查看一下它的版本號

docker ps -l


上面這個指令可以幫助你取得 ID

然後就可以使用下面的指令把變動 commit 上去了

docker commit [ID] [CONTAINER] [REPOSITORY[:TAG]]

一個使用實例大概看起來像這樣

docker commit XXX any-name/ubuntu



這篇大概就這樣了



2019年3月16日土曜日

[Android Studio] windows 上的 AS 3.x 的 NDK 不支援 mips 的問題


這次遇到的問題是在 Android Studio 的環境設定時

出現了下面這個錯誤訊息

No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android 


然後找了一些網路上的資料

大部分都是說從官網把 NDK 抓下來

再把缺少的部分加進去就可以了

可是實際上 NDK 從 R18 開始就不支援 mips 了

所以除非抓舊版的

不然再怎麼抓也不會有 toolchain 可以用

所以只好換個方法

看起來直接建立連結是個好方法

不過找了半天都是教 Linux 底下怎麼建連結

所以這篇用來幫自己記錄一下 Windows 底下怎麼建連結

首先從 [File]→[Project Structure] 中找到 NDK 的安裝路徑






然後用 CMD 敲個 mklink 建立連結













mklink /D mips64el-linux-android aarch64-linux-android-4.9
mklink /D mipsel-linux-android arm-linux-android-4.9

建完之後看看 folder 底下就會多出 2 個像捷徑的資料夾了



















大致上就是這樣了