SivanLaai / rime-pure

【rime 小狼毫\trime 同文】手机/PC一站式配置【简约皮肤\拼音搜狗词库\原创trime同文 四叶草 九宫格 拼音方案\四叶草拼音\四叶草地球拼音\小鹤双拼\极品五笔\QQ五笔\徐码\郑码】
http://blog.laais.cn/posts/projects/rime/info/
MIT License
918 stars 88 forks source link

[Latest][四叶草九宫格][构建 apk 成功但九宫格无法正常使用] #117

Closed clsty closed 8 months ago

clsty commented 9 months ago

在 #115 中, @SivanLaai 提到:

或者是下载3.2.9的同文试试最新的压缩包,后期准备打包一个apk出来,目前没啥时间

关于打包 apk,由于安卓目前似乎完全没有哪个开源输入法能够提供开箱即用的九宫格拼音,因此我正好也在尝试同样的事。

apk 倒是成功构建了,但是在我的设备上(安卓 12)四叶草九宫格很奇怪,键盘布局始终是 qwerty,并且按字母不出字,按最上面那一排数字反而出字。 怀疑是版本问题——总之有点超出我的能力范围了。

构建

我已经帮你把构建的坑都踩遍了 QAQ,希望你能实现最关键的部分——让打包好的 apk 在输入方案(尤其是九宫格)部署后能正常使用。

以下采用 Arch Linux 的 docker 容器作为构建环境以适应不同的系统。

在宿主机中,获取 trime 仓库。

git clone https://github.com/osfans/trime
cd trime

如果需要回退到历史版本,可以用 git log 查看 commit ID,再用 git checkout <commit ID>git revert <commit ID>git reset --hard <commit ID>

比如,要回退到 3.2.9 版本,可使用 git checkout cb4ab6928df35996027ae71d2de72ca89b66a876

拉取子模块(如果是 3.2.9 版本,这步会花费很长时间):

git submodule update --init --recursive

运行 Arch Linux 容器(会自动拉取镜像)。 这里用 -v 来映射当前目录到容器内的 /trime,如果你已经 cd 到别的目录了,那么请自行修改。

sudo docker run \
  -v $(pwd):/trime \
  -dt --restart=unless-stopped \
  --name arch \
  ghcr.io/archlinux/archlinux:latest

进入容器的 shell:

sudo docker exec -it arch /bin/bash

下面配置基本环境。

# 配置时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 由于没有 vi/vim/nano 等编辑器,下面直接用命令替换镜像源。
echo 'Server = https://mirrors.cernet.edu.cn/archlinux/$repo/os/$arch' >/etc/pacman.d/mirrorlist

# 添加 archlinuxcn 源(以便安装 android-ndk 和 android-sdk)
echo '
[archlinuxcn]
Server = https://repo.archlinuxcn.org/$arch' >> /etc/pacman.conf

# 更新 pacman 数据库,安装基本软件
pacman -Syu --noconfirm vim git base-devel clang cmake axel

# 导入 archlinucn 的密钥(见 https://www.archlinuxcn.org/archlinuxcn-keyring-manually-trust-farseerfc-key/ )
pacman-key --init
pacman-key --lsign-key "farseerfc@archlinux.org"
pacman -S --noconfirm archlinuxcn-keyring

# 配置 android 构建环境
pacman -S --noconfirm android-sdk android-ndk android-platform android-tools jdk8-openjdk jdk17-openjdk jdk-openjdk python gradle
echo '
# 从 archlinuxcn 安装的 android-sdk 并不位于 /usr/lib/android-sdk
export ANDROID_HOME=/opt/android-sdk
# 防止 sdkmanager --licenses 报错
export JAVA_HOME=/usr/lib/jvm/java-21-openjdk
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools' >> /etc/profile
echo "source /etc/profile" >> ~/.bashrc
source ~/.bashrc

下面这步要手动选 "y",不能一路回车。

# 指定 jdk8,防止 sdkmanager --licenses 报错
env JAVA_HOME=/usr/lib/jvm/java-8-openjdk sdkmanager --licenses

继续:

# 防止后面构建时报错“Process 'command 'git'' finished with non-zero exit value 1”
git config --global --add safe.directory /trime
git config --global user.name "archer"
# gradle 换源(注意修改目标是被映射的 trime 仓库中的文件)
sed -i 's/services.gradle.org\/distributions\//mirrors.cloud.tencent.com\/gradle\//g' \
  /trime/gradle/wrapper/gradle-wrapper.properties

以下给 gradle-maven 换镜像源是玄学概率最大的,总是在这里报错。 如果网络条件良好,那就别换镜像源了。 下面这个是对于目前最新版的 Trime 仓库测试通过的,未来或历史版本可能都会出问题。

# 下面这段参见 https://github.com/china-speed/china-speed.github.io#gradle-maven
mkdir -p ~/.gradle
cat > ~/.gradle/init.gradle << \EOF
def repoConfig = {
    all { ArtifactRepository repo ->
        if (repo instanceof MavenArtifactRepository) {
            def url = repo.url.toString()
            if (url.contains('repo1.maven.org/maven2')
                || url.contains('repo.maven.apache.org/maven2')
                || url.contains('jcenter.bintray.com')
                || url.contains('maven.google.com')
                || url.contains('plugins.gradle.org/m2')
                || url.contains('repo.spring.io/libs-milestone')
                || url.contains('repo.spring.io/plugins-release')
                || url.contains('repo.grails.org/grails/core')
                || url.contains('repository.apache.org/snapshots')
            ) {
                println "gradle init: [buildscript.repositories] (${repo.name}: ${repo.url}) removed"
                remove repo
            }
        }
    }

    // 腾讯云 maven 镜像聚合了:central、jcenter、google、gradle-plugin
    maven { url 'https://mirrors.cloud.tencent.com/nexus/repository/maven-public/' }
    // 阿里云 https://developer.aliyun.com/mvn/guide
    maven { url 'https://maven.aliyun.com/repository/central' }
    maven { url 'https://maven.aliyun.com/repository/jcenter' }
    maven { url 'https://maven.aliyun.com/repository/google' }
    maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
    maven { url 'https://maven.aliyun.com/repository/spring' }
    maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
    maven { url 'https://maven.aliyun.com/repository/grails-core' }
    maven { url 'https://maven.aliyun.com/repository/apache-snapshots' }
}

allprojects {
    buildscript {
        repositories repoConfig
    }

    repositories repoConfig
}
EOF
# 下面这段参见 https://stackoverflow.com/a/71186329
# 对于 3.2.9 那时候的旧版本是不需要的
sed -i 's/repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)/repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)/' /trime/settings.gradle.kts

对于 3.2.9 版本,额外需要以下步骤:

echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk" >> ~/.bashrc
source ~/.bashrc
pacman -S --noconfirm ninja
env JAVA_HOME=/usr/lib/jvm/java-8-openjdk sdkmanager 'cmake;3.22.1'
cd /trime
# 安装 capnp
sh ./script/dependency.sh
cd /trime

最后:

# 防止报错找不到 android-sdk(即使前面已经声明了环境变量)
echo 'sdk.dir=/opt/android-sdk' >> /trime/local.properties

# 退出容器
exit

到这一步,容器环境就准备完毕了。建议备份一下(可选)。

sudo docker commit arch arch/trime:v0.1
# 列出镜像
sudo docker images

现在就可以在容器外直接调用内部的命令来进行构建了。

但是先别急,因为目标是把输入方案与 apk 一起打包。 所以还要手动覆盖 trime 仓库下的 app/src/main/assets/rime

完成之后,再进入容器(以便调用 .bashrc,进而确保环境变量正确):

sudo docker exec -it -w /trime arch /bin/bash

用以下命令来构建:

make debug

如果报错如下(实际查看发现目标文件大小为 0B,应该是网络问题):

  CMake Error at cmake/Boost.cmake:5 (file):
    file DOWNLOAD HASH mismatch

      for file: [boost-1.84.0.tar.xz]
        expected hash: [2e64e5d79a738d0fa6fb546c6e5c2bd28f88d268a2a080546f74e5ff98f29d0e]
          actual hash: [e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855]
               status: [28;"Timeout was reached"]

则从 https://github.com/boostorg/boost/releases 手动下载所需文件到 app/ 下:

cd /trime/app
rm boost-1.84.0.tar.xz
axel https://github.com/boostorg/boost/releases/download/boost-1.84.0/boost-1.84.0.tar.xz
cd /trime

然后再次构建:

make debug

成功构建之后,apk 将被输出到 app/build/outputs/apk/debug

注意,如果修改了部分文件之后要再次构建,可能需要先清理一下:

make clean

Docker 的映射有点怪,有时外面的文件已经改了,映射到容器内的对应文件还是没变。 不过可能仅限于在宿主机使用 vim 编辑文件的情况,见 https://cloud.tencent.com/developer/article/1626578

以上得到的是调试版本;如果直接 make 则会得到正式版(输出到 app/build/outputs/apk/release/ 下),但是需要配置签名(见 Trime 官方仓库的说明),否则无法在大多数设备上安装。

Fin

水平所限,我只能帮你到这了,加油,祝好运!

clsty commented 9 months ago

我暂时在这里放个链接,是我自己测试打包的含 rime-pure 的 Trime 的 apk.

https://alist.celestialy.top/ 密码:clsty

“暂时”:后续可能删掉,而且我前面说了,它的四叶草九宫格方案在我的设备上运行不正常。

clsty commented 9 months ago

又了解了一下,本项目似乎针对3.2.9版本的 Trime。

以下尝试回退到“bump到3.2.10”(实质上的3.2.9)的这个commit

不过如果此项目的九宫格能适配最新版 Trime 就更好了。 以下尝试也是希望不大,毕竟此项目依赖很多 submodule 也就是别的仓库,而这些 submodule 很多也有更新,总不至于每个 submodule 都要回退到那个时候吧,似乎没有办法做到这种批量操作。

尝试记录

点击展开 报错: ```plain sed: can't read /trime/settings.gradle.kts: No such file or directory ``` 目录下面倒是有个 `build.gradle` 和 `settings.gradle`。 也就是说,以下命令不再有用(也没什么坏处)。 ```bash sed -i 's/repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)/repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)/' /trime/settings.gradle.kts ``` 报错: ```plain CMake '3.22.1' was not found in SDK, PATH, or by cmake.dir property. ``` 于是 ```bash mkdir /cmake cd /cmake axel https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.tar.gz tar -zxf cmake-3.22.1-linux-x86_64.tar.gz ls cd /trime echo "cmake.dir=/cmake/cmake-3.22.1-linux-x86_64">>local.properties ``` 报错: ```plain Could not find Ninja on PATH or in SDK CMake bin folders. ``` 于是: ```bash pacman -S ninja ``` 报错: ```plain * What went wrong: Execution failed for task ':app:configureCMakeDebug[arm64-v8a]'. [CXX1405] error when building with cmake using /trime/app/src/main/jni/CMakeLists.txt: Build command failed. Error while executing process /cmake/cmake-3.22.1-linux-x86_64/bin/cmake with arguments {-H/trime/app/src/main/jni -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=21 -DANDROID_PLATFORM=android-21 -DANDROID_ABI=arm64-v8a -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DANDROID_NDK=/opt/android-sdk/ndk/24.0.8215888 -DCMAKE_ANDROID_NDK=/opt/android-sdk/ndk/24.0.8215888 -DCMAKE_TOOLCHAIN_FILE=/opt/android-sdk/ndk/24.0.8215888/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=/usr/sbin/ninja -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/trime/app/build/intermediates/cxx/Debug/1g2s5454/obj/arm64-v8a -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/trime/app/build/intermediates/cxx/Debug/1g2s5454/obj/arm64-v8a -DCMAKE_BUILD_TYPE=Debug -B/trime/app/.cxx/Debug/1g2s5454/arm64-v8a -GNinja} -- Android: Targeting API '21' with architecture 'arm64', ABI 'arm64-v8a', and processor 'aarch64' -- Android: Selected unified Clang toolchain -- The C compiler identification is Clang 14.0.1 -- The CXX compiler identification is Clang 14.0.1 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /opt/android-sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/clang - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /opt/android-sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring incomplete, errors occurred! See also "/trime/app/.cxx/Debug/1g2s5454/arm64-v8a/CMakeFiles/CMakeOutput.log". CMake Error at CMakeLists.txt:22 (add_subdirectory): The source directory /trime/app/src/main/jni/boost does not contain a CMakeLists.txt file. CMake Error at CMakeLists.txt:26 (add_subdirectory): The source directory /trime/app/src/main/jni/capnproto does not contain a CMakeLists.txt file. CMake Error at CMakeLists.txt:35 (add_subdirectory): add_subdirectory given source "librime/deps/yaml-cpp" which is not an existing directory. ``` 考虑到它可能是要 sdk 里面的 cmake 而不是手动下载的,于是: ```bash env JAVA_HOME=/usr/lib/jvm/java-8-openjdk sdkmanager 'cmake;3.22.1' rm /trime/local.properties ``` 然后又编译了一会,报错不变。 新发现:当时版本的 README 也与现在不同,构建方法也不同。 应当先用指定脚本安装 capnp 等等。

已成功。方法已同步至一楼。

但是它在我的设备上仍然部署失败。这次甚至看不到键盘。

clsty commented 9 months ago

由于 https://github.com/osfans/trime/pull/1179 ,最新版的编译要求不再仅是 jdk17-openjdk,也可用 jdk-openjdk(即 jdk21)。

clsty commented 9 months ago

@SivanLaai 在此说明,本项目的正常部署方式我也已经尝试,同样无法正常使用,所以不见得是打包的问题,而应该是 Trime 与设备适应性的问题。

我前面放的链接里有新版和旧版(3.2.9),有空的话可试试。

SivanLaai commented 8 months ago

感谢分享。很难得有自己钻研的同学,同时把自己的经验分享出来。

其实我已经编译成功了,现在是还没有把文件替换进去,只是还没时间去配置和适配,所以感谢你的工作和时间付出。

你编译的3.2.9的apk,我下来试试看能不能用。安卓12我之前有同学反馈是可以用的,这个问题目前,比较疑惑。

你手机系统先安装3.2.9的同文在配置这个方案能用吗?

另外我把这个issue放到讨论区可能合适一些,看看有没有其他同学一起讨论。