קודם כל תודה לד' יתברך, זה פרוייקט שחשבתי שיקח לי שבוע, וסיימתי ביום..
זו האפליקציה המקורית של המעדכן אפליקציות הנודע לפני ש @jacobel640 ערך אותה.
היתרונות כאן נראה לי ברורים, לא צריך להוריד APK, להעלות לשרת וכו', האפלקציות תמיד מעודכנות וכו'.
את האפליקציה ערכתי עם AI Studio, והצלחתי להגיע למגבלה היומית..
בעזרת ד' בלנ"ד מאוחר יותר אציג את השינויים בקוד.
ישנו קובץ JSON שמאוחסן ברשת (את שלי שמתי בGITHUB), שמכיל את רשימת האפליקיצות המותרות, בעזרת ד' אני עובד על הממשק לעריכה נוחה.
לחלופין, לבקשת @iosi-poli, אפשרי גם לאחסן את הרשימה לבנה בassets.
עוד דבר, את האפליקציה תרגמתי עם AI סטודיו גם כן, אז מחילה אם יש מילים לא מובנות או משהו, דווחו ואתקן בלנ"ד.
אני מביא כאן את ה"דוגמית", יש שם ארבע אפליקציות.
להורדת האפליקציה
לגרסה עם קובץ הassets
קובץ הJSON אמור להראות כך:
[
"com.whatsapp",
"com.tranzmate",
"com.waze",
"tfilon.tfilon"
]
אפשר ליצור קובץ כזה בגיטהאב, ללחוץ על RAW, ואז להתעיק את הקישור.
חפשו בMT מנג'ר את השורה הזאת:
https://raw.githubusercontent.com/lilor159357/aurora-whitelist/refs/heads/main/whitelist.json
ותחליפו אותה עם הקישור לJSON שלכם, ויש לכם חנות אפליקציות שאתם מחליטים איזה אפליקציות יהיו בה!
לגרסה עם הקובץ בassets, פשוט לערוך את הקובץ whitelist.json.
השינויים בספויילר:
להוסיף בנתיב com/aurora/store
את הclass:
AuroraApp$2
(ליד הקלאס AuroraApp)
# classes.dex
.class Lcom/aurora/store/AuroraApp$2;
.super Ljava/lang/Object;
# interfaces
.implements Ljava/lang/Runnable;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod;
value = Lcom/aurora/store/AuroraApp;->onCreate()V
.end annotation
.annotation system Ldalvik/annotation/InnerClass;
accessFlags = 0x0
name = null
.end annotation
# instance fields
.field final synthetic this$0:Lcom/aurora/store/AuroraApp;
# direct methods
.method constructor <init>(Lcom/aurora/store/AuroraApp;)V
.registers 2
iput-object p1, p0, Lcom/aurora/store/AuroraApp$2;->this$0:Lcom/aurora/store/AuroraApp;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public run()V
.registers 6
:try_start_0
new-instance v0, Ljava/net/URL;
const-string v1, "https://raw.githubusercontent.com/lilor159357/aurora-whitelist/refs/heads/main/whitelist.json"
invoke-direct {v0, v1}, Ljava/net/URL;-><init>(Ljava/lang/String;)V
invoke-virtual {v0}, Ljava/net/URL;->openConnection()Ljava/net/URLConnection;
move-result-object v0
check-cast v0, Ljava/net/HttpURLConnection;
new-instance v1, Ljava/io/BufferedReader;
new-instance v2, Ljava/io/InputStreamReader;
invoke-virtual {v0}, Ljava/net/HttpURLConnection;->getInputStream()Ljava/io/InputStream;
move-result-object v0
invoke-direct {v2, v0}, Ljava/io/InputStreamReader;-><init>(Ljava/io/InputStream;)V
invoke-direct {v1, v2}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
:goto_20
invoke-virtual {v1}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;
move-result-object v2
if-eqz v2, :cond_2a
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
goto :goto_20
:cond_2a
new-instance v1, Lorg/json/JSONArray;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Lorg/json/JSONArray;-><init>(Ljava/lang/String;)V
sget-object v0, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
invoke-interface {v0}, Ljava/util/List;->clear()V
const/4 v0, 0x0
:goto_39
invoke-virtual {v1}, Lorg/json/JSONArray;->length()I
move-result v2
if-ge v0, v2, :cond_4b
sget-object v2, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
invoke-virtual {v1, v0}, Lorg/json/JSONArray;->getString(I)Ljava/lang/String;
move-result-object v3
invoke-interface {v2, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z
add-int/lit8 v0, v0, 0x1
goto :goto_39
:try_end_4b
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_4b} :catch_4c
:cond_4b
return-void
:catch_4c
move-exception v0
const-string v1, "Whitelist"
const-string v2, "Failed to load whitelist"
invoke-static {v1, v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
return-void
.end method
אם אתם מעדיפים את הקובץ באפליציה עצמה (בassets)
אז תשתמשו בקוד הזה בשביל AuroraApp$2:
.class Lcom/aurora/store/AuroraApp$2;
.super Ljava/lang/Object;
.implements Ljava/lang/Runnable;
# annotations
.annotation system Ldalvik/annotation/EnclosingMethod; value = Lcom/aurora/store/AuroraApp;->onCreate()V .end annotation
.annotation system Ldalvik/annotation/InnerClass; accessFlags = 0x0 name = null .end annotation
# instance fields
.field final synthetic this$0:Lcom/aurora/store/AuroraApp;
# direct methods
.method constructor <init>(Lcom/aurora/store/AuroraApp;)V
.registers 2
iput-object p1, p0, Lcom/aurora/store/AuroraApp$2;->this$0:Lcom/aurora/store/AuroraApp;
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
# virtual methods
.method public run()V
.registers 6
:try_start_0
iget-object v0, p0, Lcom/aurora/store/AuroraApp$2;->this$0:Lcom/aurora/store/AuroraApp;
invoke-virtual {v0}, Landroid/content/Context;->getAssets()Landroid/content/res/AssetManager;
move-result-object v0
const-string v1, "whitelist.json"
invoke-virtual {v0, v1}, Landroid/content/res/AssetManager;->open(Ljava/lang/String;)Ljava/io/InputStream;
move-result-object v0
new-instance v1, Ljava/io/BufferedReader;
new-instance v2, Ljava/io/InputStreamReader;
invoke-direct {v2, v0}, Ljava/io/InputStreamReader;-><init>(Ljava/io/InputStream;)V
invoke-direct {v1, v2}, Ljava/io/BufferedReader;-><init>(Ljava/io/Reader;)V
new-instance v0, Ljava/lang/StringBuilder;
invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
:goto_1f
invoke-virtual {v1}, Ljava/io/BufferedReader;->readLine()Ljava/lang/String;
move-result-object v2
if-eqz v2, :cond_29
invoke-virtual {v0, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
goto :goto_1f
:cond_29
new-instance v1, Lorg/json/JSONArray;
invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
move-result-object v0
invoke-direct {v1, v0}, Lorg/json/JSONArray;-><init>(Ljava/lang/String;)V
sget-object v0, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
invoke-interface {v0}, Ljava/util/List;->clear()V
const/4 v0, 0x0
:goto_39
invoke-virtual {v1}, Lorg/json/JSONArray;->length()I
move-result v2
if-ge v0, v2, :cond_4d
sget-object v2, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
invoke-virtual {v1, v0}, Lorg/json/JSONArray;->getString(I)Ljava/lang/String;
move-result-object v3
invoke-interface {v2, v3}, Ljava/util/List;->add(Ljava/lang/Object;)Z
add-int/lit8 v0, v0, 0x1
goto :goto_39
:cond_4d
:try_end_4d
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_4d} :catch_4e
:goto_4e
return-void
:catch_4e
move-exception v0
const-string v1, "Whitelist"
const-string v2, "Failed to load whitelist from assets"
invoke-static {v1, v2, v0}, Landroid/util/Log;->e(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I
return-void
.end method
שינויים בתוך הקלאס AuroraApp (בנתיב com/aurora/store):
להוסיף אחרי static fields #
את זה:
.field public static authorizedApps:Ljava/util/List;
.annotation system Ldalvik/annotation/Signature;
value = {
"Ljava/util/List<",
"Ljava/lang/String;",
">;"
}
.end annotation
.end field
להוסיף בתוך onCreate
לפני line 4. (אחרי ה-invoke-super)
את זה:
new-instance v0, Ljava/util/concurrent/CopyOnWriteArrayList;
invoke-direct {v0}, Ljava/util/concurrent/CopyOnWriteArrayList;-><init>()V
sput-object v0, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
new-instance v0, Ljava/lang/Thread;
new-instance v1, Lcom/aurora/store/AuroraApp$2;
invoke-direct {v1, p0}, Lcom/aurora/store/AuroraApp$2;-><init>(Lcom/aurora/store/AuroraApp;)V
invoke-direct {v0, v1}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V
invoke-virtual {v0}, Ljava/lang/Thread;->start()V
שינויים בקלאס MainActivity (בנתיב com/aurora/store):
חסימת פתיחת קישורים לא מורשים:
בתוך onCreate
לפני line 15. (אחרי ה-invoke-super)
invoke-virtual {p0}, Landroid/app/Activity;->getIntent()Landroid/content/Intent;
move-result-object v0
invoke-virtual {v0}, Landroid/content/Intent;->getData()Landroid/net/Uri;
move-result-object v0
if-eqz v0, :cond_3c
const-string v1, "id"
invoke-virtual {v0, v1}, Landroid/net/Uri;->getQueryParameter(Ljava/lang/String;)Ljava/lang/String;
move-result-object v0
if-eqz v0, :cond_3c
sget-object v1, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
const/4 v2, 0x1
if-eqz v1, :cond_2c
invoke-interface {v1, v0}, Ljava/util/List;->contains(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_2c
const/4 v2, 0x0
:cond_2c
if-eqz v2, :cond_3c
const-string v0, "אפליקציה זו אינה מורשת"
const/4 v1, 0x1
invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
move-result-object v0
invoke-virtual {v0}, Landroid/widget/Toast;->show()V
invoke-virtual {p0}, Landroid/app/Activity;->finish()V
return-void
:cond_3c
הסתרת כפתור המשחקים:
בתוך method public constructor <init>()V
להחליף מline 39. עד לפני line 65.
עם זה:
.line 39
const v1, 0x7f0902fa
.line 42
invoke-static {v1}, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;
.line 45
move-result-object v1
.line 46
const/4 v2, 0x2
.line 49
new-array v3, v2, [Ljava/lang/Integer;
.line 52
const/4 v4, 0x0
.line 53
aput-object v0, v3, v4
.line 56
const/4 v0, 0x1
.line 57
aput-object v1, v3, v0
ובתוך onCreate
להוסיף לפני line 148.
את זה:
invoke-virtual {v0}, Lcom/google/android/material/navigation/NavigationBarView;->getMenu()Landroid/view/Menu;
move-result-object v5
const v6, 0x7f090144
invoke-interface {v5, v6}, Landroid/view/Menu;->removeItem(I)V
שינויים בקלאס AppDetailsFragment (בנתיב com/aurora/store/view/ui/details):
להוסיף בתוך method public final V
לפני line 10.
invoke-virtual {v0}, Lx4/a;->v0()LM2/a;
move-result-object v3
check-cast v3, Lcom/aurora/store/databinding/FragmentDetailsBinding;
#זה מסתיר את התגובות
# Get the review layout binding from the main binding
iget-object v4, v3, Lcom/aurora/store/databinding/FragmentDetailsBinding;->layoutDetailsReview:Lcom/aurora/store/databinding/LayoutDetailsReviewBinding;
# Get its root view and set visibility to GONE
invoke-virtual {v4}, Lcom/aurora/store/databinding/LayoutDetailsReviewBinding;->getRoot()Landroid/view/View;
move-result-object v4
const/16 v5, 0x8
invoke-virtual {v4, v5}, Landroid/view/View;->setVisibility(I)V
#זה מסתיר את הצילו"מים בפרטי אפליקציה
iget-object v6, v3, Lcom/aurora/store/databinding/FragmentDetailsBinding;->layoutDetailDescription:Lcom/aurora/store/databinding/LayoutDetailsDescriptionBinding;
# Get the EpoxyRecyclerView (which contains the screenshots) from the description layout binding
iget-object v7, v6, Lcom/aurora/store/databinding/LayoutDetailsDescriptionBinding;->epoxyRecycler:Lcom/airbnb/epoxy/EpoxyRecyclerView;
# Set its visibility to GONE
const/16 v8, 0x8
invoke-virtual {v7, v8}, Landroid/view/View;->setVisibility(I)V
שינויים בקלאס StreamCluster (בנתיב com/aurora/gplayapi/data/models):
להחליף את כל הmethod:
getClusterAppList
עם זה:
.method public final getClusterAppList()Ljava/util/List;
.registers 7
.annotation system Ldalvik/annotation/Signature;
value = {
"()Ljava/util/List<",
"Lcom/aurora/gplayapi/data/models/App;",
">;"
}
.end annotation
.prologue
.line 1
iget-object v0, p0, Lcom/aurora/gplayapi/data/models/StreamCluster;->clusterAppList:Ljava/util/List;
.line 2
sget-object v1, Lcom/aurora/store/AuroraApp;->authorizedApps:Ljava/util/List;
.line 3
if-eqz v1, :cond_31
invoke-interface {v1}, Ljava/util/List;->isEmpty()Z
move-result v2
if-eqz v2, :cond_d
goto :goto_31
.line 4
:cond_d
new-instance v2, Ljava/util/ArrayList;
invoke-direct {v2}, Ljava/util/ArrayList;-><init>()V
.line 5
invoke-interface {v0}, Ljava/util/List;->iterator()Ljava/util/Iterator;
move-result-object v3
.line 6
:cond_16
:goto_16
invoke-interface {v3}, Ljava/util/Iterator;->hasNext()Z
move-result v4
if-eqz v4, :cond_30
.line 7
invoke-interface {v3}, Ljava/util/Iterator;->next()Ljava/lang/Object;
move-result-object v4
check-cast v4, Lcom/aurora/gplayapi/data/models/App;
.line 8
invoke-virtual {v4}, Lcom/aurora/gplayapi/data/models/App;->getPackageName()Ljava/lang/String;
move-result-object v5
.line 9
invoke-interface {v1, v5}, Ljava/util/List;->contains(Ljava/lang/Object;)Z
move-result v5
if-eqz v5, :cond_16
.line 10
invoke-interface {v2, v4}, Ljava/util/List;->add(Ljava/lang/Object;)Z
goto :goto_16
.line 12
:cond_30
return-object v2
.line 13
:cond_31
:goto_31
new-instance v0, Ljava/util/ArrayList;
invoke-direct {v0}, Ljava/util/ArrayList;-><init>()V
return-object v0
.end method