tl; dr:包装和运输没有Trojan的应用程序,无需任何Android开发知识即可在F-Droid中控制我的灯。
我有政治立场,在很多方面我都支持Stallman,因此我是FOSS的支持者。通常情况下,这种姿势还伴有轻度妄想症。我尝试摆脱专有应用程序,特别是如果它们通过第三方服务器运行。
我还有小米Yeelight“智能”灯,它们由通过小米服务器运行的应用程序控制。但是它可以打开灯内部局域网内的API。为了放心,我一直在Github和Gitlab上寻找该应用程序,现在打算将其推广到F-Droid以支持我们的偏执狂社区。
建立并检查
为了使应用程序进入目录,它必须至少能够构建并以友好的方式工作。我的选择结果是微不足道的,并且在Gitlab上找不到一个应用程序。在可用的应用程序中,我只能收集两个,最后只有一个启动。我距离开发Android尚远,几天之内,我仅使用Gradle掌握了一个简单的程序集,我将对其进行进一步描述。
我们需要:git,Java运行时环境,Android SDK,Android调试桥和新鲜的Gradle。可以从package中安装用于Debian Testing的JRE,ADB和git
apt install git adb openjdk-11-jre-headless
。
Android SDK通常与Android Studio一起安装,但是我使用了sdkmanager控制台实用程序:
unzip commandlinetools-linux-6609375_latest.zip
export PATH=$PATH:$PWD/tools/bin/
mkdir android-sdk
export ANDROID_SDK_ROOT=$PWD/android-sdk/
如果您以为我错过了自己安装Android SDK的机会,那么您似乎就没有了。稍后再解释。Debian仓库包含一个烂版的Gradle,该版本不能使用,它也必须从站点安装:
wget https://services.gradle.org/distributions/gradle-6.6.1-bin.zip
unzip gradle-6.6.1-bin.zip
export PATH=$PATH:$PWD/gradle-6.6.1/bin/
我将存储库分叉给自己,并清理了自动生成的垃圾。一切都是这样的:
yes | sdkmanager --licenses --sdk_root=$ANDROID_SDK_ROOT
git clone https://github.com/asz/OpenLight.git
cd OpenLight/
gradle wrapper
./gradlew assemble
通过第一个命令,我们批量接受
sdkmanager
非交互式安装所需的所有许可条款。自动生成包装器(gradle wrapper
)时,Gradle将解析并安装所有必需的依赖项。可以通过help下载所需版本的Android SDK,组装工具包和其他特定于Android的依赖项sdkmanager
,因此无需手动执行此操作,并且必须事先接受许可。
现在是时候在官方应用程序中启用API了。打开您的智能手机的USB调试,将其连接到计算机并安装生成的调试包:
adb install app/build/outputs/apk/debug/app-debug.apk
。切记在手机的弹出窗口中从计算机启用调试。如果电话上的应用程序显示有生命迹象,则可以继续。
在F-Droid中准备补丁
F-Droid具有对应用程序进行分类的规则。基础非常简单:不应标记非自由构建依赖项,隐私问题以及应用程序本身的任何非自由依赖项。我自己没有检查依赖项,因为F-Droid有一个CI和它自己的构建系统,这使您可以简单地通过管道运行提交。
现在,我们去开发F-Droid的GitLab。首先,请确保检查没有人正在处理您的应用程序。这种活动集中在打包请求和合并请求中。分叉数据存储库,然后从您的个人资料中克隆它。
一个YML文件足以使应用程序出现在F-Droid中。在
metadata/
存储库的子目录中找到任何合适的YML文件,并以相同的格式进行复制applicationId.yml
。applicationId
您的应用程序的值可以从build.gradle
它自己的某些存储库中获得,在我的情况下,可以从中获得app/build.gradle
。我不记得我参考了哪个文件,我只会显示最终文件metadata/grmasa.com.open_light.yml
:
我很难选择特定的AntiFeature,但是并不需要详细的准确性。适用于设备配套应用的类别。密钥描述了从哪个提交/标签构建应用程序。也可以在中找到。如果您不想手动更新应用程序,则可以填写
AntiFeatures:
- NonFreeDep
Categories:
- Connectivity
License: GPL-2.0-or-later
AuthorWebSite: https://github.com/grmasa
SourceCode: https://github.com/grmasa/Open_light
IssueTracker: https://github.com/grmasa/Open_light/issues
Changelog: https://github.com/grmasa/Open_light/tags
AutoName: Open Light
Summary: Control Xiaomi Yeelight WiFi smart bulbs
Description: |-
Control Xiaomi Yeelight smart bulbs within your Local Area Network.
Only fits WiFi controlled bulbs.
This app requires enabled LAN control for bulbs: open the official app, set up
all the bulbs, go to LAN control in the menu, and enable it for every device.
RepoType: git
Repo: https://github.com/grmasa/Open_light.git
Builds:
- versionName: 1.1.2
versionCode: 1
commit: v1.1.2
subdir: app
gradle:
- yes
AutoUpdateMode: Version v%v
UpdateCheckMode: Tags
CurrentVersion: 1.1.2
CurrentVersionCode: 1
NonFreeDep
Connectivity
Build
versionCode
build.gradle
UpdateCheckMode
和AutoUpdateMode
(v%v
描述标签的格式)。
对于基本文件检查,您需要F-Droid Server
fdroid
存储库中的实用程序,其依赖项和变量:ANDROID_HOME
git clone https://gitlab.com/fdroid/fdroidserver.git
export PATH=$PATH:$PWD/fdroidserver
apt -y install python3-git python3-pyasn1 python3-pyasn1-modules python3-yaml python3-requests
export ANDROID_HOME=$ANDROID_SDK_ROOT
您可以返回目录
fdroiddata
并检查元数据是否正常工作:
fdroid readmeta
fdroid lint grmasa.com.open_light
fdroid build -v -l grmasa.com.open_light
前两个命令检查语法,第三个命令构建应用程序。在出口处,你应该看到APK:
unsigned/grmasa.com.open_light_1.apk
。
以防万一,您可以运行它
fdroid checkupdates grmasa.com.open_light
来检查更新并fdroid rewritemeta grmasa.com.open_light
正确地用元数据填充文件,然后重新检查程序集。
快要结束了
现在,您可以提交并签出Gitlab CI管道。对我来说一切都结束了!
我填写了合并请求,并对其进行了检查,并要求将原始应用通知作者。如果作者忽略我超过两个星期,我将简单地将元数据中的链接重写到我的fork,然后它将被接受。
现在,我可以将我的特殊Trojan手机放到一边。我什至有机会以不正当的方式从Internet控制它们,甚至禁止与它们一起使用LAN!
不幸的是,标题中的插图有些道理。第二步在应用程序中发现一个令人不愉快的错误向导:从检测到的灯列表中,通常不会添加我选择的灯。因此,灯具在主要列表中。要解决此问题,我将灯逐个放置在应用程序中。希望有一天我能找出问题所在,或打包另一个应用程序。