1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-07-07 09:50:07 +02:00

Merge branch 'fix_760' into 'master'

update.py (and index.py) refactoring

Closes #524 and #760

See merge request fdroid/fdroidserver!756
This commit is contained in:
Marcus 2020-06-24 22:37:51 +00:00
commit 1902bfb6fc
9 changed files with 1360 additions and 78 deletions

1
.gitignore vendored
View File

@ -25,6 +25,7 @@ README.rst
tmp/ tmp/
/tests/repo/icons* /tests/repo/icons*
/tests/repo/latestapps.dat /tests/repo/latestapps.dat
/tests/repo/status
# files used in manual testing # files used in manual testing
/config.py /config.py

View File

@ -21,7 +21,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import collections import collections
import copy
import json import json
import logging import logging
import os import os
@ -41,31 +40,32 @@ from . import metadata
from . import net from . import net
from . import signindex from . import signindex
from fdroidserver.common import FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints from fdroidserver.common import FDroidPopen, FDroidPopenBytes, load_stats_fdroid_signing_key_fingerprints
from fdroidserver.exception import FDroidException, VerificationException, MetaDataException from fdroidserver.exception import FDroidException, VerificationException
def make(apps, sortedids, apks, repodir, archive): def make(apps, apks, repodir, archive):
"""Generate the repo index files. """Generate the repo index files.
This requires properly initialized options and config objects. This requires properly initialized options and config objects.
:param apps: fully populated apps list :param apps: OrderedDict of apps to go into the index, each app should have
:param sortedids: app package IDs, sorted at least one associated apk
:param apks: full populated apks list :param apks: list of apks to go into the index
:param repodir: the repo directory :param repodir: the repo directory
:param archive: True if this is the archive repo, False if it's the :param archive: True if this is the archive repo, False if it's the
main one. main one.
""" """
from fdroidserver.update import METADATA_VERSION from fdroidserver.update import METADATA_VERSION
def _resolve_description_link(appid):
if appid in apps:
return "fdroid.app:" + appid, apps[appid].Name
raise MetaDataException("Cannot resolve app id " + appid)
if not common.options.nosign: if not common.options.nosign:
common.assert_config_keystore(common.config) common.assert_config_keystore(common.config)
# Historically the index has been sorted by App Name, so we enforce this ordering here
sortedids = sorted(apps, key=lambda appid: apps[appid].Name.upper())
sortedapps = collections.OrderedDict()
for appid in sortedids:
sortedapps[appid] = apps[appid]
repodict = collections.OrderedDict() repodict = collections.OrderedDict()
repodict['timestamp'] = datetime.utcnow().replace(tzinfo=timezone.utc) repodict['timestamp'] = datetime.utcnow().replace(tzinfo=timezone.utc)
repodict['version'] = METADATA_VERSION repodict['version'] = METADATA_VERSION
@ -106,21 +106,6 @@ def make(apps, sortedids, apks, repodir, archive):
if mirrors: if mirrors:
repodict['mirrors'] = mirrors repodict['mirrors'] = mirrors
appsWithPackages = collections.OrderedDict()
for packageName in sortedids:
app = apps[packageName]
if app['Disabled']:
continue
# only include apps with packages
for apk in apks:
if apk['packageName'] == packageName:
newapp = copy.copy(app) # update wiki needs unmodified description
newapp['Description'] = metadata.description_html(app['Description'],
_resolve_description_link)
appsWithPackages[packageName] = newapp
break
requestsdict = collections.OrderedDict() requestsdict = collections.OrderedDict()
for command in ('install', 'uninstall'): for command in ('install', 'uninstall'):
packageNames = [] packageNames = []
@ -136,9 +121,9 @@ def make(apps, sortedids, apks, repodir, archive):
fdroid_signing_key_fingerprints = load_stats_fdroid_signing_key_fingerprints() fdroid_signing_key_fingerprints = load_stats_fdroid_signing_key_fingerprints()
make_v0(appsWithPackages, apks, repodir, repodict, requestsdict, make_v0(sortedapps, apks, repodir, repodict, requestsdict,
fdroid_signing_key_fingerprints) fdroid_signing_key_fingerprints)
make_v1(appsWithPackages, apks, repodir, repodict, requestsdict, make_v1(sortedapps, apks, repodir, repodict, requestsdict,
fdroid_signing_key_fingerprints) fdroid_signing_key_fingerprints)
@ -311,11 +296,6 @@ def make_v0(apps, apks, repodir, repodict, requestsdict, fdroid_signing_key_fing
value = str(apk[key]) value = str(apk[key])
addElement(name, value, doc, parent) addElement(name, value, doc, parent)
def addElementCDATA(name, value, doc, parent):
el = doc.createElement(name)
el.appendChild(doc.createCDATASection(value))
parent.appendChild(el)
def addElementCheckLocalized(name, app, key, doc, parent, default=''): def addElementCheckLocalized(name, app, key, doc, parent, default=''):
"""Fill in field from metadata or localized block """Fill in field from metadata or localized block

View File

@ -616,7 +616,7 @@ class DescriptionFormatter:
warn_or_exception(_("Unterminated ]]")) warn_or_exception(_("Unterminated ]]"))
url = txt[2:index] url = txt[2:index]
if self.linkResolver: if self.linkResolver:
url, urltext = self.linkResolver(url) url, urltext = self.linkResolver.resolve_description_link(url)
else: else:
urltext = url urltext = url
res_html += '<a href="' + url + '">' + html.escape(urltext, quote=False) + '</a>' res_html += '<a href="' + url + '">' + html.escape(urltext, quote=False) + '</a>'
@ -899,14 +899,9 @@ def read_metadata(xref=True, check_vcs=[], refresh=True, sort_by_time=False):
if xref: if xref:
# Parse all descriptions at load time, just to ensure cross-referencing # Parse all descriptions at load time, just to ensure cross-referencing
# errors are caught early rather than when they hit the build server. # errors are caught early rather than when they hit the build server.
def linkres(appid):
if appid in apps:
return ("fdroid.app:" + appid, "Dummy name - don't know yet")
warn_or_exception(_("Cannot resolve app id {appid}").format(appid=appid))
for appid, app in apps.items(): for appid, app in apps.items():
try: try:
description_html(app.Description, linkres) description_html(app.Description, DummyDescriptionResolver(apps))
except MetaDataException as e: except MetaDataException as e:
warn_or_exception(_("Problem with description of {appid}: {error}") warn_or_exception(_("Problem with description of {appid}: {error}")
.format(appid=appid, error=str(e))) .format(appid=appid, error=str(e)))
@ -1679,3 +1674,21 @@ def add_metadata_arguments(parser):
'''add common command line flags related to metadata processing''' '''add common command line flags related to metadata processing'''
parser.add_argument("-W", choices=['error', 'warn', 'ignore'], default='error', parser.add_argument("-W", choices=['error', 'warn', 'ignore'], default='error',
help=_("force metadata errors (default) to be warnings, or to be ignored.")) help=_("force metadata errors (default) to be warnings, or to be ignored."))
class DescriptionResolver:
def __init__(self, apps):
self.apps = apps
def resolve_description_link(self, appid):
if appid in self.apps:
if self.apps[appid].Name:
return "fdroid.app:" + appid, self.apps[appid].Name
raise MetaDataException("Cannot resolve app id " + appid)
class DummyDescriptionResolver(DescriptionResolver):
def resolve_description_link(self, appid):
if appid in self.apps:
return "fdroid.app:" + appid, "Dummy name - don't know yet"
warn_or_exception(_("Cannot resolve app id {appid}").format(appid=appid))

View File

@ -126,7 +126,7 @@ def disabled_algorithms_allowed():
return options.allow_disabled_algorithms or config['allow_disabled_algorithms'] return options.allow_disabled_algorithms or config['allow_disabled_algorithms']
def status_update_json(apps, sortedids, apks): def status_update_json(apps, apks):
"""Output a JSON file with metadata about this `fdroid update` run """Output a JSON file with metadata about this `fdroid update` run
:param apps: fully populated list of all applications :param apps: fully populated list of all applications
@ -141,7 +141,7 @@ def status_update_json(apps, sortedids, apks):
output['failedBuilds'] = dict() output['failedBuilds'] = dict()
output['noPackages'] = [] output['noPackages'] = []
for appid in sortedids: for appid in apps:
app = apps[appid] app = apps[appid]
for af in app.get('AntiFeatures', []): for af in app.get('AntiFeatures', []):
antiFeatures = output['antiFeatures'] # JSON camelCase antiFeatures = output['antiFeatures'] # JSON camelCase
@ -177,7 +177,7 @@ def status_update_json(apps, sortedids, apks):
common.write_status_json(output, options.pretty) common.write_status_json(output, options.pretty)
def update_wiki(apps, sortedids, apks): def update_wiki(apps, apks):
"""Update the wiki """Update the wiki
:param apps: fully populated list of all applications :param apps: fully populated list of all applications
@ -193,7 +193,7 @@ def update_wiki(apps, sortedids, apks):
generated_pages = {} generated_pages = {}
generated_redirects = {} generated_redirects = {}
for appid in sortedids: for appid in apps:
app = metadata.App(apps[appid]) app = metadata.App(apps[appid])
wikidata = '' wikidata = ''
@ -1113,7 +1113,7 @@ def insert_localized_app_metadata(apps):
...as well as the /metadata/<packageName>/<locale> directory. ...as well as the /metadata/<packageName>/<locale> directory.
If it finds them, they will be added to the dict of all packages, with the If it finds them, they will be added to the dict of all packages, with the
versions in the /metadata/ folder taking precendence over the what versions in the /metadata/ folder taking precedence over the what
is in the app's source repo. is in the app's source repo.
The <locale> is the locale of the files supplied in that directory, using The <locale> is the locale of the files supplied in that directory, using
@ -2009,19 +2009,19 @@ def make_categories_txt(repodir, categories):
def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversions): def archive_old_apks(apps, apks, archapks, repodir, archivedir, defaultkeepversions):
def filter_apk_list_sorted(apk_list): def filter_apk_list_sorted(apk_list):
res = [] apkList = []
currentVersionApk = None currentVersionApk = None
for apk in apk_list: for apk in apk_list:
if apk['packageName'] == appid: if apk['packageName'] == appid:
if apk['versionCode'] == common.version_code_string_to_int(app.CurrentVersionCode): if app.CurrentVersionCode is not None:
currentVersionApk = apk if apk['versionCode'] == common.version_code_string_to_int(app.CurrentVersionCode):
continue currentVersionApk = apk
res.append(apk) continue
apkList.append(apk)
# Sort the apk list by version code. First is highest/newest. # Sort the apk list by version code. First is highest/newest.
sorted_list = sorted(res, key=lambda apk: apk['versionCode'], reverse=True) sorted_list = sorted(apkList, key=lambda apk: apk['versionCode'], reverse=True)
if currentVersionApk: if currentVersionApk:
# Insert apk which corresponds to currentVersion at the front # Insert apk which corresponds to currentVersion at the front
sorted_list.insert(0, currentVersionApk) sorted_list.insert(0, currentVersionApk)
@ -2166,6 +2166,75 @@ def create_metadata_from_template(apk):
logging.info(_("Generated skeleton metadata for {appid}").format(appid=apk['packageName'])) logging.info(_("Generated skeleton metadata for {appid}").format(appid=apk['packageName']))
def read_names_from_apks(apps, apks):
"""This is a stripped down copy of apply_info_from_latest_apk that only parses app names"""
for appid, app in apps.items():
bestver = UNSET_VERSION_CODE
for apk in apks:
if apk['packageName'] == appid:
if apk['versionCode'] > bestver:
bestver = apk['versionCode']
bestapk = apk
if bestver == UNSET_VERSION_CODE:
if app.Name is None:
app.Name = app.AutoName or appid
app.icon = None
else:
if app.Name is None:
app.Name = bestapk['name']
def render_app_descriptions(apps, all_apps):
"""
Renders the app html description.
For resolving inter-app links it needs the full list of apps, even if they end up in
separate repos (i.e. archive or per app repos).
"""
for app in apps.values():
app['Description'] = metadata.description_html(app['Description'], metadata.DescriptionResolver(all_apps))
def get_apps_with_packages(apps, apks):
"""Returns a deepcopy of that subset apps that actually has any associated packages. Skips disabled apps."""
appsWithPackages = collections.OrderedDict()
for packageName in apps:
app = apps[packageName]
if app['Disabled']:
continue
# only include apps with packages
for apk in apks:
if apk['packageName'] == packageName:
newapp = copy.copy(app)
appsWithPackages[packageName] = newapp
break
return appsWithPackages
def prepare_apps(apps, apks, repodir):
"""Encapsulates all necessary preparation steps before we can build an index out of apps and apks.
:param apps: All apps as read from metadata
:param apks: list of apks that belong into repo, this gets modified in place
:param repodir: the target repository directory, metadata files will be copied here
:return: the relevant subset of apps (as a deepcopy)
"""
apps_with_packages = get_apps_with_packages(apps, apks)
apply_info_from_latest_apk(apps_with_packages, apks)
render_app_descriptions(apps_with_packages, apps)
insert_funding_yml_donation_links(apps)
# This is only currently done for /repo because doing it for the archive
# will take a lot of time and bloat the archive mirrors and index
if repodir == 'repo':
copy_triple_t_store_metadata(apps_with_packages)
insert_obbs(repodir, apps_with_packages, apks)
translate_per_build_anti_features(apps_with_packages, apks)
if repodir == 'repo':
insert_localized_app_metadata(apps_with_packages)
return apps_with_packages
config = None config = None
options = None options = None
start_timestamp = time.gmtime() start_timestamp = time.gmtime()
@ -2302,12 +2371,6 @@ def main():
else: else:
logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.')) logging.warning(msg + '\n\t' + _('Use `fdroid update -c` to create it.'))
insert_funding_yml_donation_links(apps)
copy_triple_t_store_metadata(apps)
insert_obbs(repodirs[0], apps, apks)
insert_localized_app_metadata(apps)
translate_per_build_anti_features(apps, apks)
# Scan the archive repo for apks as well # Scan the archive repo for apks as well
if len(repodirs) > 1: if len(repodirs) > 1:
archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk) archapks, cc = process_apks(apkcache, repodirs[1], knownapks, options.use_date_from_apk)
@ -2316,13 +2379,18 @@ def main():
else: else:
archapks = [] archapks = []
# Apply information from latest apks to the application and update dates # We need app.Name populated for all apps regardless of which repo they end up in
apply_info_from_latest_apk(apps, apks + archapks) # for the old-style inter-app links, so let's do it before we do anything else.
# This will be done again (as part of apply_info_from_latest_apk) for repo and archive
# separately later on, but it's fairly cheap anyway.
read_names_from_apks(apps, apks + archapks)
# Sort the app list by name, then the web site doesn't have to by default. if len(repodirs) > 1:
# (we had to wait until we'd scanned the apks to do this, because mostly the archive_old_apks(apps, apks, archapks, repodirs[0], repodirs[1], config['archive_older'])
# name comes from there!) archived_apps = prepare_apps(apps, archapks, repodirs[1])
sortedids = sorted(apps.keys(), key=lambda appid: apps[appid].Name.upper()) index.make(archived_apps, archapks, repodirs[1], True)
repoapps = prepare_apps(apps, apks, repodirs[0])
# APKs are placed into multiple repos based on the app package, providing # APKs are placed into multiple repos based on the app package, providing
# per-app subscription feeds for nightly builds and things like it # per-app subscription feeds for nightly builds and things like it
@ -2333,25 +2401,15 @@ def main():
appdict = dict() appdict = dict()
appdict[appid] = app appdict[appid] = app
if os.path.isdir(repodir): if os.path.isdir(repodir):
index.make(appdict, [appid], apks, repodir, False) index.make(appdict, apks, repodir, False)
else: else:
logging.info(_('Skipping index generation for {appid}').format(appid=appid)) logging.info(_('Skipping index generation for {appid}').format(appid=appid))
return return
if len(repodirs) > 1:
archive_old_apks(apps, apks, archapks, repodirs[0], repodirs[1], config['archive_older'])
# Make the index for the main repo... # Make the index for the main repo...
index.make(apps, sortedids, apks, repodirs[0], False) index.make(repoapps, apks, repodirs[0], False)
make_categories_txt(repodirs[0], categories) make_categories_txt(repodirs[0], categories)
# If there's an archive repo, make the index for it. We already scanned it
# earlier on.
if len(repodirs) > 1:
archived_apps = copy.deepcopy(apps)
apply_info_from_latest_apk(archived_apps, archapks)
index.make(archived_apps, sortedids, archapks, repodirs[1], True)
git_remote = config.get('binary_transparency_remote') git_remote = config.get('binary_transparency_remote')
if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')): if git_remote or os.path.isdir(os.path.join('binary_transparency', '.git')):
from . import btlog from . import btlog
@ -2381,8 +2439,8 @@ def main():
# Update the wiki... # Update the wiki...
if options.wiki: if options.wiki:
update_wiki(apps, sortedids, apks + archapks) update_wiki(apps, apks + archapks)
status_update_json(apps, sortedids, apks + archapks) status_update_json(apps, apks + archapks)
logging.info(_("Finished")) logging.info(_("Finished"))

View File

@ -905,6 +905,13 @@ class MetadataTest(unittest.TestCase):
'Subdir': None, 'Subdir': None,
'Prepare': None}}) 'Prepare': None}})
def test_read_xref_metadata(self):
os.chdir('xref')
fdroidserver.metadata.warnings_action = 'error'
apps = fdroidserver.metadata.read_metadata(xref=True)
self.assertListEqual(list(apps.keys()),
['aarddict.android', 'org.coolreader', 'org.geometerplus.zlibrary.ui.android'])
if __name__ == "__main__": if __name__ == "__main__":
os.chdir(os.path.dirname(__file__)) os.chdir(os.path.dirname(__file__))

View File

@ -607,6 +607,18 @@ grep -F 'info.guardianproject.urzip_100.apk' repo/index-v1.json repo/index.xml
grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index-v1.json
! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml ! grep -F 'info.guardianproject.urzip_100_b4964fd.apk' repo/index.xml
#------------------------------------------------------------------------------#
echo_header "test whatsnew from fastlane without CVC set"
REPOROOT=`create_test_dir`
cd $REPOROOT
fdroid_init_with_prebuilt_keystore
mkdir -p metadata/com.politedroid/en-US/changelogs/
cp $WORKSPACE/tests/repo/com.politedroid_6.apk repo
cp $WORKSPACE/tests/metadata/com.politedroid.yml metadata
echo "whatsnew test" > metadata/com.politedroid/en-US/changelogs/6.txt
sed -i -e '/CurrentVersion/d' metadata/com.politedroid.yml
$fdroid update --pretty --nosign
grep -F 'whatsnew' repo/index-v1.json
#------------------------------------------------------------------------------# #------------------------------------------------------------------------------#
echo_header "test metadata checks" echo_header "test metadata checks"

View File

@ -0,0 +1,104 @@
Categories:
- Reading
License: GPL-3.0-only
WebSite: http://aarddict.org
SourceCode: https://github.com/aarddict/android
IssueTracker: https://github.com/aarddict/android/issues
Donate: http://aarddict.org/android
FlattrID: '80944'
AutoName: Aard
Description: |-
'''Note:''' This app is no longer maintained.
* looks up words fast even with huge dictionaries like English Wikipedia
* looks up words in multiple dictionaries in multiple languages without switching
* works great as an offline Wikipedia reader
* uses same the efficient, highly compressed dictionary data storage format as the desktop version
* it can integrate with both [[org.geometerplus.zlibrary.ui.android]] and [[org.coolreader]]
Ready-made dictionaries can be found on the website, or you can roll your own
with the tools on the website.
RepoType: git
Repo: https://github.com/aarddict/android.git
Builds:
- versionName: 1.3.1
versionCode: 10
commit: 1.3.1
prebuild: mv lib libs
- versionName: 1.4.0
versionCode: 12
commit: 7df930161256324e31b2c720281629f58446b6d6
prebuild: mv lib libs
- versionName: 1.4.1
versionCode: 13
commit: b81c9c8c52de5f65b550e3c608a610962582e5cd
prebuild: mv lib libs
- versionName: 1.6.1
versionCode: 16
commit: 1.6.1
target: android-17
- versionName: 1.6.2
versionCode: 17
commit: 1.6.2
target: android-17
- versionName: 1.6.3
versionCode: 18
commit: 1.6.3
target: android-17
- versionName: 1.6.4
versionCode: 19
commit: 1.6.4
target: android-17
- versionName: 1.6.5
versionCode: 20
commit: 1.6.5
target: android-17
- versionName: 1.6.6
versionCode: 21
commit: 1.6.6
target: android-17
- versionName: 1.6.7
versionCode: 22
commit: 1.6.7
target: android-17
- versionName: 1.6.8
versionCode: 23
commit: 1.6.8
target: android-17
- versionName: 1.6.9
versionCode: 24
commit: 1.6.9
target: android-17
- versionName: 1.6.10
versionCode: 25
commit: 1.6.10
target: android-17
- versionName: 1.6.11
versionCode: 26
commit: 1.6.11
target: android-17
MaintainerNotes: |-
Github site points to https://github.com/itkach/aard2-android (itkach.aard2) as successor.
We cannot point to this app as all its builds are disabled (as of 2018-10-16).
AutoUpdateMode: Version %v
UpdateCheckMode: Tags
CurrentVersion: 1.6.11
CurrentVersionCode: 26

View File

@ -0,0 +1,551 @@
Categories:
- Reading
License: GPL-2.0-only
AuthorName: Vadim Lopatin
AuthorEmail: coolreader.org@gmail.com
WebSite: https://sourceforge.net/projects/crengine/
SourceCode: https://github.com/buggins/coolreader
IssueTracker: https://github.com/buggins/coolreader/issues
Donate: https://sourceforge.net/p/crengine/donate
AutoName: Cool Reader
Description: |-
An e-book reader. Supported formats: FB2, TXT, RTF, TCR, HTML, EPUB, CHM. Browse
free books online and add your own OPDS shares.
The default dictionary app is non-free. However, you can choose
[[aarddict.android]] as a dictionary from the Dictionary section of the
Settings.
RepoType: git
Repo: https://github.com/buggins/coolreader
Builds:
- versionName: 3.0.39-35
versionCode: 60
commit: 68ad007ac1272ef322fd61cb6591618723422380
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.40-1
versionCode: 64
commit: cr3.0.40-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.40-6
versionCode: 69
commit: cr3.0.40-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.41-3
versionCode: 75
commit: cr3.0.41-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.41-9
versionCode: 81
commit: cr3.0.41-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.42-6
versionCode: 86
commit: cr3.0.42-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.43-4
versionCode: 94
commit: cr3.0.43-4
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.43-6
versionCode: 96
commit: cr3.0.43-6
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.44-03
versionCode: 103
commit: cr3.0.44-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.44-09
versionCode: 109
commit: cr3.0.44-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-04
versionCode: 114
disable: tag points to wrong version
commit: unknown - see disabled
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-09
versionCode: 119
disable: tag points to wrong version
commit: unknown - see disabled
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-11
versionCode: 121
commit: 6c42a9b65090da9640ccb6ee317bb32de24201fb
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.45-14
versionCode: 124
commit: cr3.0.45-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-1
versionCode: 131
commit: cr3.0.46-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-5
versionCode: 135
commit: cr3.0.46-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.46-11
versionCode: 141
commit: cr3.0.46-11
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.48-5
versionCode: 155
commit: cr3.0.48-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-2
versionCode: 162
commit: cr3.0.49-2
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-5
versionCode: 165
commit: cr3.0.49-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-9
versionCode: 169
commit: cr3.0.49-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.49-16
versionCode: 176
commit: cr3.0.49-16
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.51-7
versionCode: 197
commit: cr3.0.51-7
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.52-1
versionCode: 241
commit: cr3.0.52-1
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.52-4
versionCode: 244
commit: cr3.0.52-4
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-3
versionCode: 247
commit: cr3.0.53-3
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-10
versionCode: 255
commit: cr3.0.53-10
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-14
versionCode: 259
commit: cr3.0.53-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-18
versionCode: 263
commit: c555ecd66d18b218fb255733c8b33a0825992f76
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.53-19
versionCode: 264
commit: cr3.0.53-19
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-5
versionCode: 275
commit: cr3.0.54-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-9
versionCode: 279
commit: cr3.0.54-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-33
versionCode: 303
commit: cr3.0.54-33
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-38
versionCode: 308
commit: cr3.0.54-38
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.54-47
versionCode: 447
commit: cr3.0.54-47
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-5
versionCode: 505
commit: cr3.0.55-5
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-9
versionCode: 509
commit: cr3.0.55-9
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-14
versionCode: 514
commit: cr3.0.55-14
subdir: android
rm:
- android/build.properties
buildjni:
- yes
- versionName: 3.0.55-30
versionCode: 530
commit: cr3.0.55-30
subdir: android
rm:
- android/ant.properties
buildjni:
- yes
- versionName: 3.0.55-32
versionCode: 532
commit: cr3.0.55-32
subdir: android
rm:
- android/ant.properties
buildjni:
- yes
- versionName: 3.0.56-5
versionCode: 565
disable: builds ok but crashes at cr3.0.56-5
commit: cr3.0.56-5
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.0.57-15
versionCode: 625
disable: builds ok but crashes at cr3.0.57-15
commit: cr3.0.57-15
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.0.57-16
versionCode: 626
disable: builds ok but crashes at 2f3d5fb86df316d
commit: 2f3d5fb86df316d
subdir: android
rm:
- android/ant.properties
target: android-14
buildjni:
- yes
- versionName: 3.1.2-27
versionCode: 847
commit: cr3-3.1.2-27
subdir: android
rm:
- android/ant.properties
target: android-16
buildjni:
- yes
- versionName: 3.1.2-38
versionCode: 858
disable: ndk build errors
commit: cr3-3.1.2-38
subdir: android
buildjni:
- yes
- versionName: 3.1.2-39
versionCode: 859
commit: cr3-3.1.2-39-market
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-48
versionCode: 868
commit: cr3.1.2-48
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-50
versionCode: 870
commit: cr3.1.2-50
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-51
versionCode: 871
commit: cr3-3.1.2-51
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-55
versionCode: 875
commit: cr3-3.1.2-55
subdir: android
rm:
- android/build.properties
target: android-19
buildjni:
- yes
- versionName: 3.1.2-68
versionCode: 888
commit: cr3.1.2-68
subdir: android
rm:
- android/build.properties
target: android-22
buildjni:
- yes
- versionName: 3.1.2-72
versionCode: 892
commit: cr3.1.2-71
subdir: android
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
target: android-22
buildjni:
- yes
- versionName: 3.1.2-87
versionCode: 907
commit: 1e07d15d4644c690
subdir: android
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
target: android-22
scanignore:
- cr3wx
buildjni:
- yes
- versionName: 3.2.9-1
versionCode: 2091
commit: bf48e5b7a5e89e5fc8b1f971573b5046e6b27bd3
subdir: android
gradle:
- yes
output: app/build/outputs/apk/release/app-universal-release-unsigned.apk
rm:
- android/build.properties
prebuild: sed -i -e 's/^APP_ABI\s*:=.*/APP_ABI := all/' jni/Application.mk
scanignore:
- cr3wx
ndk: r16b
- versionName: 3.2.38-1
versionCode: 32380
commit: cr3.2.38
subdir: android/app
gradle:
- yes
rm:
- cr3wx/src/resources/crrcconv.exe
prebuild:
- sed -i -e 's/\r//' ../gradle/wrapper/gradle-wrapper.properties
- sed -i -e 's/enable true/enable false/' build.gradle
ndk: r21
AutoUpdateMode: None
UpdateCheckMode: Tags
CurrentVersion: 3.2.39-1
CurrentVersionCode: 32390

View File

@ -0,0 +1,556 @@
AntiFeatures:
- NonFreeAdd
- UpstreamNonFree
Categories:
- Reading
License: GPL-2.0-or-later
AuthorName: Nikolay Pultsin
AuthorEmail: geometer@fbreader.org
AuthorWebSite: https://fbreader.org/
WebSite: https://fbreader.org/FBReaderJ
SourceCode: https://github.com/geometer/FBReaderJ
IssueTracker: https://github.com/geometer/FBReaderJ/issues
Changelog: https://raw.githubusercontent.com/geometer/FBReaderJ/HEAD/ChangeLog
Donate: https://fbreader.org/donation/make.php
AutoName: FBReader
Description: |-
'''N.B'''There are three different apks to cover the different versions of
Android. Donut covers 1.5-1.6; Froyo covers 2.0-2.3 and Honeycomb covers 3.0+.
x86 and MIPS are supported natively in all apks.
An e-book reader. Features include the ability to stock up on books from online
OPDS libraries like Project Gutenberg straight from the app. F-Droid.org has two
other addon apps that provide text-to-speech functionality and one to support
''local'' OPDS shares.
Anti-features: Addons. While there are some addons for this app that are free,
the dictionaries that are suggested are not. However, it does support
[[aarddict.android]], as long as that is installed beforehand '''and''' you
choose it via the Dictionary section of the settings.
RepoType: git
Repo: https://github.com/geometer/FBReaderJ.git
Builds:
- versionName: 0.99.11
versionCode: 9911
commit: 0.99.11
antcommands:
- package
- versionName: 0.99.12
versionCode: 9912
commit: 0.99.12
antcommands:
- package
- versionName: 0.99.15
versionCode: 9915
commit: 0.99.15
antcommands:
- package
- versionName: 0.99.18
versionCode: 9918
commit: 0.99.18
antcommands:
- package
- versionName: 1.0.9
versionCode: 10011
commit: 1.0.9
antcommands:
- package
- versionName: 1.0.11
versionCode: 10013
commit: 1.0.11
antcommands:
- package
- versionName: 1.0.12
versionCode: 10014
commit: fd349108eff9caa9152a
antcommands:
- package
- versionName: 1.1.0
versionCode: 10100
commit: 5eb993e1fac2898d2361
antcommands:
- package
- versionName: 1.1.1
versionCode: 10101
commit: 1.1.1
antcommands:
- package
- versionName: 1.1.2
versionCode: 10102
commit: 1.1.2
antcommands:
- package
- versionName: 1.1.8
versionCode: 101081
commit: 1.1.8
antcommands:
- package
- versionName: 1.1.9
versionCode: 101091
commit: 1.1.9
antcommands:
- package
- versionName: 1.1.10
versionCode: 101101
commit: 13ee5d79431815dd694e
antcommands:
- package
- versionName: 1.2.2
versionCode: 102021
commit: e63c553aeb032da828b270a735f0171d8d22c54c
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.3
versionCode: 102031
commit: 46d83bb4351c2f6ec51e0d9aa6202c86c1297e7f
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.4
versionCode: 102041
commit: 6426bcf131d4
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.2.6
versionCode: 102061
commit: 1.2.6
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.3.3
versionCode: 103031
commit: 1.3.3
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.3.6
versionCode: 103061
commit: a16e3eb7ff731edea99248f8a7c1633148a26236
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.5.5
versionCode: 105051
commit: 1.5.5
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
target: android-10
buildjni:
- yes
- versionName: 1.6.1
versionCode: 106011
commit: 1.6.1
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4-Donut
versionCode: 106040
commit: af881fe37
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4-Froyo
versionCode: 106041
commit: 696ed7704
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.6.4
versionCode: 106042
commit: b3b4667ccb
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Donut
versionCode: 107019
commit: a4a5e506b
forceversion: true
forcevercode: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Froyo
versionCode: 107020
commit: 33ffc7e5b
forceversion: true
forcevercode: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.2-Honeycomb
versionCode: 107021
commit: 0520159677
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Donut
versionCode: 107040
commit: 2c6253dd
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Froyo
versionCode: 107041
commit: 934bf7f5
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.3-Honeycomb
versionCode: 107042
commit: c4a3c7a9a
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Donut
versionCode: 107080
commit: c1470c9be1
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Froyo
versionCode: 107084
commit: 1.7.8
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.7.8-Honeycomb
versionCode: 107085
commit: 1.7.8-ics
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
buildjni:
- yes
- versionName: 1.8.2-Donut
versionCode: 108020
commit: 9bec0ff445e66a
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 1.8.2-Froyo
versionCode: 108021
commit: 0f02d4e9232227
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 1.8.2-Honeycomb+
versionCode: 108022
commit: 1112df415d
forceversion: true
prebuild:
- mkdir res/drawable
- find icons -iname "*.*" -exec cp {} res/drawable \;
androidupdate:
- third-party/AmbilWarna
- .
buildjni:
- yes
- versionName: 2.0.6-gb
versionCode: 2000610
disable: missing res with android-9
commit: 2.0.6
patch:
- fbreader-2.0.6.patch
srclibs:
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.0.6-ics
versionCode: 2000620
commit: b1dd70ff149560889e7548762046da4933e51e94
patch:
- fbreader-2.0.6.patch
srclibs:
- FBReaderJ@2.0.6
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.1-ics
versionCode: 2010020
commit: 33139e2b04ae36388956a57373ba74e8cc0ef23c
patch:
- fbreader-2.0.6.patch
srclibs:
- FBReaderJ@2.1
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-14
buildjni:
- yes
- versionName: 2.5.9-ics
versionCode: 2050920
commit: 43e14feedf10ad53ec68bf42b1644f488889381c
srclibs:
- FBReaderJ@2.5.9
- PDFParseLib@36d7479ce85638eb4f0ff9c875ec77680177da5d
- ApacheHttpClient@4.2.5
- NanoHttpd@Release-2.0.5
- JsonSimple@tag_release_1_1_1
forceversion: true
rm:
- libs/*jar
- obsolete/lib/*.jar
- src/org/geometerplus/android/fbreader/dict/OpenDictionary.java
- src/org/geometerplus/android/fbreader/dict/Lingvo.java
extlibs:
- android/android-support-v4.jar
prebuild:
- echo -e "sdk.dir=$$SDK$$\nndk.dir=$$NDK$$\n" >> local.properties
- cp local.properties third-party/AmbilWarna/
- cp local.properties third-party/android-filechooser/code/
- cp local.properties third-party/drag-sort-listview/library/
- echo 'APP_PLATFORM := android-11' >> jni/Application.mk
- pushd $$ApacheHttpClient$$/httpmime/
- $$MVN3$$ package -Dmaven.javadoc.skip=true
- popd
- cp $$ApacheHttpClient$$/httpmime/target/httpmime-4.2.5.jar libs/
- pushd $$NanoHttpd$$
- $$MVN3$$ package
- popd
- cp $$NanoHttpd$$/core/target/nanohttpd-2.0.5.jar libs/
- cp -fR $$JsonSimple$$/src/main/java/org src/
- cp -fR $$PDFParseLib$$/pdfparse-lib/src/main/java/org src/
- rm -fR src/com/paragon
- sed -i -e '/com.google.android.gms.version/d' -e '/google_play_services/d' AndroidManifest.xml
- sed -i -e '/google.services.lib.dir/d' project.properties
- mkdir third-party/drag-sort-listview/library/libs
- cp libs/android-support-v4.jar third-party/drag-sort-listview/library/libs/&&
sed -i -e '/Lingvo/d' src/org/geometerplus/android/fbreader/dict/DictionaryUtil.java
- rm -fR src/org/geometerplus/android/fbreader/network/auth
- cp -fR $$FBReaderJ$$/src/org/geometerplus/android/fbreader/network/auth src/org/geometerplus/android/fbreader/network/
- sed -i -e '/^\s*OpenDictionary.collect/d' src/org/geometerplus/android/fbreader/dict/DictionaryUtil.java
androidupdate:
- third-party/AmbilWarna
- third-party/android-filechooser/code
- third-party/drag-sort-listview/library
- .
target: android-21
buildjni:
- yes
MaintainerNotes: |-
* LingvoIntegration and OpenDictionary APIs are non-free. Remove jars and patch
depending code. Currently done with rm and sed in prebuilds.
* %v tags are currently targeting gingerbread, but have ressource conflicts
with target=android-9; they build with target=android-14
* %v-ics tags are actually based on the yotaphone branch, so we have to
use raw commits for the ice-cream-sandwich branch (look for "Merge
branch 'master' into ice-cream-sandwich" after a commit with "version
=> ...")
* ics branch uses google play, so we have to sed AM.xml and ant files.
/fbreader/network/ depends on Google Play Services, so these are
removed and replaced with the master branch which does not depend on
these.
* UCM is set to master branch, we don't care for target or device specific
releases.
TODO:
* make gingerbread/master available for android-9!
ArchivePolicy: 6 versions
AutoUpdateMode: None
UpdateCheckMode: Tags ^[0-9.]*$
VercodeOperation: '%c + 10'
CurrentVersion: 2.5.9
CurrentVersionCode: 2050920