soul-browser/sources/java/okhttp3/internal/platform/AndroidPlatform.java
KaKi87 550ddb0413
Decompile and recreate Soul Browser v1.4.85 with APK CI builds (#1)
* Decompile and recreate Soul Browser v1.4.85 with APK CI builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix CI build: include bundled google.jks and remove PR trigger

The apktool build failed in CI because app/unknown/.../google.jks was
excluded by the *.jks gitignore rule. Whitelist app-bundled JKS files
and commit the missing resource.

Also remove the redundant pull_request workflow trigger.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Change package ID to com.github.kaki87.soulbrowser

Rename the application ID so the rebuilt APK can be installed
alongside the original Soul Browser from Google Play.

- Update AndroidManifest package, permissions, providers, and actions
- Update R class references in smali (com/github/kaki87/soulbrowser/R)
- Update shortcuts.xml targetPackage
- Rename app label to "Soul Rebuild" for easy identification

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install compatibility: remove split APK metadata and bundle native libs

The rebuilt APK still declared requiredSplitTypes and Play Store split
metadata, causing Android to reject standalone installs as incompatible.

- Remove requiredSplitTypes and split-related manifest meta-data
- Merge native libs from all ABI splits with uncompressed storage
- Page-align before signing for extractNativeLibs=false
- Add .so to apktool doNotCompress list

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix install failure: use apksigner v2/v3 and bundle arm64 native libs

Target SDK 36 requires APK Signature Scheme v2+, but jarsigner only
produces v1 signatures, causing Android to reject the install.

- Sign with apksigner (v1+v2+v3) instead of jarsigner
- Add arm64-v8a native libraries from universal Soul Browser 1.4.79
- Set extractNativeLibs=true for reliable sideload installs
- Commit stable debug keystore for consistent signatures across builds

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Add committed debug keystore for consistent APK signatures

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix startup crash: use original classes2.dex desugar libraries

Apktool recompiles smali_classes2 into a broken classes2.dex, causing
ClassNotFoundException for j$.com.android.tools.r8.a at ML Kit init.

Inject the original classes2.dex (Java 8+ desugar libs) after apktool
build instead of using the recompiled version.

Co-authored-by: KaKi87 <KaKi87@pm.me>

* Fix missing drawable resources from density split APKs

The base APK is an app bundle module; density-specific drawables like
seek_thumb_nor_b live in config.xhdpi.apk and were missing after rebuild,
causing Resources$NotFoundException at runtime.

- Merge non-9-patch resources from split APKs before apktool build
- Sync public.xml IDs from R smali only when backing files exist
- Add 713 density-specific resource IDs to public.xml

Co-authored-by: KaKi87 <KaKi87@pm.me>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-08-10 16:07:14 +02:00

282 lines
12 KiB
Java

package okhttp3.internal.platform;
import android.content.Context;
import android.net.http.X509TrustManagerExtensions;
import android.os.Build;
import android.os.StrictMode;
import android.security.NetworkSecurityPolicy;
import android.util.Log;
import com.google.android.gms.ads.RequestConfiguration;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArraySet;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.X509TrustManager;
import kotlin.Metadata;
import kotlin.collections.CollectionsKt;
import kotlin.jvm.internal.Intrinsics;
import kotlin.jvm.internal.SourceDebugExtension;
import okhttp3.OkHttpClient;
import okhttp3.internal.SuppressSignatureCheck;
import okhttp3.internal.platform.android.AndroidCertificateChainCleaner;
import okhttp3.internal.platform.android.AndroidLog;
import okhttp3.internal.platform.android.AndroidSocketAdapter;
import okhttp3.internal.platform.android.BouncyCastleSocketAdapter;
import okhttp3.internal.platform.android.ConscryptSocketAdapter;
import okhttp3.internal.platform.android.DeferredSocketAdapter;
import okhttp3.internal.platform.android.SocketAdapter;
import okhttp3.internal.platform.android.StandardAndroidSocketAdapter;
import okhttp3.internal.tls.CertificateChainCleaner;
import okhttp3.internal.tls.TrustRootIndex;
@SuppressSignatureCheck
@Metadata(d1 = {"\u0000\u0010\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0003\b\u0007\u0018\u00002\u00020\u00012\u00020\u0002:\u0002\u0003\u0004¨\u0006\u0005"}, d2 = {"Lokhttp3/internal/platform/AndroidPlatform;", "Lokhttp3/internal/platform/Platform;", "Lokhttp3/internal/platform/ContextAwarePlatform;", "CustomTrustRootIndex", "Companion", "okhttp"}, k = 1, mv = {2, 2, 0}, xi = 48)
@SourceDebugExtension({"SMAP\nAndroidPlatform.kt\nKotlin\n*S Kotlin\n*F\n+ 1 AndroidPlatform.kt\nokhttp3/internal/platform/AndroidPlatform\n+ 2 _Collections.kt\nkotlin/collections/CollectionsKt___CollectionsKt\n+ 3 fake.kt\nkotlin/jvm/internal/FakeKt\n*L\n1#1,186:1\n774#2:187\n865#2,2:188\n1#3:190\n*S KotlinDebug\n*F\n+ 1 AndroidPlatform.kt\nokhttp3/internal/platform/AndroidPlatform\n*L\n60#1:187\n60#1:188,2\n*E\n"})
/* loaded from: classes4.dex */
public final class AndroidPlatform extends Platform implements ContextAwarePlatform {
public static final boolean e;
/* renamed from: c, reason: collision with root package name */
public Context f22170c;
public final ArrayList d;
@Metadata(d1 = {"\u0000\n\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\b\u0086\u0003\u0018\u00002\u00020\u0001¨\u0006\u0002"}, d2 = {"Lokhttp3/internal/platform/AndroidPlatform$Companion;", RequestConfiguration.MAX_AD_CONTENT_RATING_UNSPECIFIED, "okhttp"}, k = 1, mv = {2, 2, 0}, xi = 48)
/* loaded from: classes4.dex */
public static final class Companion {
}
@Metadata(d1 = {"\u0000\n\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\b\u0080\b\u0018\u00002\u00020\u0001¨\u0006\u0002"}, d2 = {"Lokhttp3/internal/platform/AndroidPlatform$CustomTrustRootIndex;", "Lokhttp3/internal/tls/TrustRootIndex;", "okhttp"}, k = 1, mv = {2, 2, 0}, xi = 48)
/* loaded from: classes4.dex */
public static final /* data */ class CustomTrustRootIndex implements TrustRootIndex {
/* renamed from: a, reason: collision with root package name */
public final X509TrustManager f22171a;
public final Method b;
public CustomTrustRootIndex(X509TrustManager trustManager, Method findByIssuerAndSignatureMethod) {
Intrinsics.checkNotNullParameter(trustManager, "trustManager");
Intrinsics.checkNotNullParameter(findByIssuerAndSignatureMethod, "findByIssuerAndSignatureMethod");
this.f22171a = trustManager;
this.b = findByIssuerAndSignatureMethod;
}
@Override // okhttp3.internal.tls.TrustRootIndex
public final X509Certificate a(X509Certificate cert) {
Intrinsics.checkNotNullParameter(cert, "cert");
try {
Object invoke = this.b.invoke(this.f22171a, cert);
Intrinsics.checkNotNull(invoke, "null cannot be cast to non-null type java.security.cert.TrustAnchor");
return ((TrustAnchor) invoke).getTrustedCert();
} catch (IllegalAccessException e) {
throw new AssertionError("unable to get issues and signature", e);
} catch (InvocationTargetException unused) {
return null;
}
}
public final boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof CustomTrustRootIndex)) {
return false;
}
CustomTrustRootIndex customTrustRootIndex = (CustomTrustRootIndex) obj;
return Intrinsics.areEqual(this.f22171a, customTrustRootIndex.f22171a) && Intrinsics.areEqual(this.b, customTrustRootIndex.b);
}
public final int hashCode() {
return this.b.hashCode() + (this.f22171a.hashCode() * 31);
}
public final String toString() {
return "CustomTrustRootIndex(trustManager=" + this.f22171a + ", findByIssuerAndSignatureMethod=" + this.b + ')';
}
}
static {
boolean z;
if (Build.VERSION.SDK_INT < 29) {
z = true;
} else {
z = false;
}
e = z;
}
public AndroidPlatform() {
AndroidSocketAdapter androidSocketAdapter;
int i = StandardAndroidSocketAdapter.g;
Intrinsics.checkNotNullParameter("com.android.org.conscrypt", "packageName");
try {
Class<?> sslSocketClass = Class.forName("com.android.org.conscrypt.OpenSSLSocketImpl");
Intrinsics.checkNotNull(sslSocketClass, "null cannot be cast to non-null type java.lang.Class<in javax.net.ssl.SSLSocket>");
Class<?> sslSocketFactoryClass = Class.forName("com.android.org.conscrypt.OpenSSLSocketFactoryImpl");
Intrinsics.checkNotNull(sslSocketFactoryClass, "null cannot be cast to non-null type java.lang.Class<in javax.net.ssl.SSLSocketFactory>");
Class<?> paramClass = Class.forName("com.android.org.conscrypt.SSLParametersImpl");
Intrinsics.checkNotNull(paramClass);
Intrinsics.checkNotNullParameter(sslSocketClass, "sslSocketClass");
Intrinsics.checkNotNullParameter(sslSocketFactoryClass, "sslSocketFactoryClass");
Intrinsics.checkNotNullParameter(paramClass, "paramClass");
androidSocketAdapter = new AndroidSocketAdapter(sslSocketClass);
} catch (Exception e2) {
CopyOnWriteArraySet copyOnWriteArraySet = AndroidLog.f22175a;
String name = OkHttpClient.class.getName();
Intrinsics.checkNotNullExpressionValue(name, "getName(...)");
AndroidLog.a(name, 5, "unable to load android socket classes", e2);
androidSocketAdapter = null;
}
List listOfNotNull = CollectionsKt.listOfNotNull((Object[]) new SocketAdapter[]{androidSocketAdapter, new DeferredSocketAdapter(AndroidSocketAdapter.f), new DeferredSocketAdapter(ConscryptSocketAdapter.f22180a), new DeferredSocketAdapter(BouncyCastleSocketAdapter.f22179a)});
ArrayList arrayList = new ArrayList();
for (Object obj : listOfNotNull) {
if (((SocketAdapter) obj).a()) {
arrayList.add(obj);
}
}
this.d = arrayList;
}
@Override // okhttp3.internal.platform.ContextAwarePlatform
public final void a(Context context) {
this.f22170c = context;
}
@Override // okhttp3.internal.platform.ContextAwarePlatform
/* renamed from: b, reason: from getter */
public final Context getF22169c() {
return this.f22170c;
}
@Override // okhttp3.internal.platform.Platform
public final CertificateChainCleaner c(X509TrustManager trustManager) {
X509TrustManagerExtensions x509TrustManagerExtensions;
Intrinsics.checkNotNullParameter(trustManager, "trustManager");
Intrinsics.checkNotNullParameter(trustManager, "trustManager");
AndroidCertificateChainCleaner androidCertificateChainCleaner = null;
try {
x509TrustManagerExtensions = new X509TrustManagerExtensions(trustManager);
} catch (IllegalArgumentException unused) {
x509TrustManagerExtensions = null;
}
if (x509TrustManagerExtensions != null) {
androidCertificateChainCleaner = new AndroidCertificateChainCleaner(trustManager, x509TrustManagerExtensions);
}
if (androidCertificateChainCleaner != null) {
return androidCertificateChainCleaner;
}
return super.c(trustManager);
}
@Override // okhttp3.internal.platform.Platform
public final TrustRootIndex d(X509TrustManager trustManager) {
Intrinsics.checkNotNullParameter(trustManager, "trustManager");
try {
StrictMode.noteSlowCall("buildTrustRootIndex");
Method declaredMethod = trustManager.getClass().getDeclaredMethod("findTrustAnchorByIssuerAndSignature", X509Certificate.class);
declaredMethod.setAccessible(true);
Intrinsics.checkNotNull(declaredMethod);
return new CustomTrustRootIndex(trustManager, declaredMethod);
} catch (NoSuchMethodException unused) {
return super.d(trustManager);
}
}
@Override // okhttp3.internal.platform.Platform
public final void e(SSLSocket sslSocket, String str, List protocols) {
Object obj;
Intrinsics.checkNotNullParameter(sslSocket, "sslSocket");
Intrinsics.checkNotNullParameter(protocols, "protocols");
ArrayList arrayList = this.d;
int size = arrayList.size();
int i = 0;
while (true) {
if (i < size) {
obj = arrayList.get(i);
i++;
if (((SocketAdapter) obj).b(sslSocket)) {
break;
}
} else {
obj = null;
break;
}
}
SocketAdapter socketAdapter = (SocketAdapter) obj;
if (socketAdapter != null) {
socketAdapter.d(sslSocket, str, protocols);
}
}
@Override // okhttp3.internal.platform.Platform
public final void f(Socket socket, InetSocketAddress address, int i) {
Intrinsics.checkNotNullParameter(socket, "socket");
Intrinsics.checkNotNullParameter(address, "address");
try {
socket.connect(address, i);
} catch (ClassCastException e2) {
if (Build.VERSION.SDK_INT == 26) {
throw new IOException("Exception in connect", e2);
}
throw e2;
}
}
@Override // okhttp3.internal.platform.Platform
public final String g(SSLSocket sslSocket) {
Object obj;
Intrinsics.checkNotNullParameter(sslSocket, "sslSocket");
ArrayList arrayList = this.d;
int size = arrayList.size();
int i = 0;
while (true) {
if (i < size) {
obj = arrayList.get(i);
i++;
if (((SocketAdapter) obj).b(sslSocket)) {
break;
}
} else {
obj = null;
break;
}
}
SocketAdapter socketAdapter = (SocketAdapter) obj;
if (socketAdapter == null) {
return null;
}
return socketAdapter.c(sslSocket);
}
@Override // okhttp3.internal.platform.Platform
public final boolean i(String hostname) {
Intrinsics.checkNotNullParameter(hostname, "hostname");
if (Build.VERSION.SDK_INT >= 24) {
return NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted(hostname);
}
return NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted();
}
@Override // okhttp3.internal.platform.Platform
public final void j(int i, String message, Throwable th) {
Intrinsics.checkNotNullParameter(message, "message");
if (i == 5) {
Log.w("OkHttp", message, th);
} else {
Log.i("OkHttp", message, th);
}
}
@Override // okhttp3.internal.platform.Platform
public final SSLContext l() {
StrictMode.noteSlowCall("newSSLContext");
return super.l();
}
}