Ndk build (#753)

* Update dependencies

* Use prefab dobby

* NDK build

* Add ccache

* Fix library copy

* rm CMakeLists.txt
This commit is contained in:
vvb2060 2021-06-20 11:46:38 +08:00 committed by GitHub
parent 2b593be1d5
commit 74f93dbd7a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 77 additions and 173 deletions

2
.gitattributes vendored
View File

@ -8,3 +8,5 @@
# Denote all files that are truly binary and should not be modified.
*.so binary
*.dex binary
*.jar binary
*.png binary

View File

@ -52,7 +52,7 @@ jobs:
key: gradle-builds-core-${{ github.sha }}
restore-keys: |
gradle-builds
- name: Cache Cmake
- name: Cache Ccache
uses: actions/cache@v2
with:
path: ~/.ccache
@ -64,6 +64,8 @@ jobs:
ccache -o max_size=2G
ccache -o hash_dir=false
- name: Build with Gradle
env:
NDK_CCACHE: ccache
run: |
[ $(du -s ~/.gradle/wrapper | awk '{ print $1 }') -gt 250000 ] && rm -rf ~/.gradle/wrapper/* || true
find ~/.gradle/caches -exec touch -d "2 days ago" {} + || true

3
.gitmodules vendored
View File

@ -4,6 +4,3 @@
[submodule "core/src/main/cpp/external/DexBuilder"]
path = core/src/main/cpp/external/DexBuilder
url = https://github.com/LSPosed/DexBuilder.git
[submodule "core/src/main/cpp/external/Dobby"]
path = core/src/main/cpp/external/Dobby
url = https://github.com/LSPosed/Dobby.git

View File

@ -26,7 +26,6 @@ plugins {
id("org.gradle.idea")
id("com.android.application")
id("androidx.navigation.safeargs")
kotlin("android")
}
// workaround for AS.
@ -210,7 +209,7 @@ dependencies {
implementation("androidx.fragment:fragment:1.3.4")
implementation("androidx.navigation:navigation-fragment:$navVersion")
implementation("androidx.navigation:navigation-ui:$navVersion")
implementation("androidx.recyclerview:recyclerview:1.2.0")
implementation("androidx.recyclerview:recyclerview:1.2.1")
implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0")
implementation("com.caverock:androidsvg-aar:1.4")
implementation("com.github.bumptech.glide:glide:$glideVersion")

View File

@ -28,7 +28,6 @@ buildscript {
classpath("com.android.tools.build:gradle:7.0.0-beta04")
classpath("org.eclipse.jgit:org.eclipse.jgit:5.10.0.202012080955-r")
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5")
classpath(kotlin("gradle-plugin", version = "1.4.32"))
}
}

1
core/.gitignore vendored
View File

@ -4,3 +4,4 @@
/release
*.iml
/.cxx
src/main/cpp/main/src/config.cpp

View File

@ -17,8 +17,8 @@
* Copyright (C) 2021 LSPosed Contributors
*/
import com.android.build.api.variant.impl.ApplicationVariantImpl
import com.android.build.api.component.analytics.AnalyticsEnabledApplicationVariant
import com.android.build.api.variant.impl.ApplicationVariantImpl
import com.android.build.gradle.BaseExtension
import com.android.ide.common.signing.KeystoreHelper
import org.apache.tools.ant.filters.FixCrLfFilter
@ -29,7 +29,6 @@ import java.security.MessageDigest
plugins {
id("com.android.application")
kotlin("android")
}
val moduleName = "LSPosed"
@ -59,6 +58,7 @@ val verName: String by rootProject.extra
dependencies {
implementation("dev.rikka.ndk:riru:${moduleMinRiruVersionName}")
implementation("dev.rikka.ndk.thirdparty:cxx:1.1.0")
implementation("io.github.vvb2060.ndk:dobby:1.0")
implementation("com.android.tools.build:apksig:7.0.0-beta03")
implementation("org.apache.commons:commons-lang3:3.12.0")
implementation("de.upb.cs.swt:axml:2.1.1")
@ -87,29 +87,9 @@ android {
multiDexEnabled = false
externalNativeBuild {
cmake {
abiFilters("arm64-v8a", "armeabi-v7a", "x86", "x86_64")
val flags = arrayOf(
"-ffixed-x18",
"-Qunused-arguments",
"-fno-rtti", "-fno-exceptions",
"-fno-stack-protector",
"-fomit-frame-pointer",
"-Wno-builtin-macro-redefined",
"-Wl,--exclude-libs,ALL",
"-D__FILE__=__FILE_NAME__",
"-DRIRU_MODULE",
"-DRIRU_MODULE_API_VERSION=$moduleMaxRiruApiVersion",
"""-DMODULE_NAME=\"$riruModuleId\"""",
)
cppFlags("-std=c++20", *flags)
cFlags("-std=c18", *flags)
arguments(
"-DANDROID_STL=none",
"-DVERSION_CODE=$verCode",
"-DVERSION_NAME=$verName",
)
targets("lspd")
ndkBuild {
arguments += "RIRU_MODULE_API_VERSION=$moduleMaxRiruApiVersion"
arguments += "MODULE_NAME=$riruModuleId"
}
}
@ -123,56 +103,14 @@ android {
}
buildTypes {
debug {
externalNativeBuild {
cmake {
arguments.addAll(
arrayOf(
"-DCMAKE_CXX_FLAGS_DEBUG=-Og",
"-DCMAKE_C_FLAGS_DEBUG=-Og"
)
)
}
}
}
release {
isMinifyEnabled = true
proguardFiles("proguard-rules.pro")
externalNativeBuild {
cmake {
val flags = arrayOf(
"-fvisibility=hidden",
"-fvisibility-inlines-hidden",
"-Wno-unused-value",
"-ffunction-sections",
"-fdata-sections",
"-Wl,--gc-sections",
"-Wl,--strip-all",
"-fno-unwind-tables",
"-fno-asynchronous-unwind-tables"
)
cppFlags.addAll(flags)
cFlags.addAll(flags)
val configFlags = arrayOf(
"-Oz",
"-DNDEBUG"
).joinToString(" ")
arguments.addAll(
arrayOf(
"-DCMAKE_CXX_FLAGS_RELEASE=$configFlags",
"-DCMAKE_CXX_FLAGS_RELWITHDEBINFO=$configFlags",
"-DCMAKE_C_FLAGS_RELEASE=$configFlags",
"-DCMAKE_C_FLAGS_RELWITHDEBINFO=$configFlags"
)
)
}
}
}
}
externalNativeBuild {
cmake {
path("src/main/cpp/CMakeLists.txt")
ndkBuild {
path("src/main/cpp/Android.mk")
}
}
@ -278,8 +216,7 @@ androidComponents.onVariants { v ->
rename(".*\\.apk", "manager.apk")
}
into("lib") {
from("${buildDir}/intermediates/cmake/$variantLowered/obj")
exclude("**/*.txt")
from("${buildDir}/intermediates/stripped_native_libs/$variantLowered/out/lib")
}
val dexOutPath = if (variantLowered == "release")
"$buildDir/intermediates/dex/$variantLowered/minify${variantCapped}WithR8" else
@ -342,3 +279,13 @@ androidComponents.onVariants { v ->
}
}
}
val generateVersion = task("generateVersion", Copy::class) {
inputs.property("VERSION_CODE", verCode)
inputs.property("VERSION_NAME", verName)
from("${projectDir}/src/main/cpp/main/template")
include("config.cpp")
expand("VERSION_CODE" to verCode, "VERSION_NAME" to verName)
into("${projectDir}/src/main/cpp/main/src")
}
tasks.getByName("preBuild").dependsOn(generateVersion)

View File

@ -0,0 +1,7 @@
include src/main/cpp/external/DexBuilder/Android.mk
include src/main/cpp/external/yahfa/Android.mk
include src/main/cpp/main/Android.mk
$(call import-module,prefab/cxx)
$(call import-module,prefab/riru)
$(call import-module,prefab/dobby)

View File

@ -0,0 +1,14 @@
APP_CFLAGS := -Wall -Wextra
APP_CFLAGS += -fno-stack-protector -fomit-frame-pointer
APP_CFLAGS += -Wno-builtin-macro-redefined -D__FILE__=__FILE_NAME__
APP_CPPFLAGS := -std=c++20
APP_CONLYFLAGS := -std=c18
APP_LDFLAGS := -Wl,--exclude-libs,ALL
APP_STL := none
ifneq ($(NDK_DEBUG),1)
APP_CFLAGS += -Oz -Wno-unused -Wno-unused-parameter -Werror
APP_CFLAGS += -fvisibility=hidden -fvisibility-inlines-hidden
APP_CFLAGS += -fno-unwind-tables -fno-asynchronous-unwind-tables
APP_LDFLAGS += -Wl,--gc-sections -Wl,--strip-all
endif

View File

@ -1,35 +0,0 @@
##
## This file is part of LSPosed.
##
## LSPosed is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## LSPosed is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
##
## Copyright (C) 2020 EdXposed Contributors
## Copyright (C) 2021 LSPosed Contributors
##
project(libcxx)
cmake_minimum_required(VERSION 3.4.1)
find_program(CCACHE ccache)
if (CCACHE)
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
endif ()
find_package(cxx REQUIRED CONFIG)
link_libraries(cxx::cxx)
add_subdirectory(main)
add_subdirectory(external)

View File

@ -1,17 +0,0 @@
cmake_minimum_required(VERSION 3.4.1)
add_subdirectory(yahfa)
add_subdirectory(DexBuilder)
target_include_directories(dex_builder PUBLIC DexBuilder)
macro(SET_OPTION option value)
set(${option} ${value} CACHE INTERNAL "" FORCE)
endmacro()
SET_OPTION(DOBBY_GENERATE_SHARED OFF)
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
SET_OPTION(DOBBY_DEBUG OFF)
endif (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
add_subdirectory(Dobby)
target_include_directories(dobby PUBLIC Dobby/include)

@ -1 +1 @@
Subproject commit 41b9171852840cb421d8be22ef73d9467db02799
Subproject commit 9141e5aed87360fa6926ad05a8ac1511fc6bcbe6

@ -1 +0,0 @@
Subproject commit 2da2c218b0ae824b3a0e5ef1474223636f7f32a9

View File

@ -0,0 +1,10 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := yahfa
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_SRC_FILES := src/HookMain.cpp src/trampoline.c
LOCAL_EXPORT_LDLIBS := -llog
LOCAL_STATIC_LIBRARIES := libcxx
include $(BUILD_STATIC_LIBRARY)

View File

@ -0,0 +1,15 @@
LOCAL_PATH := $(call my-dir)
define walk
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef
include $(CLEAR_VARS)
LOCAL_MODULE := lspd
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include $(LOCAL_PATH)/src
FILE_LIST := $(filter %.cpp, $(call walk, $(LOCAL_PATH)/src))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
LOCAL_STATIC_LIBRARIES := cxx yahfa riru dobby dex_builder
LOCAL_CFLAGS := -DRIRU_MODULE -DRIRU_MODULE_API_VERSION=${RIRU_MODULE_API_VERSION}
LOCAL_CFLAGS += -DMODULE_NAME=${MODULE_NAME}
LOCAL_LDLIBS := -llog
include $(BUILD_SHARED_LIBRARY)

View File

@ -1,36 +0,0 @@
##
## This file is part of LSPosed.
##
## LSPosed is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## LSPosed is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with LSPosed. If not, see <https://www.gnu.org/licenses/>.
##
## Copyright (C) 2020 EdXposed Contributors
## Copyright (C) 2021 LSPosed Contributors
##
cmake_minimum_required(VERSION 3.4.1)
configure_file(template/config.cpp src/config.cpp)
aux_source_directory(src SRC_LIST)
aux_source_directory(src/jni SRC_JNI_LIST)
include_directories(include src)
add_library(lspd SHARED ${SRC_LIST} ${SRC_JNI_LIST} ${CMAKE_CURRENT_BINARY_DIR}/src/config.cpp)
find_package(riru REQUIRED CONFIG)
find_library(log-lib log)
target_link_libraries(lspd yahfa riru::riru android dobby dex_builder ${log-lib})
add_custom_command(TARGET lspd POST_BUILD
COMMAND ${CMAKE_STRIP} --remove-section=.comment -g "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/liblspd.so")

View File

@ -170,7 +170,7 @@ ElfW(Addr) ElfImg::LinearLookup(std::string_view name) const {
if (symtabs_.empty()) {
symtabs_.reserve(symtab_count);
if (symtab_start != nullptr && symstr_offset_for_symtab != 0) {
for (int i = 0; i < symtab_count; i++) {
for (ElfW(Off) i = 0; i < symtab_count; i++) {
unsigned int st_type = ELF_ST_TYPE(symtab_start[i].st_info);
const char *st_name = offsetOf<const char *>(header, symstr_offset_for_symtab +
symtab_start[i].st_name);
@ -260,4 +260,3 @@ bool ElfImg::findModuleBase() {
base = reinterpret_cast<void *>(load_addr);
return true;
}

View File

@ -103,7 +103,7 @@ namespace lspd {
env, class_clazz, "accessFlags", "I");
jint access_flags = env->GetIntField(target_class, java_lang_Class_accessFlags);
env->SetIntField(target_class, java_lang_Class_accessFlags, access_flags & ~kAccFinal);
for (auto i = 0u; i < env->GetArrayLength(constructors); ++i) {
for (auto i = 0; i < env->GetArrayLength(constructors); ++i) {
auto constructor = env->GetObjectArrayElement(constructors, i);
void *method = yahfa::getArtMethod(env, constructor);
uint32_t flags = yahfa::getAccessFlags(method);

View File

@ -115,11 +115,13 @@ namespace lspd {
};
}
#define str(s) #s
RIRU_EXPORT RiruVersionedModuleInfo *init(Riru *riru) {
LOGD("using riru %d", riru->riruApiVersion);
LOGD("module path: %s", riru->magiskModulePath);
lspd::magiskPath = riru->magiskModulePath;
if (!lspd::isDebug && lspd::magiskPath.find(MODULE_NAME) == std::string::npos) {
if (!lspd::isDebug && lspd::magiskPath.find(str(MODULE_NAME)) == std::string::npos) {
LOGE("who am i");
return nullptr;
}

View File

@ -19,7 +19,6 @@
plugins {
id("com.android.library")
kotlin("android")
}
val androidTargetSdkVersion: Int by rootProject.extra