APK逆向工程 - “Legado v3.22.080318” 源代码分析


源码分析说明


当前分析文件:Legado v3.22.080318 -- AndroidManifest.xml

本分析报告仅用于安全研究目的,禁止用于任何非法用途。所有操作均需遵守当地法律法规。


<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="11955" android:versionName="3.22.080318" android:compileSdkVersion="32" android:compileSdkVersionCodename="12" package="io.legado.app.releaseA" platformBuildVersionCode="32" platformBuildVersionName="12"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="32" />
    <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
    <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <queries>
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
        <intent>
            <action android:name="android.intent.action.PROCESS_TEXT" />
            <data android:mimeType="text/plain" />
        </intent>
    </queries>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <application android:theme="@style/AppTheme.Light" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:name="io.legado.app.App" android:allowBackup="true" android:supportsRtl="true" android:networkSecurityConfig="@xml/network_security_config" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:requestLegacyExternalStorage="true">
        <activity android:name="io.legado.app.ui.welcome.WelcomeActivity" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher1" android:name="io.legado.app.ui.welcome.Launcher1" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher2" android:name="io.legado.app.ui.welcome.Launcher2" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher3" android:name="io.legado.app.ui.welcome.Launcher3" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher4" android:name="io.legado.app.ui.welcome.Launcher4" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher5" android:name="io.legado.app.ui.welcome.Launcher5" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:icon="@mipmap/launcher6" android:name="io.legado.app.ui.welcome.Launcher6" android:enabled="false" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.shortcuts" android:launchMode="singleTask" android:resource="@xml/shortcuts" />
        </activity>
        <activity android:name="io.legado.app.ui.main.MainActivity" android:launchMode="singleTask" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:alwaysRetainTaskState="true" />
        <activity android:name="io.legado.app.ui.book.read.ReadBookActivity" android:exported="true" android:launchMode="singleTask" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize">
            <intent-filter>
                <action android:name="com.samsung.android.support.REMOTE_ACTION" />
            </intent-filter>
            <meta-data android:name="com.samsung.android.support.REMOTE_ACTION" android:resource="@xml/spen_remote_actions" />
        </activity>
        <activity android:name="io.legado.app.ui.book.info.BookInfoActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.book.info.edit.BookInfoEditActivity" android:launchMode="singleTask" />
        <activity android:name="io.legado.app.ui.book.audio.AudioPlayActivity" android:launchMode="singleTask" />
        <activity android:theme="@style/Activity.Permission" android:name="io.legado.app.lib.permission.PermissionActivity" />
        <activity android:name="io.legado.app.ui.qrcode.QrCodeActivity" android:launchMode="singleTask" />
        <activity android:name="io.legado.app.ui.rss.subscription.RuleSubActivity" android:launchMode="singleTask" />
        <activity android:name="io.legado.app.ui.book.source.edit.BookSourceEditActivity" android:launchMode="singleTask" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustResize|stateHidden" />
        <activity android:name="io.legado.app.ui.rss.source.edit.RssSourceEditActivity" android:launchMode="singleTask" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustResize|stateHidden" />
        <activity android:name="io.legado.app.ui.replace.edit.ReplaceEditActivity" android:launchMode="singleTask" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize" android:windowSoftInputMode="adjustResize|stateHidden" />
        <activity android:name="io.legado.app.ui.config.ConfigActivity" android:launchMode="singleTask" />
        <activity android:name="io.legado.app.ui.book.search.SearchActivity" android:launchMode="standard" />
        <activity android:name="io.legado.app.ui.about.AboutActivity" android:launchMode="singleTask" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.about.DonateActivity" android:launchMode="singleTask" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.source.manage.BookSourceActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.rss.source.manage.RssSourceActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.local.rule.TxtTocRuleActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.replace.ReplaceRuleActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.manage.BookshelfManageActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.source.debug.BookSourceDebugActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.toc.TocActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.book.searchContent.SearchContentActivity" android:launchMode="singleTop" android:screenOrientation="behind" />
        <activity android:name="io.legado.app.ui.rss.article.RssSortActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.rss.read.ReadRssActivity" android:launchMode="singleTop" android:configChanges="orientation|screenSize" android:hardwareAccelerated="true" />
        <activity android:name="io.legado.app.ui.book.local.ImportBookActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.book.remote.RemoteBookActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.book.explore.ExploreShowActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.rss.source.debug.RssSourceDebugActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.rss.favorites.RssFavoritesActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.book.bookmark.AllBookmarkActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.book.cache.CacheActivity" android:launchMode="singleTop" />
        <activity android:name="io.legado.app.ui.browser.WebViewActivity" android:launchMode="standard" />
        <activity android:theme="@style/AppTheme.Transparent" android:name="io.legado.app.ui.login.SourceLoginActivity" android:configChanges="orientation|screenSize" android:hardwareAccelerated="true" />
        <activity android:name="io.legado.app.ui.about.ReadRecordActivity" android:configChanges="orientation|screenSize" android:hardwareAccelerated="true" />
        <activity android:theme="@style/AppTheme.Transparent" android:name="io.legado.app.ui.document.HandleFileActivity" android:configChanges="orientation|screenSize" android:hardwareAccelerated="true" />
        <activity android:theme="@style/AppTheme.Transparent" android:label="@string/receiving_shared_label" android:name="io.legado.app.receiver.SharedReceiverActivity" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.PROCESS_TEXT" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
        </activity>
        <activity android:theme="@style/AppTheme.Transparent" android:name="io.legado.app.ui.association.OnLineImportActivity" android:exported="true" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="legado" />
                <data android:scheme="yuedu" />
            </intent-filter>
        </activity>
        <activity android:theme="@style/AppTheme.Transparent" android:name="io.legado.app.ui.association.VerificationCodeActivity" android:exported="true" android:configChanges="keyboardHidden|locale|orientation|screenLayout|screenSize|smallestScreenSize" />
        <activity android:theme="@style/AppTheme.Transparent" android:name="io.legado.app.ui.association.FileAssociationActivity" android:exported="true" android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="app" />
                <data android:scheme="content" />
                <data android:scheme="file" />
                <data android:mimeType="text/plain" />
                <data android:mimeType="application/json" />
                <data android:mimeType="application/epub+zip" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host="*" />
                <data android:scheme="app" />
                <data android:scheme="content" />
                <data android:scheme="file" />
                <data android:mimeType="*/*" />
                <data android:pathPattern=".*\\.txt" />
                <data android:pathPattern=".*\\.TXT" />
                <data android:pathPattern=".*\\.json" />
                <data android:pathPattern=".*\\.JSON" />
                <data android:pathPattern=".*\\.epub" />
                <data android:pathPattern=".*\\.EPUB" />
            </intent-filter>
        </activity>
        <service android:name="io.legado.app.service.CheckSourceService" />
        <service android:name="io.legado.app.service.CacheBookService" />
        <service android:name="io.legado.app.service.WebService" />
        <service android:label="legado Web Service" android:icon="@drawable/ic_web_service_noti" android:name="io.legado.app.service.WebTileService" android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" android:exported="true">
            <intent-filter>
                <action android:name="android.service.quicksettings.action.QS_TILE" />
            </intent-filter>
        </service>
        <service android:name="io.legado.app.service.TTSReadAloudService" />
        <service android:name="io.legado.app.service.HttpReadAloudService" />
        <service android:name="io.legado.app.service.AudioPlayService" />
        <service android:name="io.legado.app.service.DownloadService" />
        <receiver android:name="io.legado.app.receiver.MediaButtonReceiver" android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MEDIA_BUTTON" />
            </intent-filter>
        </receiver>
        <provider android:name="io.legado.app.api.ReaderProvider" android:enabled="true" android:exported="true" android:authorities="io.legado.app.releaseA.readerProvider" />
        <provider android:name="androidx.core.content.FileProvider" android:exported="false" android:authorities="io.legado.app.releaseA.fileProvider" android:grantUriPermissions="true">
            <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
        </provider>
        <meta-data android:name="channel" android:value="app" />
        <activity android:name="androidx.compose.ui.tooling.PreviewActivity" android:exported="true" />
        <uses-library android:name="androidx.window.extensions" android:required="false" />
        <uses-library android:name="androidx.window.sidecar" android:required="false" />
        <provider android:name="androidx.startup.InitializationProvider" android:exported="false" android:authorities="io.legado.app.releaseA.androidx-startup" android:directBootAware="true">
            <meta-data android:name="splitties.init.AppCtxInitializer" android:value="androidx.startup" />
            <meta-data android:name="androidx.emoji2.text.EmojiCompatInitializer" android:value="androidx.startup" />
            <meta-data android:name="androidx.lifecycle.ProcessLifecycleInitializer" android:value="androidx.startup" />
            <meta-data android:name="androidx.profileinstaller.ProfileInstallerInitializer" android:value="androidx.startup" />
        </provider>
        <service android:name="androidx.room.MultiInstanceInvalidationService" android:exported="false" android:directBootAware="true" />
        <service android:name="androidx.camera.core.impl.MetadataHolderService" android:enabled="false" android:exported="false">
            <meta-data android:name="androidx.camera.core.impl.MetadataHolderService.DEFAULT_CONFIG_PROVIDER" android:value="androidx.camera.camera2.Camera2Config$DefaultProvider" />
        </service>
        <receiver android:name="androidx.profileinstaller.ProfileInstallReceiver" android:permission="android.permission.DUMP" android:enabled="true" android:exported="true" android:directBootAware="false">
            <intent-filter>
                <action android:name="androidx.profileinstaller.action.INSTALL_PROFILE" />
            </intent-filter>
            <intent-filter>
                <action android:name="androidx.profileinstaller.action.SKIP_FILE" />
            </intent-filter>
        </receiver>
    </application>
</manifest>