Code Monkey home page Code Monkey logo

exodus-android-app's Introduction

Exodus - Android Application

Exodus is an Android application that lets you know what trackers are embedded in apps installed on your smartphone using the εxodus platform. It also lets you know the permissions required by any apps on your smartphone.

It helps you to take your privacy back!

Build Status GitHub release (latest by date) Crowdin

Screenshots

Contributing

If you want to help us improve this application, you can:

Translation

Do you want to help to translate the application? Contribute here:

https://crowdin.com/project/exodus-android-app

  • Exodus is fully translated into 5 languages and 27 languages can be translated in Crowdin.
  • You can translate the app on Github but don't forget to insert a backslash \ before any apostrophe '.

Development

If you would like to improve app code and have development skills, you are most welcome.

  • You can find work in issues.
  • Before submitting pull requests please, execute Kotlin Liner and instrumented tests.
  • Change needs to work on all devices between Android 6 and Android 14.
  • UI changes need to work in light mode, dark mode, and RTL.
  • Do not create pull requests to update dependencies, we have dependabot.

Build APK Debug

./gradlew assembleDebug

Execute Kotlin Liner

./gradlew app:ktlintCheck --info

Execute instrumented tests

./gradlew connectedAndroidTest

How to use app on Android 5

  • We have recently drop the support of Android 5, but 3.3.0 version continue to be available here

Links

exodus-android-app's People

Contributors

altonss avatar boffire avatar codeurimpulsif avatar connyduck avatar dependabot[bot] avatar fabianski7 avatar hegleb avatar iraamaro avatar jean-baptistec avatar jfoucry avatar metezd avatar mrhappycloud avatar n1snt avatar nassr-allah avatar patdyn avatar phyrz91 avatar pnu-s avatar poussinou avatar rudloff avatar samantatarun avatar schoumi avatar sivasubramaniamv avatar solokot avatar starry-shivam avatar stellarsand avatar stom79 avatar theimpulson avatar tygoee avatar u039b avatar unbranched avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

exodus-android-app's Issues

App cant find any Apps, even if it should

I try the F-Droid Version and the Playstore Version but both dont show any Apps.
I have for example the "Super Backup App" App from Playstore (with Yalp) installed but Exodus doesnt show it.

I run LineageOS 15.1 (Android 8.1) under OnePlus 2 without GAPPS and use Aurora (Yalp Fork) for download & install Playstore apps

Yalp packages are still not recognized properly

Exodus 1.1.0 should have added detection for Yalp store apps. However, on a phone without a Google account, it doesn't. I had a friend who avoids Google stuff install Exodus from F-Droid yesterday, but it refused to show any of his Yalp apps. (OnePlus 3, newest updates.)

Is there still a requirement for Google anywhere in the code?

Search by tracker name

I would be great if one could search by a tracker name (e.g. Facebook) and have all app listed with that tracker.

Crash when pressing the back button

Hello,
I'm using 93f64ed and If I press the phone's back button while the app is still processing applications, it crashes with this error:

03-16 16:26:16.898 18564 18586 E AndroidRuntime: FATAL EXCEPTION: Thread-1771
03-16 16:26:16.898 18564 18586 E AndroidRuntime: Process: org.eu.exodus_privacy.exodusprivacy, PID: 18564
03-16 16:26:16.898 18564 18586 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.Activity.runOnUiThread(java.lang.Runnable)' on a null object reference
03-16 16:26:16.898 18564 18586 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.AppListFragment.updateProgress(AppListFragment.java:155)
03-16 16:26:16.898 18564 18586 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.AppListFragment.access$000(AppListFragment.java:46)
03-16 16:26:16.898 18564 18586 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.AppListFragment$1.onProgress(AppListFragment.java:148)
03-16 16:26:16.898 18564 18586 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager$NetworkProcessingThread.getReports(NetworkManager.java:230)
03-16 16:26:16.898 18564 18586 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager$NetworkProcessingThread.run(NetworkManager.java:118)

(This is not really critical since I'm closing the app anyway.)

Remove white strips around the screen

To get a little bit more space and have a better presentation, it could be nice removing partly if not totally, white strips around the screen. Especially the ones on top and bottom of the screen.

Expand detection methods

How does the app detect them?

Eg. I have ACR installed from APK yet I get a screen with no apps from source.

What are the conditions? Google Play store enabled/installed? Can't you track by hash? Signature?

/LE: Ok, so you check what app installed the package and if it's com.android.vending then you consider them for testing.

Translations not in 2.0.0

Version 2.0.0 don't embeded some translations due to uncomplete support.
Exodus will have a plateform to centralize all translation and work on it to help our awesome translator to be as update as they can on new translation to avoid this in the futur.

identify if a given tracker is on my phone

On alpha android app it would be great to be able to select a tracker from a list (alternatively from the report of a specfic app) and then be able to see all apps on my phone that contains the culprit.

This would allow to remove all occurrences of a given tracker.

[accessibility] Colour contrasts

Hi,

After a discussion on Mastodon, I went and checked contrasts in the app with Colour Contrast Analyser.

(Sorry, results are in French as it's my system's installation language.)

Rule of thumb

On a mobile application one should strive to aim at 4.5:1 minimum contrast, because of the conditions in which a mobile app is used (think reflections on the glass, smaller screen, etc.).

Title bar

Premier plan:#FFFFFF
Arrière plan:#684972

Le ratio de contraste est de: 7,5:1

Le texte est conforme de niveau AA
Le texte est conforme de niveau AAA
Le grand texte est conforme de niveau AA
Le grand texte est conforme de niveau AAA

All good!

Default text

Premier plan:#737373
Arrière plan:#FAFAFA

Le ratio de contraste est de: 4,5:1

Le texte est conforme de niveau AA
Le texte est non conforme de niveau AAA
Le grand texte est conforme de niveau AA
Le grand texte est conforme de niveau AAA

Yay! This one is good straight away!

Red square

Premier plan:#732A31
Arrière plan:#E56772

Le ratio de contraste est de: 3,1:1

Le texte est non conforme de niveau AA
Le texte est non conforme de niveau AAA
Le grand texte est conforme de niveau AA
Le grand texte est non conforme de niveau AAA

Orange-yellow (or something ;) ) square

Premier plan:#7F6511
Arrière plan:#FFDA65

Le ratio de contraste est de: 4,1:1

Le texte est non conforme de niveau AA
Le texte est non conforme de niveau AAA
Le grand texte est conforme de niveau AA
Le grand texte est non conforme de niveau AAA

Green square

Premier plan:#2B5D38
Arrière plan:#6FC385

Le ratio de contraste est de: 3,6:1

Le texte est non conforme de niveau AA
Le texte est non conforme de niveau AAA
Le grand texte est conforme de niveau AA
Le grand texte est non conforme de niveau AAA

Suggestion

What I would do:

  • For dark backgrounds:
    • Darken the background colour a bit more (if needed)
    • Use white type in the squares
  • For light backgrounds:
    • Lighten the background colour a bit more (if needed)
    • Use black type in the squares

A handy tool to do just that is tanaguru contrast finder.

Example results:

  • Red square
    • Background: #CB4A5A (slightly changed)
    • Foreground: #FFFFFF
    • Result: 9.98 – VALID
  • Orange-yellow-etc :)
    • Background: #FFDA65 (unchanged)
    • Foreground: #000000 (black)
    • Result: 15.46 – VALID
  • Green
    • Background: #6FC385 (unchanged)
    • Foreground: #000000 (black)
    • Result: 9.82 – VALID

It does look a bit more stern than the semitransparent black that is currently used. I can help you to choose less drastic colours if needed ;)

Applications not detected when installed over third party stores?

Having installed LineageOS with microG on my phone, most of my apps I install are from F-Droid.
However, for some cases I have to use non-open source apps.
However, I do not have installed the Google Playstore, but instead Aurora store, which acts as a proxy for the Playstore to download apps from the Playstore anonymously.

After I installed Exodus, it is not detecting the installed apps, which definitely have trackers.
"It appears that you don't have any apps installed for the source we test (Google play store)"

Is there a way to not rely on the Playstore to analyze the installed apps for trackers?

Could not allocate CursorWindow

Version: 2.0.0

Exodus did the initial scan after loading the trackers, now it fails to load the db, this time no memory issue tho (#57).

04-12 21:03:52.486  1266  4224 D GameManagerService: identifyGamePackage. org.eu.exodus_privacy.exodusprivacy, mCurrentUserId: 0, callerUserId: 0
04-12 21:03:52.486  1266  4224 D GamePkgDataHelper: getGamePkgData(). org.eu.exodus_privacy.exodusprivacy
04-12 21:03:52.883  1266  1898 E Watchdog: !@Sync 3974 [2020-04-12 21:03:52.883] FD count : 529
04-12 21:03:53.466 27473 27493 W y.exodusprivac: resources.arsc in APK '/data/app/SCRUBBED/base.apk' is compressed.
04-12 21:03:53.840 27473 27493 E CursorWindow: CursorWindow create() failed with -12 errno
04-12 21:03:53.840 27473 27493 E CursorWindow: Could not allocate CursorWindow '/data/user/0/org.eu.exodus_privacy.exodusprivacy/databases/Exodus.db' of size 4194304 due to error -12.
04-12 21:03:53.846 27473 27493 E AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
04-12 21:03:53.846 27473 27493 E AndroidRuntime: Process: org.eu.exodus_privacy.exodusprivacy, PID: 27473
04-12 21:03:53.846 27473 27493 E AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.os.AsyncTask$3.done(AsyncTask.java:354)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.FutureTask.run(FutureTask.java:271)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.lang.Thread.run(Thread.java:764)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: Caused by: android.database.CursorWindowAllocationException: Cursor window allocation of 4194304 bytes failed. # Open Cursors=323 (# cursors opened by this proc=323)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.CursorWindow.<init>(CursorWindow.java:136)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.sqlite.SQLiteCursor.clearOrCreateWindow(SQLiteCursor.java:315)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:155)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:149)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:259)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.manager.DatabaseManager.getReportFor(DatabaseManager.java:192)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.ComputeAppListTask.buildViewModelFromPackageInfo(ComputeAppListTask.java:79)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.ComputeAppListTask.convertPackagesToViewModels(ComputeAppListTask.java:63)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.ComputeAppListTask.doInBackground(ComputeAppListTask.java:44)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at org.eu.exodus_privacy.exodusprivacy.fragments.ComputeAppListTask.doInBackground(ComputeAppListTask.java:16)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at android.os.AsyncTask$2.call(AsyncTask.java:333)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
04-12 21:03:53.846 27473 27493 E AndroidRuntime: 	... 4 more
04-12 21:03:53.852  1266  2040 D Debug   : !@DumpState : SHIP
04-12 21:03:53.852  1266  2040 D Debug   : !@DumpState : debug level:0x4f4c
04-12 21:03:53.852  1266  2040 D Debug   : !@Dumpstate : Finally, system will skip dumpstate
04-12 21:03:53.852  1266  2040 W ActivityManager: crash : org.eu.exodus_privacy.exodusprivacy,0
04-12 21:03:53.857  1266  2040 W ActivityManager:   Force finishing activity org.eu.exodus_privacy.exodusprivacy/.MainActivity

Sounds like a cursor leak in DatabaseManager.java.

Please use a secure PRNG for adding noise to the applications list

Hello,

in the getReports method, the code is using the following snippet:

            // Add some random packages to avoid tracking
            Random rand = new Random(Thread.currentThread().getId());
            int alea = rand.nextInt(120) % 10 + 11;
            for(int i = 0 ; i < alea; i++) {
                int val = rand.nextInt(handles.size());
                packages.add(handles.get(val));
            }

This could lead, at some degrees, a rogue server to be able to do educated guess about what applications are installed or not. It would be cool to use SecureRandom instead.

This is a super-minor issue, feel free to close it with an E_DONTCARE :)

Only one app displayed

Hello,

I have several apps installed on my phone, from both F-Droid and Yalp Store (and several of them have Exodus reports), but Exodus 1.0.3 only displays one app.
If I refresh the list, it displays "Processing Applications: x/40" but does not add more app.

Am I missing something?

remove limitation that the app must be installed by Google Play

My phone does not have Google Play, but I'd still like to use this scanner. Right now, it returns no apps, saying that it didn't find any that were installed by Google Play. But I have a bunch of apps that came from other F-Droid repos besides f-droid.org.

Encoding troubles with certain symbols

Some people like to use quotes in their version names
for example the monerujo app ( com.m2049r.xmrwallet )
As long as website and exodus app have this representation:

Version: 1.11.5 &apos;Chernushka&apos;

The scan results will always tell you: this version hasn't been scanned.

Add github link to the app description

I think it would make sense to add a link to this repository on the application description (on Google Play Store and F-droid). This would:

  • show that the app is free and open source
  • allow people to jump right to the code if they want to
  • allow people to create issues easily

As always, happy to discuss/debate about this :)

What happens when an app is removed from the Play store?

In another issue thread, I thought I saw that Exodus only tracks apps that were installed via the Google Play Store.

Is there a way to show to the user that an app has since been removed from the Play store? I keep seeing news articles about malicious apps that have been removed for whatever reason... but I haven't found a way to check and see if any of my installed apps have been removed.

Is that something this app could visualize?

Option to uninstall app

The impact your app would be greater if someone could directly uninstall an app after seeing how many tracker etc. are implemented. I imagine a button in the appbar on the right with an intent to ACTION_DELETE.

Add support for landscape mode

Hello,

I tried the app (1.0.4) on an Android 4.2 tablet and it forces the display in portrait mode (which can be annoying when the tablet is attached to a keyboard).

Crash after initial scan

The application show the apps, start the loading indicator and crash a few seconds latter.

Android 5.0.1 (Samsung S4)

(It worked before Exodus v1.2.2)

E/art: Throwing OutOfMemoryError "Failed to allocate a 24 byte allocation with 6 free bytes and 6B until OOM"

And then:


I/art: Clamp target GC heap from 143MB to 128MB
    Alloc concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 0% free, 127MB/128MB, paused 1.586ms total 320.281ms
I/art: WaitForGcToComplete blocked for 331.237ms for cause Alloc
E/art: Throwing OutOfMemoryError "Failed to allocate a 28 byte allocation with 6 free bytes and 6B until OOM" (recursive case)
E/art: "main" prio=5 tid=1 Runnable
      | group="main" sCount=0 dsCount=0 obj=0x77645f48 self=0xb4e07800
      | sysTid=17544 nice=0 cgrp=apps sched=0/0 handle=0xb6fa0ec8
      | state=R schedstat=( 0 0 0 ) utm=637 stm=32 core=1 HZ=100
      | stack=0xbe15c000-0xbe15e000 stackSize=8MB
      | held mutexes= "mutator lock"(shared held)
        at java.lang.Float.valueOf(Float.java:403)
        at android.animation.PropertyValuesHolder$FloatPropertyValuesHolder.getAnimatedValue(PropertyValuesHolder.java:1268)
        at android.animation.ValueAnimator.getAnimatedValue(ValueAnimator.java:760)
        at android.support.v4.widget.CircularProgressDrawable$1.onAnimationUpdate(CircularProgressDrawable.java:571)
        at android.animation.ValueAnimator.animateValue(ValueAnimator.java:1283)
        at android.animation.ValueAnimator.animationFrame(ValueAnimator.java:1207)
        at android.animation.ValueAnimator.doAnimationFrame(ValueAnimator.java:1248)
        at android.animation.ValueAnimator$AnimationHandler.doAnimationFrame(ValueAnimator.java:659)
        at android.animation.ValueAnimator$AnimationHandler.run(ValueAnimator.java:682)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
        at android.view.Choreographer.doCallbacks(Choreographer.java:590)
        at android.view.Choreographer.doFrame(Choreographer.java:559)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5951)
        at java.lang.reflect.Method.invoke!(Native method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
I/art: Clamp target GC heap from 143MB to 128MB
    Alloc concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 0% free, 127MB/128MB, paused 1.556ms total 358.734ms
I/art: WaitForGcToComplete blocked for 671.752ms for cause Alloc
E/art: Throwing OutOfMemoryError "Failed to allocate a 28 byte allocation with 6 free bytes and 6B until OOM" (recursive case)
    "Thread-1041" prio=5 tid=14 Runnable
      | group="main" sCount=0 dsCount=0 obj=0x132090f0 self=0xb4e0ac00
      | sysTid=17619 nice=0 cgrp=apps sched=0/0 handle=0xaf256e80
      | state=R schedstat=( 0 0 0 ) utm=1049 stm=109 core=0 HZ=100
      | stack=0x9b818000-0x9b81a000 stackSize=1036KB
      | held mutexes= "mutator lock"(shared held)
        at java.util.Arrays.copyOfRange(Arrays.java:2701)
        at java.lang.String.<init>(String.java:421)
        at org.json.JSONTokener.nextString(JSONTokener.java:210)
        at org.json.JSONTokener.nextValue(JSONTokener.java:107)
        at org.json.JSONTokener.readObject(JSONTokener.java:362)
        at org.json.JSONTokener.nextValue(JSONTokener.java:100)
        at org.json.JSONTokener.readArray(JSONTokener.java:430)
        at org.json.JSONTokener.nextValue(JSONTokener.java:103)
        at org.json.JSONTokener.readObject(JSONTokener.java:385)
        at org.json.JSONTokener.nextValue(JSONTokener.java:100)
        at org.json.JSONObject.<init>(JSONObject.java:156)
        at org.json.JSONObject.<init>(JSONObject.java:173)
        at org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager$NetworkProcessingThread.makeDataRequest(NetworkManager.java:165)
        at org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager$NetworkProcessingThread.getApplications(NetworkManager.java:221)
        at org.eu.exodus_privacy.exodusprivacy.manager.NetworkManager$NetworkProcessingThread.run(NetworkManager.java:125)
I/art: Clamp target GC heap from 143MB to 128MB
    Alloc concurrent mark sweep GC freed 9(608B) AllocSpace objects, 0(0B) LOS objects, 0% free, 127MB/128MB, paused 1.495ms total 309.661ms
I/art: WaitForGcToComplete blocked for 636.138ms for cause Alloc
I/art: WaitForGcToComplete blocked for 298.553ms for cause Alloc
D/AndroidRuntime: Shutting down VM
I/Process: Sending signal. PID: 17544 SIG: 9
Disconnected from the target VM, address: 'localhost:8600', transport: 'socket'

Add donation link to app

I know you accept donations, and maybe most of your users comes from the Android app so I would make sense to let Android users know they can donate.

Display F-Droid apps

Now that F-Droid apps can be scanned with exodus, the android app should display these applications

Updated ar (Arabic) translation

I have translated your application into ar (Arabic). Here is the xml:

app/src/main/res/values/strings.xml
<resources>
    <string name="app_name">Exodus Privacy</string>
    <string name="app_logo">شعار التطبيق</string>
    <string name="trackers">المتعقِّبون:</string>
    <string name="permissions">التصريحات:</string>
    <string name="network_error">الشبكة غير متوفرة</string>
    <string name="not_connected">لا يوجد اتصال بشبكة الانترنت</string>
    <string name="json_error">خطأ JSON</string>
    <string name="installed">النسخة المثبتة:</string>
    <string name="report_version">النسخة المُجرَّبة:</string>
    <string name="no_trackers">لم نعثر على أي متعقِّب قمنا بتجريبه</string>
    <string name="no_permissions">هذا التطبيق لا يتطلب أية تصريحات</string>
    <string name="tested">ليس هناك أي تقرير عن النسخة المثبة، إنّ البيانات المعروضة تتعلق بنسخة قديمة لنفس التطبيق.</string>
    <string name="analysed">لم يتم بعد فحص هذا التطبيق بواسطة Exodus Privacy</string>
    <string name="no_package_manager">يبدو أنّ نظام جهازك لا يسمح بالوصول إلى قائمة التطبيقات المثبة.</string>
    <string name="no_app_found">يبدو أنّك لم تقم بتثبيت أي تطبيق مِن المصدر الذي نقوم بفحصه (متجر جوجل للتطبيقات).</string>
    <string name="get_reports_connection">جلب التطبيقات: في انتظار الاتصال بالخادم</string>
    <string name="get_reports">جارٍ جلب التطبيقات</string>
    <string name="parse_application">فحص التطبيقات:</string>
    <string name="parse_trackers">فحص المتعقّبون:</string>
    <string name="get_trackers_connection">جلب المتعقّبين: في انتظار الاتصال بالخادم</string>
    <string name="get_trackers">جارٍ جلب المُتعقّبين</string>

    <!-- Menu -->
    <string name="menu_action_filter">عامل التصفية</string>
</resources>

Translation made with Stringlate.

Make Exodus usage more private

From what I understand currently there is some noise being added to help obfuscate what apps you have installed, but multiple syncs will make the noise meaningless. This is concerning especially from a privacy-focused app.

Is there no way this can be done in an end-to-end encrypted/zero knowledge manner?

One solution is an optional setting to download the report for every app, and then locally only the reports for installed apps are kept.

Another is Tor support. This way all you know is some anonymous user has XYZ installed apps.

app crash after initial applications scan

Hello,

when I start Exodus, it analyzes the installed apps, then crashes. If I try to restart it, I don't see a new apps scan, the crash is immediate. I'm on LineageOS 14.1.

Here is the relevant part of logcat:

09-03 20:11:45.889 17950 17950 D AndroidRuntime: Shutting down VM
09-03 20:11:45.891 17950 17950 E AndroidRuntime: FATAL EXCEPTION: main
09-03 20:11:45.891 17950 17950 E AndroidRuntime: Process: org.eu.exodus_privacy.exodusprivacy, PID: 17950
09-03 20:11:45.891 17950 17950 E AndroidRuntime: java.lang.IllegalArgumentException: the bind value at index 2 is null
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1318)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1165)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1036)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1204)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at org.eu.exodus_privacy.exodusprivacy.manager.DatabaseManager.getReportFor(DatabaseManager.java:196)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter$ApplicationListViewHolder.setData(ApplicationListAdapter.java:153)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter.onBindViewHolder(ApplicationListAdapter.java:91)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at org.eu.exodus_privacy.exodusprivacy.adapters.ApplicationListAdapter.onBindViewHolder(ApplicationListAdapter.java:45)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6673)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6714)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5647)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5913)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3529)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4082)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:606)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at com.android.internal.policy.DecorView.onLayout(DecorView.java:729)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.View.layout(View.java:17641)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewGroup.layout(ViewGroup.java:5575)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2346)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2068)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1254)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6344)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.Choreographer$CallbackRecord.run(Choreographer.java:874)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.Choreographer.doCallbacks(Choreographer.java:686)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.Choreographer.doFrame(Choreographer.java:621)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:860)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:751)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6186)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
09-03 20:11:45.891 17950 17950 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)
09-03 20:11:45.893 2978 3724 W ActivityManager: Force finishing activity org.eu.exodus_privacy.exodusprivacy/.MainActivity
09-03 20:11:45.906 17950 17950 I Process : Sending signal. PID: 17950 SIG: 9
09-03 20:11:45.913 505 505 E lowmemorykiller: Error writing /proc/17950/oom_score_adj; errno=22
09-03 20:11:45.915 2978 3158 W ActivityManager: Failed setting process group of 17950 to 1
09-03 20:11:45.915 2978 3158 W System.err: java.lang.IllegalArgumentException: Given thread 17970 does not exist
09-03 20:11:45.915 2978 3158 W System.err: at android.os.Process.setThreadPriority(Native Method)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.am.ActivityManagerService.applyOomAdjLocked(ActivityManagerService.java:20777)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.am.ActivityManagerService.updateOomAdjLocked(ActivityManagerService.java:21310)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.am.BroadcastQueue.processCurBroadcastLocked(BroadcastQueue.java:274)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.am.BroadcastQueue.processNextBroadcast(BroadcastQueue.java:1225)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.am.BroadcastQueue$BroadcastHandler.handleMessage(BroadcastQueue.java:172)
09-03 20:11:45.916 2978 3158 W System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
09-03 20:11:45.916 2978 3158 W System.err: at android.os.Looper.loop(Looper.java:154)
09-03 20:11:45.916 2978 3158 W System.err: at android.os.HandlerThread.run(HandlerThread.java:61)
09-03 20:11:45.916 2978 3158 W System.err: at com.android.server.ServiceThread.run(ServiceThread.java:46)

09-03 20:11:45.957 2978 3559 W InputDispatcher: channel '8dca51f org.eu.exodus_privacy.exodusprivacy/org.eu.exodus_privacy.exodusprivacy.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
09-03 20:11:45.957 2978 3559 E InputDispatcher: channel '8dca51f org.eu.exodus_privacy.exodusprivacy/org.eu.exodus_privacy.exodusprivacy.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
09-03 20:11:45.958 2978 25442 D GraphicsStats: Buffer count: 11
09-03 20:11:45.960 2978 25442 I WindowManager: WIN DEATH: Window{8dca51f u0 org.eu.exodus_privacy.exodusprivacy/org.eu.exodus_privacy.exodusprivacy.MainActivity}
09-03 20:11:45.960 2978 25442 W InputDispatcher: Attempted to unregister already unregistered input channel '8dca51f org.eu.exodus_privacy.exodusprivacy/org.eu.exodus_privacy.exodusprivacy.MainActivity (server)'
09-03 20:11:45.964 2978 4596 I ActivityManager: Process org.eu.exodus_privacy.exodusprivacy (pid 17950) has died
09-03 20:11:45.964 2978 4596 D ActivityManager: cleanUpApplicationRecord -- 17950

Thanks,

Rémi

Avoid large download and informing the server of the list of installed application

Today the Application fetch two things:

The list of all applications known by exodus:

https://reports.exodus-privacy.eu.org/api/applications

{"applications": [
    {
      "id": 50261,
       "handle": "org.eu.exodus_privacy.exodusprivacy",
       "name": "Exodus Privacy",
       "creator": "Exodus Privacy",
       "downloads": "10,000+ downloads",
       "app_uid": "B6FECF6541A4C151B6FB1AB1D77AD012C95349DF",
       "icon_phash": "93967134568205988083521687304934410531",
       "report_updated_at": 1566315960.731061
  }
]}

For each installed application on the phone, the list of reports:

https://reports.exodus-privacy.eu.org/api/search/org.eu.exodus_privacy.exodusprivacy

{
  "org.eu.exodus_privacy.exodusprivacy": {
    "reports": [
      {
        "downloads": "10,000+ downloads",
        "creation_date": "2019-07-30T21:23:18.334Z",
        "updated_at": "2019-08-20T10:34:49.189Z",
        "trackers": [],
        "version_code": "7",
        "id": 87886,
        "version": "1.2.0"
      }
    ],
    "name": "Exodus Privacy",
    "creator": "Exodus Privacy"
}

This has two drawback:

  • The first download is a large json file
  • The second one reveal the list of installed application to the server

These two dowload could be combined, to reduce the size of the download while protecting the privacy:

A single entry point:

https://reports.exodus-privacy.eu.org/api/search/<SHA256>

Where <SHA256> is the beginning (4 char for example) of the SHA256 of the app id (org.eu.exodus_privacy.exodusprivacy)
The server answer with all application (with reports) that match the begining of that checksum:

{"applications": [
    {
      "id": 50261,
       "handle": "org.eu.exodus_privacy.exodusprivacy",
       "name": "Exodus Privacy",
       "creator": "Exodus Privacy",
       "downloads": "10,000+ downloads",
       "app_uid": "B6FECF6541A4C151B6FB1AB1D77AD012C95349DF",
       "icon_phash": "93967134568205988083521687304934410531",
       "report_updated_at": 1566315960.731061,
        "reports": [
        {
            "downloads": "10,000+ downloads",
            "creation_date": "2019-07-30T21:23:18.334Z",
            "updated_at": "2019-08-20T10:34:49.189Z",
            "trackers": [],
            "version_code": "7",
            "id": 87886,
            "version": "1.2.0"
        }
        ]
    }
]}

The application could decide the length of the beginning of the checksum, to balance download size vs privacy: a length of 1 will strongly protect the privacy but will download 3% of the database. The full length will download only one application but will reveal it to the server. A length corresponding to 10-100 applications could be reasonable, and configurable by the user.

F-Droid

Hello,

Are there any plans to distribute this app on F-Droid?

Add a scrollbar on the side

Adding a scrollbar on the side, hidden when there's no movement and appearing when there's would allow user to know where in the list he currently is.

Display bug with 100+ permissions

This sounds silly, but "Google Play services" is shown as an app with 197 permissions on the Exodus Privay application, which does not display properly with the new colored buttons. See below:

Screenshot1:

image

Screenshot2:

image

Sort apps by trackers count

Adding the ability to sort apps by their trackers count or as default would helps to identify quickly wich apps needs inspection / replacement.

Sort by impact

Instead of just listing apps in alphabetical order. maybe some filters such as most permissions/trackers to least permissions/trackers ?

Please add to the description what the permissions are used for

It might be partly obvious, but being explicit would be much preferred – as there might be misunderstandings: Are the network permissions used for …

  • retrieving definitions of known trackers from some server or
  • transmitting app information to some server for "remote evaluation"?

Not everybody is capable of extracting that from the source code 😉

Use new option from exodus API

A new option is available on the exodus API to return just enough data for the android app
https://reports.exodus-privacy.eu.org/api/applications?option=short

Now you can start using it :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.