smuyyh/BookReader
:closed_book: "任阅" 网络小说阅读器,3D翻页效果、txt/pdf/epub书籍阅读、Wifi传书~
Stale — last commit 3y ago
weakest axislast commit was 3y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 3y ago; no CI workflows detected
- ✓7 active contributors
- ✓Apache-2.0 licensed
- ⚠Stale — last commit 3y ago
Show all 6 evidence items →Show less
- ⚠Single-maintainer risk — top contributor 86% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; add a test suite
- →Fork & modify Mixed → Healthy if: add a test suite
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/smuyyh/bookreader)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/smuyyh/bookreader on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: smuyyh/BookReader
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/smuyyh/BookReader shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 3y ago
- 7 active contributors
- Apache-2.0 licensed
- ⚠ Stale — last commit 3y ago
- ⚠ Single-maintainer risk — top contributor 86% of recent commits
- ⚠ No CI workflows detected
- ⚠ No test directory detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live smuyyh/BookReader
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/smuyyh/BookReader.
What it runs against: a local clone of smuyyh/BookReader — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in smuyyh/BookReader | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | Last commit ≤ 1140 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of smuyyh/BookReader. If you don't
# have one yet, run these first:
#
# git clone https://github.com/smuyyh/BookReader.git
# cd BookReader
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of smuyyh/BookReader and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "smuyyh/BookReader(\\.git)?\\b" \\
&& ok "origin remote is smuyyh/BookReader" \\
|| miss "origin remote is not smuyyh/BookReader (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1140 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1110d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/smuyyh/BookReader"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
BookReader (任阅) is a Chinese web novel reader for Android that implements 3D page-flip animations, supports txt/pdf/epub formats, and features book tracking, search, caching, and WiFi file transfer. Built with RxJava + Retrofit2 + Dagger2, it scrapes novel data from a now-defunct API (追书神器) and renders reading with custom pagination and day/night mode. Monorepo structure: app/ contains the main Android application (RxJava observables, Dagger 2 modules, Activities for reading/search/discovery), EasyAdapterLibrary/ is a reusable RecyclerView/ListView adapter wrapper with Glide image helpers. Core reading logic lives in app/src/main/java; novel format parsing delegates to bundled .jar files (epublib-core-latest.jar, commons-collections4-4.1.jar).
👥Who it's for
Chinese Android developers building reading apps who want reference implementations for 3D page animations, local file parsing (txt/pdf/epub via epublib-core), or networked book discovery. Also useful for maintainers looking to understand RxJava 1.x + Dagger 2 patterns in production Android code.
🌱Maturity & risk
This project is abandoned in active development (author explicitly states 'This project has stopped maintenance'). It uses outdated dependencies (Retrofit2, RxJava 1.x, Dagger 2.x, Android SDK 23), has no visible test suite, and the upstream API (追书神器) is dead, causing all network features to fail. The codebase is treated as a learning reference, not a production-ready app.
Critical risk: the project relies on external novel scraping APIs that no longer function, making core features non-operational. Dependencies are 5+ years old (compileSdkVersion 23, RxJava 1.x) with known security gaps and AndroidX migration incomplete. Single-maintainer project with no CI/CD setup visible in file list. The author admits in README that pagination, page-flipping, and performance are 'done quite poorly' and were reworked in an unreleased proprietary successor.
Active areas of work
Nothing. The project is frozen. Last visible activity shows it was last meaningfully updated in early 2017 (demo APK dated 2017-01-29). No recent commits, PRs, or issue resolutions are evident in the file structure. Author has redirected users to fork/reimplementation projects (NovelReader by newbiechen1024, simplereader RN port by jsntjinjin).
🚀Get running
Clone the repo and open in Android Studio: git clone https://github.com/smuyyh/BookReader.git && cd BookReader && open -a 'Android Studio' .. Sync Gradle files (File > Sync Now). Build via ./gradlew build or Android Studio's Build menu. Note: Network features will fail due to dead API endpoints.
Daily commands:
./gradlew assembleDebug to build debug APK (output in app/build/outputs/apk/), or sync in Android Studio and click Run. Requires Android SDK 23+ and an emulator/device with API 15+. The app will launch but network features (novel search, discovery) will timeout/fail.
🗺️Map of the codebase
- app/build.gradle: Defines all 1st-party and 3rd-party dependencies (RxJava, Retrofit, Dagger, Glide, epublib); shows API level 23 target and native .so libraries for TTS and HCI (speech synthesis).
- app/libs/epublib-core-latest.jar: Bundled library for parsing EPUB format; core to local book reading feature.
- EasyAdapterLibrary/src/main/java/com/yuyh/easyadapter/recyclerview/EasyRVAdapter.java: Reusable RecyclerView adapter base class used throughout app for book lists, search results, and discovery feeds.
- [app/libs/hcicloud-5.0.jar, libhci_tts_jni.so](https://github.com/smuyyh/BookReader/blob/master/app/libs/hcicloud-5.0.jar, libhci_tts_jni.so): Text-to-speech (TTS) libraries for reading novels aloud; integrates native JNI layer for Android speech synthesis.
- [.idea/gradle.xml, app/build.gradle](https://github.com/smuyyh/BookReader/blob/master/.idea/gradle.xml, app/build.gradle): Gradle build config; shows this is a legacy Android project using gradle without Kotlin or modern tooling.
🛠️How to make changes
Reading logic: Look in app/src/main/java for Activities named ReadActivity or similar; page-flip rendering is likely in a custom View class. Novel parsing: Check for txt/pdf/epub parser classes in the same directory. UI lists: EasyAdapterLibrary/src/main/java/com/yuyh/easyadapter/ contains the RecyclerView adapter base classes; override in app Activities. API calls: Retrofit service interfaces are in app/src/main/java; these now return 404s but show the pattern. Dependency inject: Dagger modules likely in app/src/main/java under a dagger/ subdirectory.
🪤Traps & gotchas
Dead APIs: All HTTP endpoints in Retrofit services now 404; the app will hang on network calls unless you mock responses or patch endpoints. Native .so files: armeabi/ binaries (libhci_.so) are for ARM v5/v6 CPUs; won't load on ARM64 emulators/devices without ndk-build setup. AndroidX partial migration: build.gradle imports androidx.appcompat and androidx.recyclerview, but codebase likely still has android.support. imports — may cause compilation errors. No R8/Proguard applied: minifyEnabled is false; resulting APK is unoptimized and large. Hardcoded paths: No evidence of ProGuard mappings; obfuscation would break reflection in Dagger. TTS service: The bundled hcicloud SDK is proprietary; may require license or API keys not in the repo.
💡Concepts to learn
- 3D Page-Flip Animation — BookReader's signature feature; implemented via Canvas transforms and matrix operations in a custom View. Understand perspective projection and frame-by-frame rendering to modify flip speed, angle, or shadows.
- RxJava 1.x Observable Chains & Backpressure — The entire networking and event layer is built on RxJava 1.x Observables; understanding .subscribe(), .flatMap(), .zip(), and disposal is essential to avoid memory leaks and understand async data flow.
- Dagger 2 Dependency Injection — The app uses Dagger 2 for injecting Retrofit services, Repositories, and ViewModels; modifying features requires understanding @Module, @Provides, @Component, and scope annotations.
- EPUB Format Parsing (epublib) — The app bundles epublib-core to read EPUB novels locally; EPUB is a ZIP archive with XML metadata and HTML chapters. Understand its API to add features like chapter extraction or metadata display.
- Retrofit 2 + OkHttp Interceptors — All API calls go through Retrofit; understanding interceptors, request/response logging, and error handling is critical to debug or replace dead endpoints.
- Android Canvas & Matrix Transformations — Page-flip rendering uses Canvas.drawBitmap() with Matrix skew and perspective transforms; necessary to modify animation physics or add parallax effects.
- SQLite Caching & Content Providers — Novel chapters and metadata are cached locally in SQLite; understanding cursor queries and content providers is needed to optimize database access or add offline search.
🔗Related repos
newbiechen1024/NovelReader— Direct fork/improvement of BookReader by same author; fixes pagination, performance, and modernizes dependencies — use as a reference for how to upgrade the codebase.jsntjinjin/simplereader— React Native reimplementation of BookReader's UX; shows how to port the 3D page-flip and novel reading logic to cross-platform.smuyyh/CrawlerForReader— Companion Android crawling project by same author for scraping local network novels; addresses the dead API problem by providing a local data source.bumptech/glide— The image loading library used in EasyAdapterLibrary; understanding Glide transforms (GlideCircleTransform, GlideRoundTransform) is key to modifying book cover rendering.ReactiveX/RxJava— Core async pattern used throughout app; RxJava 1.x Observable chains power all network requests and event handling — understanding backpressure and disposal is critical for memory leaks.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Migrate EasyAdapterLibrary from deprecated support libraries to AndroidX
The EasyAdapterLibrary build.gradle uses compileSdkVersion 23 and mixes deprecated support libraries with androidx dependencies (androidx.appcompat:appcompat:1.0.0 and androidx.recyclerview:recyclerview:1.0.0). This creates compatibility issues and prevents the library from being properly consumed by modern Android projects. A systematic migration would improve maintainability and resolve dependency conflicts.
- [ ] Update EasyAdapterLibrary/build.gradle: change compileSdkVersion to 31+ and buildToolsVersion to latest stable
- [ ] Replace all support library imports in EasyAdapterLibrary/src/main/java/com/yuyh/easyadapter/ with androidx equivalents
- [ ] Update minSdkVersion from 8 to 21+ (AndroidX requirement)
- [ ] Verify GlideCircleTransform.java and GlideRoundTransform.java work with androidx dependencies
- [ ] Test that app module's build.gradle properly consumes the updated library
Add unit tests for EasyAdapterLibrary core classes
The EasyAdapterLibrary contains critical adapter utilities (EasyLVAdapter, EasyRVAdapter, DataHelper, ViewHelper) with no apparent test coverage. These are foundational components used throughout the app. Adding unit tests would prevent regressions and make the library more reliable for contributors.
- [ ] Create EasyAdapterLibrary/src/test/java/com/yuyh/easyadapter/ directory structure
- [ ] Add unit tests for EasyLVAdapter.java covering adapter initialization, data binding, and view holder recycling
- [ ] Add unit tests for EasyRVAdapter.java covering RecyclerView-specific functionality
- [ ] Add unit tests for DataHelper.java utility methods
- [ ] Configure EasyAdapterLibrary/build.gradle to include junit and mockito dependencies
Remove or update deprecated Glide 3.7.0 to Glide 4.x with proper configuration
The project depends on Glide 3.7.0 (released 2016), which is unmaintained and has known security issues. GlideCircleTransform.java and GlideRoundTransform.java in EasyAdapterLibrary/src/main/java/com/yuyh/easyadapter/glide/ are tightly coupled to this outdated version. Upgrading to Glide 4.x (current stable) would modernize image loading and simplify custom transform implementations.
- [ ] Update EasyAdapterLibrary/build.gradle: change 'com.github.bumptech.glide:glide:3.7.0' to 4.15.1
- [ ] Refactor GlideCircleTransform.java to extend Glide 4.x's BaseTransformation instead of the deprecated Transform class
- [ ] Refactor GlideRoundTransform.java to match Glide 4.x API (update method signatures and resource handling)
- [ ] Search app/src/ for Glide 3.x specific API calls (e.g., .into(callback)) and update to Glide 4.x equivalents
- [ ] Add AppGlideModule to app/src/main/java/ to enable Glide configuration
🌿Good first issues
- Replace dead 追书神器 API endpoints with a working alternative (e.g., jianshu or manual mock data) in Retrofit service interfaces; add integration tests to verify responses. Files: app/src/main/java/*Service.java, app/src/test/.
- Add missing unit tests for novel format parsers (txt, pdf, epub handling) in app/src/test/java/; currently no test directory exists in file list. Start with a simple parser test for txt line splitting.
- Migrate from RxJava 1.x to RxJava 3.x and update Retrofit call patterns; update build.gradle dependencies and refactor Observable chains. Start in a single Activity to reduce risk.
⭐Top contributors
Click to expand
Top contributors
- @smuyyh — 86 commits
- @zths — 5 commits
- @lfh1991 — 3 commits
- @liao_mac — 2 commits
- @invalid-email-address — 2 commits
📝Recent commits
Click to expand
Recent commits
fceb089— 打包脚本更新 (smuyyh)1c736c9— Update README.md (smuyyh)871f57e— Update README.md (smuyyh)ecefaeb— Update README.md (smuyyh)a88f552— Merge pull request #227 from ptliao/master (smuyyh)684ee75— Merge pull request #1 from smuyyh/master (ptliao)e7e6a56— 增加下载章节处理 (liao_mac)fa45701— 增加web端下载本地文件 (liao_mac)857a656— Update README.md (smuyyh)c481941— Update README.md (smuyyh)
🔒Security observations
- Critical · Hardcoded Signing Key in Repository —
app/sign.jks. The file 'app/sign.jks' is a Java keystore file containing the app's signing key. This file should never be committed to version control as it contains sensitive cryptographic material that can be used to sign malicious APKs in the name of the application. Fix: Remove sign.jks from the repository immediately. Add it to .gitignore. Store the keystore securely in a secrets management system (e.g., GitHub Secrets, GitLab CI/CD variables) and only use it in secure CI/CD pipelines. - High · Outdated and Vulnerable Dependencies —
EasyAdapterLibrary/build.gradle, app/build.gradle. The project uses significantly outdated dependencies: Glide 3.7.0 (released 2016), AndroidX appcompat 1.0.0 (2018), and RecyclerView 1.0.0 (2018). These versions contain known security vulnerabilities and lack critical security patches. Additionally, compile targetSdkVersion 23 (Android 6.0) is far below current requirements. Fix: Update all dependencies to latest stable versions: Glide to 4.15.x+, AndroidX libraries to current versions. Update targetSdkVersion to at least 33 (Android 13). Review and update all third-party libraries including commons-collections4-4.1.jar, epublib-core-latest.jar, and other JAR files in app/libs. - High · Unvalidated External API Calls —
app/src/main/java/com/justwayward/reader/api/BookApi.java. The project integrates with '追书神器' (Zhuishu) API based on README. The README explicitly states the API is no longer maintained and interfaces fail. No evidence of API response validation or error handling visible in structure. This can lead to injection attacks or exposure to malformed data. Fix: Implement strict input validation and sanitization for all API responses. Use pinned certificates for HTTPS connections. Implement timeout mechanisms. Add comprehensive error handling and logging without exposing sensitive data. - High · Embedded Native Libraries Without Verification —
app/libs/armeabi/. Multiple native libraries (.so files) are embedded without visible signature verification: libhci_curl.so, libhci_sys.so, libhci_tts.so. These are critical security components that should be verified for integrity. Fix: Implement signature verification for all native libraries at runtime. Use the latest versions of Baidu Hci Cloud SDK if still maintained. Consider removing unused native libraries. Document the source and purpose of each library. - High · Insecure Local Storage of Book Data —
app (caching mechanism not visible in structure). The project caches book content and data locally (mentioned in README: '缓存书籍'). No evidence of encryption for sensitive user data or cached content in the file structure review. Fix: Encrypt all locally cached data using Android's EncryptedSharedPreferences or similar mechanisms. Never store sensitive user data in plain text. Use Android Keystore for encryption keys. - Medium · Missing ProGuard Configuration for Release Builds —
EasyAdapterLibrary/build.gradle. The EasyAdapterLibrary has minifyEnabled set to false in release builds, allowing code to remain non-obfuscated and easier to reverse engineer. Fix: Set minifyEnabled to true for release builds. Ensure appropriate ProGuard rules are configured to protect sensitive code while maintaining functionality. Apply the same to the main app build configuration. - Medium · Deprecated Compile SDK Version —
EasyAdapterLibrary/build.gradle, app/build.gradle. The project targets compileSdkVersion 23 (Android 6.0, released 2015). Modern Android security requires at least SDK 33+. This means the project misses 8+ years of security improvements and API hardening. Fix: Update compileSdkVersion to 34 or higher. Update buildToolsVersion accordingly. Test thoroughly with newer SDK versions to ensure compatibility. - Medium · Potential XSS in Web-based File Uploader —
undefined. The project includes web-based uploader Fix: undefined
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.