Skip to content

Commit 2363b80

Browse files
authored
android: stability fixes and xposed api v101 (#531)
1 parent 99616d6 commit 2363b80

166 files changed

Lines changed: 12400 additions & 7773 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

android/app/build.gradle.kts

Lines changed: 76 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,73 @@
1+
import java.util.Properties
2+
13
plugins {
24
alias(libs.plugins.android.application)
3-
alias(libs.plugins.kotlin.android)
45
alias(libs.plugins.kotlin.compose)
56
alias(libs.plugins.aboutLibraries)
7+
// alias(libs.plugins.hilt)
68
id("kotlin-parcelize")
79
}
810

11+
val props = Properties().apply {
12+
load(rootProject.file("local.properties").inputStream())
13+
}
14+
915
android {
16+
signingConfigs {
17+
create("release") {
18+
storeFile = file(props["RELEASE_STORE_FILE"] as String)
19+
storePassword = props["RELEASE_STORE_PASSWORD"] as String
20+
keyAlias = props["RELEASE_KEY_ALIAS"] as String
21+
keyPassword = props["RELEASE_KEY_PASSWORD"] as String
22+
}
23+
}
1024
namespace = "me.kavishdevar.librepods"
11-
compileSdk = 36
25+
compileSdk = 37
1226

1327
defaultConfig {
1428
applicationId = "me.kavishdevar.librepods"
1529
minSdk = 33
16-
targetSdk = 36
17-
versionCode = 9
30+
targetSdk = 37
31+
versionCode = 28
1832
versionName = "0.2.0"
1933
}
20-
2134
buildTypes {
2235
release {
23-
isMinifyEnabled = false
36+
isMinifyEnabled = true
37+
isShrinkResources = true
2438
proguardFiles(
2539
getDefaultProguardFile("proguard-android-optimize.txt"),
2640
"proguard-rules.pro"
2741
)
42+
externalNativeBuild {
43+
cmake {
44+
arguments += "-DCMAKE_BUILD_TYPE=Release"
45+
}
46+
}
47+
buildConfigField("Boolean", "PLAY_BUILD", "false")
48+
signingConfig = signingConfigs.getByName("release")
49+
}
50+
debug {
51+
buildConfigField("Boolean", "PLAY_BUILD", "false")
52+
signingConfig = signingConfigs.getByName("release")
53+
}
54+
create("playRelease") {
55+
initWith(getByName("release"))
56+
buildConfigField("Boolean", "PLAY_BUILD", "true")
57+
}
58+
create("playDebug") {
59+
initWith(getByName("debug"))
60+
buildConfigField("Boolean", "PLAY_BUILD", "true")
2861
}
2962
}
3063
compileOptions {
31-
sourceCompatibility = JavaVersion.VERSION_1_8
32-
targetCompatibility = JavaVersion.VERSION_1_8
33-
}
34-
kotlinOptions {
35-
jvmTarget = "1.8"
64+
sourceCompatibility = JavaVersion.VERSION_21
65+
targetCompatibility = JavaVersion.VERSION_21
3666
}
3767
buildFeatures {
3868
compose = true
3969
viewBinding = true
70+
buildConfig = true
4071
}
4172
androidResources {
4273
generateLocaleConfig = true
@@ -49,18 +80,41 @@ android {
4980
}
5081
sourceSets {
5182
getByName("main") {
52-
res.srcDirs("src/main/res", "src/main/res-apple")
83+
res.directories+="src/main/res-apple"
84+
}
85+
}
86+
87+
ndkVersion = "30.0.14904198"
88+
89+
flavorDimensions += "env"
90+
91+
productFlavors {
92+
create("normal") {
93+
dimension = "env"
94+
externalNativeBuild {
95+
cmake {
96+
arguments += "-DIS_XPOSED=OFF"
97+
}
98+
}
99+
}
100+
create("xposed") {
101+
dimension = "env"
102+
externalNativeBuild {
103+
cmake {
104+
arguments += "-DIS_XPOSED=ON"
105+
}
106+
}
107+
versionNameSuffix = "-xposed"
53108
}
54109
}
55110
}
56111

57112
dependencies {
113+
implementation(platform(libs.androidx.compose.bom))
58114
implementation(libs.accompanist.permissions)
59-
implementation(libs.hiddenapibypass)
60115
implementation(libs.androidx.core.ktx)
61116
implementation(libs.androidx.lifecycle.runtime.ktx)
62117
implementation(libs.androidx.activity.compose)
63-
implementation(platform(libs.androidx.compose.bom))
64118
implementation(libs.androidx.ui)
65119
implementation(libs.androidx.ui.graphics)
66120
implementation(libs.androidx.ui.tooling.preview)
@@ -72,15 +126,18 @@ dependencies {
72126
implementation(libs.haze.materials)
73127
implementation(libs.androidx.dynamicanimation)
74128
implementation(libs.androidx.compose.ui)
129+
implementation(libs.androidx.compose.material.icons.core)
130+
implementation(libs.billing)
75131
debugImplementation(libs.androidx.compose.ui.tooling)
76132
implementation(libs.androidx.compose.foundation.layout)
77133
implementation(libs.aboutlibraries)
78134
implementation(libs.aboutlibraries.compose.m3)
79-
// compileOnly(fileTree(mapOf("dir" to "libs", "include" to listOf("*.aar"))))
80-
// implementation(fileTree(mapOf("dir" to "lib", "include" to listOf("*.aar"))))
81-
compileOnly(files("libs/libxposed-api-100.aar"))
82-
debugImplementation(files("libs/backdrop-debug.aar"))
83-
releaseImplementation(files("libs/backdrop-release.aar"))
135+
implementation(libs.backdrop)
136+
// implementation(libs.hilt)
137+
// implementation(libs.hilt.compiler)
138+
add("xposedCompileOnly", libs.libxposed.api)
139+
add("xposedImplementation", libs.libxposed.service)
140+
add("playReleaseImplementation", libs.billing)
84141
}
85142

86143
aboutLibraries {
-125 KB
Binary file not shown.
-119 KB
Binary file not shown.

android/app/proguard-rules.pro

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,7 @@
1818

1919
# If you keep the line number information, uncomment this to
2020
# hide the original source file name.
21-
#-renamesourcefileattribute SourceFile
21+
#-renamesourcefileattribute SourceFile
22+
23+
-keep class androidx.compose.** { *; }
24+
-dontwarn androidx.compose.**

android/app/src/main/AndroidManifest.xml

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
1515
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
1616
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
17-
<uses-permission
18-
android:name="android.permission.BLUETOOTH_PRIVILEGED"
19-
tools:ignore="ProtectedPermissions" />
17+
<!-- <uses-permission-->
18+
<!-- android:name="android.permission.BLUETOOTH_PRIVILEGED"-->
19+
<!-- tools:ignore="ProtectedPermissions" />-->
2020
<uses-permission android:name="android.permission.BLUETOOTH" />
2121
<uses-permission
2222
android:name="android.permission.BLUETOOTH_SCAN"
@@ -26,15 +26,17 @@
2626
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2727
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
2828
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
29-
<uses-permission android:name="android.permission.INTERNET" />
29+
<!-- <uses-permission android:name="android.permission.INTERNET" />-->
3030
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
3131
tools:ignore="ScopedStorage" />
32-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
33-
android:maxSdkVersion="30" />
34-
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
35-
android:maxSdkVersion="30" />
32+
<!-- <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"-->
33+
<!-- android:maxSdkVersion="30" />-->
34+
<!-- <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"-->
35+
<!-- android:maxSdkVersion="30" />-->
36+
<uses-permission android:name="com.android.vending.BILLING" />
3637

3738
<application
39+
android:name=".LibrePodsApplication"
3840
android:allowBackup="true"
3941
android:dataExtractionRules="@xml/data_extraction_rules"
4042
android:enableOnBackInvokedCallback="true"
@@ -45,10 +47,9 @@
4547
android:supportsRtl="true"
4648
android:theme="@style/Theme.LibrePods"
4749
android:description="@string/app_description"
48-
tools:ignore="UnusedAttribute"
49-
tools:targetApi="31">
50+
tools:ignore="UnusedAttribute" >
5051
<receiver
51-
android:name=".widgets.NoiseControlWidget"
52+
android:name=".presentation.widgets.NoiseControlWidget"
5253
android:exported="false">
5354
<intent-filter>
5455
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@@ -60,7 +61,7 @@
6061
</receiver>
6162

6263
<receiver
63-
android:name=".widgets.BatteryWidget"
64+
android:name=".presentation.widgets.BatteryWidget"
6465
android:exported="false">
6566
<intent-filter>
6667
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
@@ -114,17 +115,17 @@
114115
<action android:name="android.service.quicksettings.action.QS_TILE" />
115116
</intent-filter>
116117
</service>
117-
<service
118-
android:name=".services.AppListenerService"
119-
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
120-
android:exported="true">
121-
<intent-filter>
122-
<action android:name="android.accessibilityservice.AccessibilityService" />
123-
</intent-filter>
124-
<meta-data
125-
android:name="android.accessibilityservice"
126-
android:resource="@xml/app_listener_service_config" />
127-
</service>
118+
<!-- <service-->
119+
<!-- android:name=".services.AppListenerService"-->
120+
<!-- android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"-->
121+
<!-- android:exported="true">-->
122+
<!-- <intent-filter>-->
123+
<!-- <action android:name="android.accessibilityservice.AccessibilityService" />-->
124+
<!-- </intent-filter>-->
125+
<!-- <meta-data-->
126+
<!-- android:name="android.accessibilityservice"-->
127+
<!-- android:resource="@xml/app_listener_service_config" />-->
128+
<!-- </service>-->
128129
<receiver
129130
android:name=".receivers.BootReceiver"
130131
android:enabled="true"

android/app/src/main/cpp/CMakeLists.txt

Lines changed: 56 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,61 @@ cmake_minimum_required(VERSION 3.22.1)
33
project("l2c_fcr_hook")
44
set(CMAKE_CXX_STANDARD 23)
55

6-
add_library(${CMAKE_PROJECT_NAME} SHARED
7-
l2c_fcr_hook.cpp
8-
l2c_fcr_hook.h)
6+
option(IS_XPOSED "Build Xposed components" OFF)
97

10-
target_link_libraries(${CMAKE_PROJECT_NAME}
8+
add_library(bluetooth_socket SHARED
9+
bluetooth_socket.cpp
10+
)
11+
12+
target_compile_options(bluetooth_socket PRIVATE
13+
-O2
14+
-fvisibility=hidden
15+
)
16+
17+
target_link_options(bluetooth_socket PRIVATE
18+
-Wl,--strip-all
19+
-Wl,--gc-sections
20+
)
21+
22+
target_link_libraries(bluetooth_socket
1123
android
12-
log)
24+
log
25+
)
26+
27+
if(IS_XPOSED)
28+
29+
set(XPOSED_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../xposed/cpp)
30+
31+
add_library(l2c_fcr_hook SHARED
32+
${XPOSED_SRC_DIR}/l2c_fcr_hook.cpp
33+
34+
${XPOSED_SRC_DIR}/xz/xz_crc32.c
35+
${XPOSED_SRC_DIR}/xz/xz_crc64.c
36+
${XPOSED_SRC_DIR}/xz/xz_sha256.c
37+
${XPOSED_SRC_DIR}/xz/xz_dec_stream.c
38+
${XPOSED_SRC_DIR}/xz/xz_dec_lzma2.c
39+
${XPOSED_SRC_DIR}/xz/xz_dec_bcj.c
40+
)
41+
42+
target_include_directories(l2c_fcr_hook PRIVATE
43+
${XPOSED_SRC_DIR}
44+
${XPOSED_SRC_DIR}/xz
45+
)
46+
47+
target_compile_definitions(l2c_fcr_hook PRIVATE
48+
XZ_DEC_X86
49+
XZ_DEC_ARM
50+
XZ_DEC_ARMTHUMB
51+
XZ_DEC_ARM64
52+
XZ_DEC_ANY_CHECK
53+
XZ_USE_CRC64
54+
XZ_USE_SHA256
55+
XZ_DEC_CONCATENATED
56+
)
57+
58+
target_link_libraries(l2c_fcr_hook
59+
android
60+
log
61+
)
62+
63+
endif()
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include <jni.h>
2+
#include <pthread.h>
3+
#include <array>
4+
#include <string>
5+
6+
static JavaVM* gVm = nullptr;
7+
8+
template<size_t N>
9+
constexpr auto encryptString(const char (&str)[N], char key) {
10+
std::array<char, N> encrypted{};
11+
for (size_t i = 0; i < N; i++) {
12+
encrypted[i] = str[i] ^ key;
13+
}
14+
return encrypted;
15+
}
16+
17+
template<size_t N>
18+
static std::string decryptString(const std::array<char, N>& encrypted, char key) {
19+
std::string result(N - 1, '\0');
20+
for (size_t i = 0; i < N - 1; i++) {
21+
result[i] = encrypted[i] ^ key;
22+
}
23+
return result;
24+
}
25+
26+
#define ENC(str) encryptString(str, 0x47)
27+
#define DEC(arr) decryptString(arr, 0x47).c_str()
28+
29+
__attribute__((visibility("hidden")))
30+
static JavaVM* getVm() { return gVm; }
31+
32+
__attribute__((visibility("default")))
33+
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
34+
gVm = vm;
35+
36+
auto fn = [](void*) -> void* {
37+
constexpr auto c1 = ENC("dalvik/system/VMRuntime");
38+
constexpr auto c2 = ENC("getRuntime");
39+
constexpr auto c3 = ENC("()Ldalvik/system/VMRuntime;");
40+
constexpr auto c4 = ENC("setHiddenApiExemptions");
41+
constexpr auto c5 = ENC("([Ljava/lang/String;)V");
42+
constexpr auto c6 = ENC("java/lang/String");
43+
constexpr auto c7 = ENC("Landroid/bluetooth/BluetoothSocket;");
44+
constexpr auto c8 = ENC("Landroid/bluetooth/BluetoothDevice;");
45+
46+
JNIEnv* env;
47+
getVm()->AttachCurrentThread(&env, nullptr);
48+
49+
jclass vmRuntime = env->FindClass(DEC(c1));
50+
jmethodID getRuntime = env->GetStaticMethodID(vmRuntime, DEC(c2), DEC(c3));
51+
jmethodID setExemptions = env->GetMethodID(vmRuntime, DEC(c4), DEC(c5));
52+
53+
jobject runtime = env->CallStaticObjectMethod(vmRuntime, getRuntime);
54+
jobjectArray prefixes = env->NewObjectArray(
55+
2, env->FindClass(DEC(c6)), nullptr);
56+
env->SetObjectArrayElement(prefixes, 0, env->NewStringUTF(DEC(c7)));
57+
env->SetObjectArrayElement(prefixes, 1, env->NewStringUTF(DEC(c8)));
58+
59+
env->CallVoidMethod(runtime, setExemptions, prefixes);
60+
getVm()->DetachCurrentThread();
61+
return nullptr;
62+
};
63+
64+
pthread_t t;
65+
pthread_create(&t, nullptr, fn, nullptr);
66+
pthread_join(t, nullptr);
67+
return JNI_VERSION_1_6;
68+
}

0 commit comments

Comments
 (0)