From f036dba87ebde650a301a7f62d18cc12b8062674 Mon Sep 17 00:00:00 2001 From: yuler Date: Wed, 21 Oct 2026 17:58:39 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=F0=9F=94=84=20Sync=20Strava=20activities?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/strava/activities/20645483170.json | 38 +++++++++++++++++++++++++ data/strava/activities/_index.json | 3 +- data/strava/activities/_meta.json | 2 +- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 data/strava/activities/20645483170.json diff --git a/data/strava/activities/20645483170.json b/data/strava/activities/20645483170.json new file mode 100644 index 0000000..80e5bc0 --- /dev/null +++ b/data/strava/activities/20645483170.json @@ -0,0 +1,38 @@ +{ + "id": 20645483170, + "name": "Evening Ride", + "distance": 8077.7, + "moving_time": 2148, + "elapsed_time": 2401, + "total_elevation_gain": 15.7, + "type": "Ride", + "sport_type": "Ride", + "id_str": "20645483170", + "start_date": "2026-10-19T10:23:53Z", + "start_date_local": "2026-10-19T18:23:53Z", + "timezone": "(GMT+08:00) Asia/Shanghai", + "utc_offset": 28800, + "map": { + "id": "a20645483170", + "polyline": "w`|rFe_ieU?BB?@?B?@?@@@?@?@@@?@?@?B@??@?@?B@@?@???@?@?@?@A@?@?@?@?@A@?@???@?@@@??@?B?@?@@?@???@A???????????A@???BK@?@@@?@?@?@?@A@?@A@?@?@?@?@@@?@?@??BB???B?@???@?@E@@@?B?@?@A@?@?@?@?@?@?@@@A@@@?@?@A@@@?@?@@@A@@@?@A@?@?B?@?@?@?@@@?@?B?@?B??@B?@A??@?B?@ABA@@@?@???@AB??A@?@A?A@?@A@???BA@?@A@?@?@?@?@?@@B@@@@?@A?A@A@A@?@??AB?@@??@A@?@???@?@@????@???@?@@??@@????@?@?@?@?@?@???B?@?@?B??@?@?@@???@AB?@A@???@???@?B?BCB?BABA??@@@?@?B?@C@???B??A@@B?BAB@@?@?@A@@@?@@@?B???@?BAB?B@@?B@B@@@B@B@@?FBDB@E@??C?A?A?@AA?ABA@C???AB??A?@?C?A@A??????@@??NA@@?@@@@?B?D?BADAB?D?B?D?B?DAB?DAB?DABAD?B?D?D?D?B?D@B@BB?DAF?FA??F?FBR?F?D?F@F?F?F?F?L?F?F@D?F?F?FAD@FBB?DC@AJ@F?D?H?F@H?F?F?F?F@DAF@D?DB@B?B@D?B?BBD@BBD@B?D?BADAB?DAD?D?D?D?D?B?@CB?D?D?D?F?D?D?D?DAD?D@DAB?B?BAB@@?@@@?B@BA?A@??AA???@???@?@???@????@@?????????F@@@???A@@?A???????@@?DR@E?C?CJG??TL@?@A??@A??@A@??AB@??BA@A??@?@????@?@@A@????@B?@?@A@?B?B?B?B?B?B?@?B?B?@A??@?????B@@?@?BA@?@???@???@?B?@?D?B?@?@???????@?@AB@@A@?BB?B?D?F?D?F?D?H?F?F@F?F?FAF@F?F?HAF?F?F@J?F?H?H@H?F?F?H@F?F@H?D?J?H@F?H?F@F?H?F@H?F?H?FAH?F@HAH?H?F@J?F?H?H@F?J?H?F?J?F?HAHAH?HAJ@J@H?B@J@H@F@B@DDFFDHBF@F@F@j@PF@FAFCDAHAFAFAD?F?F?F?F?F?F?D@F?F?F@F?F?F?F?HAF?H?F?F?HAF?FAH?HCH?FAF?H?FAHAFAH?F?H@F?H?F?H?F@F?HAF?HAF@F@F?H?F?F?H?F?FAH?F@F?F?H@F?F@F?F?H@F?F@F?F?H?D?H?F?F?F?F?F?F?F?HAF?H?F?FAH?H?F?HAF?H?HAF?H?HAFAH?HAHAH?H?J?HAH?JAH?JAH?J?J@H?H?H?H?H?H@H?H@H?HBJ@H@HBF@HBFBHBDBD@D@D@DBFBDBBBBDDBB?D?BAB?B?BBDDD@D@DBFBDBDBDBFBDBD?F@D@F?D?F@D?F?F?D?F?F?F?F?F?F?F?F?D?F?F?F?F?FAD?F@D?D?BAB?DAB?BAD?DABADCFCDCDEDCDEDEDEDEFEDEDCFCDAFAF?FAD?F?FAF?D?F@FAD?F?F?F?FAF?F?FAFADCDCFGBEDIDGDIBIDIBIDIBI@IBIBI@IBGBCBADCFCDAFAFAH?F?H@H@F@H?H@H@J@H@J@H?HBH?H@n@PJCH?H?H?JBH@J@H@H@H@H@J@H@J@J?H@H@J@H@H@H@H?J@H@H@H@J@J?H?JAJAL?H?HAH?FAH@HAHAF?H?FAH?H@H?H?HBFBHBH@FBFBH@F?D?D@F@FBF@F@F@F?F@F@D?FAFBFDF?FBF@H?F@F@H?F@F?H@F@F@F@F?F@F@F?F@F?F@F?F?F?F?F?F?F@F@F@H?F@F@F?H@F@F@H@F@H?F@H?F@H@F?H?F?F?HAF?FAHAF?D?H?F?HADAF?D?DCFAF@F@FAH?HAFAH?FAH?FAHAFAFAH?F?HAF?F?H?F?H?F?F?FAHAFAF?FAHAF?FAFAF?HAFAFAF?HAF?H?FAF?HAF?FAF???x@GF@????N?RELAHAF?DAHAF?DAFAHAF?F?FAF?FAF?F?F?F?F?H?F?F?F?F?XIF?CJFCHAFAHAFAF@J?H?FCHAFAF?FAH?H?HAF?H@H?H?F@H?HAH?FAFAHAHCFAHCH?FAF?HAFAHAFAFAHAFAF@F?FAD?FCHCFAFAFAH?FAFAHAFAFAH?FAFAF@H?H?H?FAH?FAH?FAFAF?HAH?F?F?F?FAFAFADAF?HAH?FAF?FAF?H?H?F?F?F?F?B?DAB?DAD?D?B?D?DBDDDBDBD@D@DBBBFBD@FBF@F?F@F?F?D@H?F?F@F?F@FBF?FBF?F?F@F?DBF?F?F?F@F@H@F@F?F?H@F@F?F@H?F@F?H?F@F?HAH?F?F?H?F?F?HAJ?J?H@H?HAJ?F?HAH?HAH?F?H?F?F?F?FAHAF?FAF?F?FAH?F?HAFAH?FAHAF?H?F?H?HAFAF@HAFAH?FAD?F@F?F@DAFCDAF?F?FAD?F?FAF?HAF?DAF?FAF?H?F?FAD?F?FAF?DADAFAFAF?FAF?FAF@FAF?DAFAF?F?H@FAF?D?FAF?F?FAD?HAF?HAF?H?F?HAH?F@FAHAF?HAF?H?F?FAF@HAFAHAF?H?F?FAF?F?FAFBH@HCF?F?DAH?F?HAF?FAF@DAF?F?FAF?H?FAF?F?F?HAD?F?F?H?F?F@FAF?F?F?FAF?F?D?B@DBJEF?HCFAFAF?F?HAF?H?FAHAF?H?FAH?F?H?HAFAH@H?HAFAH?F?HAF?HAF?F?DBB@@DBD@F@F?F@FDHAL?H?H?H?J?J?H?H?J?J@HAJ?H?H?J?H?J@H@H?J?H@JAH?H?H?H?J?H?H?H?H@H?H?H?H?H?F?F?H?H?F?H@F?H?FAF?F?D?D?D@B?B@B?D?F?F@F@F@F@H@F@H?F?H?H?H?H?H?H?H@F?H@H?H@H?H?HAJ?H?H?HAH?H@H@JB\\D^AD@H?H@l@?PAH?JAH?H?HAH@J?FAH@F@F?F@F?D?H?J?J?H?JAHE^CD?J@HBHAF?H?FAFAD?@?B@BBBF?F?F?F?D@FAF@F?H@F?FAH?F?F?H?F?HAH@FAH?F?HAF?HAH?F?H?H?FAH?HAF?H?H@F?H?FAH@F?F?H?P?HAF?H?F?H?FAH?H?FAH?FAH?H?F?H?FAH?H?F?H?H?H?H?FAH@H?FBFD??h@DDAFA????VE@?B?D@D?D?D?B?FAFCDAHAF?FAF?D?FAH?FAF?F?F@J?F?N@TGF@D?D?FBJCJAH?F?H?H?H?H?H?FAH?F?D?H?FAF?F?F?F?F@F@F@F?F?F?F@F?D?F?FAH?HAF?H?F?D?H?F?HAF?F?HAH?F?F?D?F?F?F?D@D?FADAF?D?F?BA@?D?B?D?D@B?B@@AD?B?B@D?B?@?D?B?D?D?D@D?D?F?B@D@F?D?D?D?F?F?F?F?D@F?DAD@D?D?BAJ@D?HAF@D@H?D?D@F@D?F?HADADCDBF?H?HAFBF?F?F?FAHAF?HAF?FCF?JAF?FAHAF?FAFCHAH?F?HAHAH?FAH@FAHAH?H?H?FAF?HAHAFAF?HAF?D@F@D@DFF@D?BE@CBCFCD?D@D?F?F?D@F?F?FADAH@F?H?F?H?H?H?F?H@F?H?F?F@H?F@FAH?F?FAH?HAF?H?FAFAF?DAF@F?F?F?F?F?F@F?FAF?F?H?FAH?F?F?H?F?F@FBD@F?DAF?D?DAD?B?B@D@D?D?F?F?F?VCD?F@F?D?F?F?DAF?D?D?D?F?DAD?D?D?D?FAD?D?D?D?B???@?????????????@?@AB?B?B?B?D?B?D?D?BAD?D?B?B?D?D?D?D@D?D@D@D?D?D?DAD?DAD?DADAD?FADAFAF?D?F?FAF?DAF?D?F?D@F?D?F?DAFAD?FAF?F?F?FAH?FAF?F?F?H?F?H?FAF@HAF?H?F?H@F@H?F?F?FAH?F@D@F@D@F@F?FAF?F?F@F?F?FAF?FAF@FAF?F?F?F?F?FAF?F?FAF?F?DAF?F@F?F?FAf@EHAF?F?D@B@D?F?F?F?F@F?F?F?H?F?F?FAFAFAFCF?DAFAD?H?F?H?FAF?H?FAF?F?H?DCH@H?F?H?FAH@F?F?H@F?FAH@HBF?H?F@F?F?DAH@H?HAF?D?H?DAD?D?F?D?F@F?D@FAF@DCFAF?D?F?FBD@D@D@B?DA@A?CA?????????@AA@?A???@E@@@EBA@?@?@AB", + "summary_polyline": "w`|rFe_ieU?BB?@?B?@?@@@?@?@@@?@?@?B@??@?@?B@@?@???@?@?@?@A@?@?@?@?@A@?@???@?@@@??@?B?@?@@?@???@A???????????A@???BK@?@@@?@?@?@?@A@?@A@?@?@?@?@@@?@?@??BB???B?@???@?@E@@@?B?@?@A@?@?@?@?@?@?@@@A@@@?@?@A@@@?@?@@@A@@@?@A@?@?B?@?@?@?@@@?@?B?@?B??@B?@A??@?B?@ABA@@@?@???@AB??A@?@A?A@?@A@???BA@?@A@?@?@?@?@?@@B@@@@?@A?A@A@A@?@??AB?@@??@A@?@???@?@@????@???@?@@??@@????@?@?@?@?@?@???B?@?@?B??@?@?@@???@AB?@A@???@???@?B?BCB?BABA??@@@?@?B?@C@???B??A@@B?BAB@@?@?@A@@@?@@@?B???@?BAB?B@@?B@B@@@B@B@@?FBDB@E@??C?A?A?@AA?ABA@C???AB??A?@?C?A@A??????@@??NA@@?@@@@?B?D?BADAB?D?B?D?B?DAB?DAB?DABAD?B?D?D?D?B?D@B@BB?DAF?FA??F?FBR?F?D?F@F?F?F?F?L?F?F@D?F?F?FAD@FBB?DC@AJ@F?D?H?F@H?F?F?F?F@DAF@D?DB@B?B@D?B?BBD@BBD@B?D?BADAB?DAD?D?D?D?D?B?@CB?D?D?D?F?D?D?D?DAD?D@DAB?B?BAB@@?@@@?B@BA?A@??AA???@???@?@???@????@@?????????F@@@???A@@?A???????@@?DR@E?C?CJG??TL@?@A??@A??@A@??AB@??BA@A??@?@????@?@@A@????@B?@?@A@?B?B?B?B?B?B?@?B?B?@A??@?????B@@?@?BA@?@???@???@?B?@?D?B?@?@???????@?@AB@@A@?BB?B?D?F?D?F?D?H?F?F@F?F?FAF@F?F?HAF?F?F@J?F?H?H@H?F?F?H@F?F@H?D?J?H@F?H?F@F?H?F@H?F?H?FAH?F@HAH?H?F@J?F?H?H@F?J?H?F?J?F?HAHAH?HAJ@J@H?B@J@H@F@B@DDFFDHBF@F@F@j@PF@FAFCDAHAFAFAD?F?F?F?F?F?F?D@F?F?F@F?F?F?F?HAF?H?F?F?HAF?FAH?HCH?FAF?H?FAHAFAH?F?H@F?H?F?H?F@F?HAF?HAF@F@F?H?F?F?H?F?FAH?F@F?F?H@F?F@F?F?H@F?F@F?F?H?D?H?F?F?F?F?F?F?F?HAF?H?F?FAH?H?F?HAF?H?HAF?H?HAFAH?HAHAH?H?J?HAH?JAH?JAH?J?J@H?H?H?H?H?H@H?H@H?HBJ@H@HBF@HBFBHBDBD@D@D@DBFBDBBBBDDBB?D?BAB?B?BBDDD@D@DBFBDBDBDBFBDBD?F@D@F?D?F@D?F?F?D?F?F?F?F?F?F?F?F?D?F?F?F?F?FAD?F@D?D?BAB?DAB?BAD?DABADCFCDCDEDCDEDEDEDEFEDEDCFCDAFAF?FAD?F?FAF?D?F@FAD?F?F?F?FAF?F?FAFADCDCFGBEDIDGDIBIDIBIDIBI@IBIBI@IBGBCBADCFCDAFAFAH?F?H@H@F@H?H@H@J@H@J@H?HBH?H@n@PJCH?H?H?JBH@J@H@H@H@H@J@H@J@J?H@H@J@H@H@H@H?J@H@H@H@J@J?H?JAJAL?H?HAH?FAH@HAHAF?H?FAH?H@H?H?HBFBHBH@FBFBH@F?D?D@F@FBF@F@F@F?F@F@D?FAFBFDF?FBF@H?F@F@H?F@F?H@F@F@F@F?F@F@F?F@F?F@F?F?F?F?F?F?F@F@F@H?F@F@F?H@F@F@H@F@H?F@H?F@H@F?H?F?F?HAF?FAHAF?D?H?F?HADAF?D?DCFAF@F@FAH?HAFAH?FAH?FAHAFAFAH?F?HAF?F?H?F?H?F?F?FAHAFAF?FAHAF?FAFAF?HAFAFAF?HAF?H?FAF?HAF?FAF???x@GF@????N?RELAHAF?DAHAF?DAFAHAF?F?FAF?FAF?F?F?F?F?H?F?F?F?F?XIF?CJFCHAFAHAFAF@J?H?FCHAFAF?FAH?H?HAF?H@H?H?F@H?HAH?FAFAHAHCFAHCH?FAF?HAFAHAFAFAHAFAF@F?FAD?FCHCFAFAFAH?FAFAHAFAFAH?FAFAF@H?H?H?FAH?FAH?FAFAF?HAH?F?F?F?FAFAFADAF?HAH?FAF?FAF?H?H?F?F?F?F?B?DAB?DAD?D?B?D?DBDDDBDBD@D@DBBBFBD@FBF@F?F@F?F?D@H?F?F@F?F@FBF?FBF?F?F@F?DBF?F?F?F@F@H@F@F?F?H@F@F?F@H?F@F?H?F@F?HAH?F?F?H?F?F?HAJ?J?H@H?HAJ?F?HAH?HAH?F?H?F?F?F?FAHAF?FAF?F?FAH?F?HAFAH?FAHAF?H?F?H?HAFAF@HAFAH?FAD?F@F?F@DAFCDAF?F?FAD?F?FAF?HAF?DAF?FAF?H?F?FAD?F?FAF?DADAFAFAF?FAF?FAF@FAF?DAFAF?F?H@FAF?D?FAF?F?FAD?HAF?HAF?H?F?HAH?F@FAHAF?HAF?H?F?FAF@HAFAHAF?H?F?FAF?F?FAFBH@HCF?F?DAH?F?HAF?FAF@DAF?F?FAF?H?FAF?F?F?HAD?F?F?H?F?F@FAF?F?F?FAF?F?D?B@DBJEF?HCFAFAF?F?HAF?H?FAHAF?H?FAH?F?H?HAFAH@H?HAFAH?F?HAF?HAF?F?DBB@@DBD@F@F?F@FDHAL?H?H?H?J?J?H?H?J?J@HAJ?H?H?J?H?J@H@H?J?H@JAH?H?H?H?J?H?H?H?H@H?H?H?H?H?F?F?H?H?F?H@F?H?FAF?F?D?D?D@B?B@B?D?F?F@F@F@F@H@F@H?F?H?H?H?H?H?H?H@F?H@H?H@H?H?HAJ?H?H?HAH?H@H@JB\\D^AD@H?H@l@?PAH?JAH?H?HAH@J?FAH@F@F?F@F?D?H?J?J?H?JAHE^CD?J@HBHAF?H?FAFAD?@?B@BBBF?F?F?F?D@FAF@F?H@F?FAH?F?F?H?F?HAH@FAH?F?HAF?HAH?F?H?H?FAH?HAF?H?H@F?H?FAH@F?F?H?P?HAF?H?F?H?FAH?H?FAH?FAH?H?F?H?FAH?H?F?H?H?H?H?FAH@H?FBFD??h@DDAFA????VE@?B?D@D?D?D?B?FAFCDAHAF?FAF?D?FAH?FAF?F?F@J?F?N@TGF@D?D?FBJCJAH?F?H?H?H?H?H?FAH?F?D?H?FAF?F?F?F?F@F@F@F?F?F?F@F?D?F?FAH?HAF?H?F?D?H?F?HAF?F?HAH?F?F?D?F?F?F?D@D?FADAF?D?F?BA@?D?B?D?D@B?B@@AD?B?B@D?B?@?D?B?D?D?D@D?D?F?B@D@F?D?D?D?F?F?F?F?D@F?DAD@D?D?BAJ@D?HAF@D@H?D?D@F@D?F?HADADCDBF?H?HAFBF?F?F?FAHAF?HAF?FCF?JAF?FAHAF?FAFCHAH?F?HAHAH?FAH@FAHAH?H?H?FAF?HAHAFAF?HAF?D@F@D@DFF@D?BE@CBCFCD?D@D?F?F?D@F?F?FADAH@F?H?F?H?H?H?F?H@F?H?F?F@H?F@FAH?F?FAH?HAF?H?FAFAF?DAF@F?F?F?F?F?F@F?FAF?F?H?FAH?F?F?H?F?F@FBD@F?DAF?D?DAD?B?B@D@D?D?F?F?F?VCD?F@F?D?F?F?DAF?D?D?D?F?DAD?D?D?D?FAD?D?D?D?B???@?????????????@?@AB?B?B?B?D?B?D?D?BAD?D?B?B?D?D?D?D@D?D@D@D?D?D?DAD?DAD?DADAD?FADAFAF?D?F?FAF?DAF?D?F?D@F?D?F?DAFAD?FAF?F?F?FAH?FAF?F?F?H?F?H?FAF@HAF?H?F?H@F@H?F?F?FAH?F@D@F@D@F@F?FAF?F?F@F?F?FAF?FAF@FAF?F?F?F?F?FAF?F?FAF?F?DAF?F@F?F?FAf@EHAF?F?D@B@D?F?F?F?F@F?F?F?H?F?F?FAFAFAFCF?DAFAD?H?F?H?FAF?H?FAF?F?H?DCH@H?F?H?FAH@F?F?H@F?FAH@HBF?H?F@F?F?DAH@H?HAF?D?H?DAD?D?F?D?F@F?D@FAF@DCFAF?D?F?FBD@D@D@B?DA@A?CA?????????@AA@?A???@E@@@EBA@?@?@AB" + }, + "start_latlng": [ + 39.96188, + 116.377625 + ], + "end_latlng": [ + 39.899181, + 116.367708 + ], + "average_speed": 3.761, + "max_speed": 6.7, + "has_heartrate": true, + "average_heartrate": 120, + "max_heartrate": 139, + "elev_high": 56.1, + "elev_low": 50.7, + "description": null, + "calories": 0, + "device_name": "" +} diff --git a/data/strava/activities/_index.json b/data/strava/activities/_index.json index d20885d..0698f76 100644 --- a/data/strava/activities/_index.json +++ b/data/strava/activities/_index.json @@ -165,5 +165,6 @@ 20552135822, 20565699124, 20579892718, - 20606977967 + 20606977967, + 20645483170 ] diff --git a/data/strava/activities/_meta.json b/data/strava/activities/_meta.json index bd99103..d86ef69 100644 --- a/data/strava/activities/_meta.json +++ b/data/strava/activities/_meta.json @@ -1,3 +1,3 @@ { - "lastSync": 1792146309 + "lastSync": 1792405433 } From 4c85c816aa62d99a01f64f4d603cd8953a45c75f Mon Sep 17 00:00:00 2001 From: yuler Date: Wed, 21 Oct 2026 18:00:29 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=93=9D=20Add=20post=20on=20assigning?= =?UTF-8?q?=20homework=20to=20the=20Xunfei=20study=20pad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../posts/2026/assign-homework-to-studypad.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/content/posts/2026/assign-homework-to-studypad.md diff --git a/src/content/posts/2026/assign-homework-to-studypad.md b/src/content/posts/2026/assign-homework-to-studypad.md new file mode 100644 index 0000000..84225cd --- /dev/null +++ b/src/content/posts/2026/assign-homework-to-studypad.md @@ -0,0 +1,49 @@ +--- +title: '给讯飞学习机布置作业' +slug: 'assign-homework-to-studypad' +description: '通过 PC 布置作业。' +tags: ['安卓', '学习机', '讯飞学习机'] +date: 2026-10-21 +--- + +## 背景 + +老师布置作业,有时候是发到群里的。英语作业常常是一张图片,图里是要抄的单词和句子。孩子不知道这个具体的句子,他就需要这个图片去抄写。 + +家里有一台讯飞学习机。我之前的做法是把图片下载下来,打开学习机的 App,布置一条作业,把图传上去。一个星期大概三四次,不算难,就是麻烦。 + +后来就在想,能不能把这件事做成程序。 + +## 先确认:没有网页版 + +家长端包名是 `com.iflytek.aistudyclient.parentcontrol`。官网 `xxj.xunfei.cn` 是产品页,没有网页版。 + +既然没有网页入口,思路就是在我这台电脑上(Omarchy Linux)装一个 Android 模拟器。这样后续也可以在这上面跑一些其他的 App。 + +## Waydroid:包的链接有问题,装不上 + +一开始用的是 Waydroid。结果安装包的下载链接一直有问题,装不上。这条路先放下。 + +## 官方模拟器:脚本在,没起来 + +后来上了 Android 那套——Android Studio 用的 AVD,只是没走 IDE,直接用 Arch 的 SDK 包装。脚本在 `~/brain/setup-emulator.sh`。 + +`setup-emulator.sh` 装命令行工具、模拟器、`android-tools` 和 JDK 17,SDK 放在 `/opt/android-sdk`,再下载 Android 13 的 `google_apis` x86_64 镜像,创建一个叫 `xunfei` 的虚拟设备,4 GB 内存、4 核。`start-xunfei.sh` 负责每次启动、装 APK、拉起应用。 + +脚本一直在,但模拟器里讯飞 AI 学就是装不上,一直没起来。 + +仔细看了一下原因:这个 Android 13 `google_apis` x86_64 镜像的 `ro.product.cpu.abilist` 只有 `x86_64`,并没有脚本注释里以为的 ARM 翻译。讯飞 AI 学的安装包里只有 `arm64-v8a` 和 `armeabi-v7a`,没有 x86 的库。所以 `adb install` 直接报 `INSTALL_FAILED_NO_MATCHING_ABIS`。 + +也就是说,**脚本以为镜像自带 ARM 翻译,其实没有**。要跑 ARM 应用,得换一个真正带 arm64 翻译的镜像(Android 11/12 的 `google_apis` 镜像带)。 + +## REA:拆开安装包找接口 + +手动抓包要登录、要配代理,嫌麻烦。正好前两周 REA(Reverse Engineer Anything)火,直接把 APK 喂给它,让它找接口。 + +家长端是 Flutter 加梆梆加固壳,但壳只包了 Java 入口,接口都在没被加固的 `libapp.so` 里,静态拆包就能读到。 + +拆出来就三步:收验证码、登录、布置作业。学科、标题、说明,加上老师发来的那张图,一条命令发到学习机;图片支持本地文件和剪贴板。完整的逆向报告见 [REVERSE.md](https://github.com/yuler/scripts/blob/main/studypad/REVERSE.md),踩坑记录见 [POSTMORTEM.md](https://github.com/yuler/scripts/blob/main/studypad/POSTMORTEM.md)。 + +英语抄写还是同一张图。差别是图留在电脑上,不用再打开手机 App。 + + From cfb6f6fc3160326aa9f8fd44a1d9125e5dedca7a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 21 Oct 2026 10:01:25 +0000 Subject: [PATCH 3/4] =?UTF-8?q?=F0=9F=92=84=20Apply=20format:fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/content/posts/2026/assign-homework-to-studypad.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/content/posts/2026/assign-homework-to-studypad.md b/src/content/posts/2026/assign-homework-to-studypad.md index 84225cd..296f627 100644 --- a/src/content/posts/2026/assign-homework-to-studypad.md +++ b/src/content/posts/2026/assign-homework-to-studypad.md @@ -45,5 +45,3 @@ date: 2026-10-21 拆出来就三步:收验证码、登录、布置作业。学科、标题、说明,加上老师发来的那张图,一条命令发到学习机;图片支持本地文件和剪贴板。完整的逆向报告见 [REVERSE.md](https://github.com/yuler/scripts/blob/main/studypad/REVERSE.md),踩坑记录见 [POSTMORTEM.md](https://github.com/yuler/scripts/blob/main/studypad/POSTMORTEM.md)。 英语抄写还是同一张图。差别是图留在电脑上,不用再打开手机 App。 - - From 66f5d3109c036fa54a2a5e0d316e4be201fd5e46 Mon Sep 17 00:00:00 2001 From: yuler Date: Thu, 22 Oct 2026 14:11:10 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=93=9D=20Rewrite=20emulator=20section?= =?UTF-8?q?=20to=20explain=20the=20ARM/x86=20failure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../posts/2026/assign-homework-to-studypad.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/content/posts/2026/assign-homework-to-studypad.md b/src/content/posts/2026/assign-homework-to-studypad.md index 296f627..c2b8a49 100644 --- a/src/content/posts/2026/assign-homework-to-studypad.md +++ b/src/content/posts/2026/assign-homework-to-studypad.md @@ -20,21 +20,22 @@ date: 2026-10-21 既然没有网页入口,思路就是在我这台电脑上(Omarchy Linux)装一个 Android 模拟器。这样后续也可以在这上面跑一些其他的 App。 -## Waydroid:包的链接有问题,装不上 +## 模拟器:装得上,一打开就退出 -一开始用的是 Waydroid。结果安装包的下载链接一直有问题,装不上。这条路先放下。 +先后试了两条路: -## 官方模拟器:脚本在,没起来 +- **Waydroid。** 装是装上了,但讯飞 AI 学一样打不开。 +- **Android Emulator(AVD)。** Android Studio 那套,只是没走 IDE,直接用 Arch 的 SDK 包装。脚本在 dotfiles 仓库的 [`emulator/`](https://github.com/yuler/dotfiles/tree/main/emulator) 目录下:[`android-emulator-setup.sh`](https://github.com/yuler/dotfiles/blob/main/emulator/android-emulator-setup.sh) 负责一次性安装,[`android-emulator-start-pixel-7.sh`](https://github.com/yuler/dotfiles/blob/main/emulator/android-emulator-start-pixel-7.sh) 负责每次启动。 -后来上了 Android 那套——Android Studio 用的 AVD,只是没走 IDE,直接用 Arch 的 SDK 包装。脚本在 `~/brain/setup-emulator.sh`。 +装好之后,用 `adb install -r ~/Downloads/讯飞AI学-4.9.0.13591.apk` 把应用装进模拟器。 -`setup-emulator.sh` 装命令行工具、模拟器、`android-tools` 和 JDK 17,SDK 放在 `/opt/android-sdk`,再下载 Android 13 的 `google_apis` x86_64 镜像,创建一个叫 `xunfei` 的虚拟设备,4 GB 内存、4 核。`start-xunfei.sh` 负责每次启动、装 APK、拉起应用。 +两条路都装得上,但都因为同一个原因打不开:两边架构对不上。讯飞 AI 学带的是 ARM 程序,还套了一层只认 ARM 的加固壳。这台电脑是 x86,模拟器系统也是 x86,两边对不上,所以一打开就退出。包里的原生库只有 `arm64-v8a` 和 `armeabi-v7a`,没有 x86 版。模拟器虽然能用翻译层跑普通 ARM 库,但这个壳会按手机 CPU 去改系统里的运行时——它以为自己在改 ARM 的运行时,实际改到的是 x86 的,改完就崩溃了。 -脚本一直在,但模拟器里讯飞 AI 学就是装不上,一直没起来。 +能跑起来的办法: -仔细看了一下原因:这个 Android 13 `google_apis` x86_64 镜像的 `ro.product.cpu.abilist` 只有 `x86_64`,并没有脚本注释里以为的 ARM 翻译。讯飞 AI 学的安装包里只有 `arm64-v8a` 和 `armeabi-v7a`,没有 x86 的库。所以 `adb install` 直接报 `INSTALL_FAILED_NO_MATCHING_ABIS`。 - -也就是说,**脚本以为镜像自带 ARM 翻译,其实没有**。要跑 ARM 应用,得换一个真正带 arm64 翻译的镜像(Android 11/12 的 `google_apis` 镜像带)。 +- **真机。** 普通的 ARM 手机,用数据线装这个 APK。这是这个包本来就支持的环境。 +- **ARM 版安卓模拟器。** 系统本身是 ARM,壳和运行时就一致了。这台电脑是 Intel,ARM 系统没有硬件虚拟化,只能用软件模拟,会比现在这台慢很多。 +- **借用一台 ARM 设备。** 比如另一台安卓手机,或云端的 ARM 真机。 ## REA:拆开安装包找接口