From ae0b456a81eae462ae00ac3ebbfd2fba54f83270 Mon Sep 17 00:00:00 2001 From: xiao55feng <16091057+xiao55feng@user.noreply.gitee.com> Date: Sat, 1 Nov 2025 14:55:08 +0800 Subject: [PATCH] update:master --- .../system_properties/system_properties.cpp | 15 ++ .../android/bluetooth/BluetoothAdapter.java | 10 +- .../base/core/java/android/os/Build.java | 8 +- .../src/com/android/settingslib/Utils.java | 5 +- .../PortraitStatesTouchController.java | 4 + .../apps/Launcher3/res/layout/launcher.xml | 1 + .../apps/Launcher3/res/values/strings.xml | 4 + .../res/xml/default_workspace_5x5.xml | 98 ++++---- .../launcher3/SessionCommitReceiver.java | 3 +- .../launcher3/allapps/DiscoveryBounce.java | 3 + .../launcher3/config/FeatureFlags.java | 8 +- .../model/AddWorkspaceItemsTask.java | 6 +- .../launcher3/model/BaseModelUpdateTask.java | 3 +- .../android/launcher3/model/LoaderTask.java | 26 +- .../launcher3/model/PackageUpdatedTask.java | 23 ++ aosp/system/core/toolbox/Android.bp | 2 + aosp/system/core/toolbox/getprop.cpp | 40 +++ aosp/system/core/toolbox/gifsetprop.cpp | 237 ++++++++++++++++++ aosp/system/core/toolbox/tools.h | 1 + 19 files changed, 433 insertions(+), 64 deletions(-) create mode 100755 aosp/system/core/toolbox/gifsetprop.cpp diff --git a/aosp/bionic/libc/system_properties/system_properties.cpp b/aosp/bionic/libc/system_properties/system_properties.cpp index 840477858..55624afaa 100644 --- a/aosp/bionic/libc/system_properties/system_properties.cpp +++ b/aosp/bionic/libc/system_properties/system_properties.cpp @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,20 @@ const prop_info* SystemProperties::Find(const char* name) { return nullptr; } + if (strncmp(name, "ro.", 3) == 0) { + char new_name[96]; + strcpy(new_name, "persist."); + strcat(new_name, name); + + prop_area* new_pa = contexts_->GetPropAreaForName(new_name); + if (!new_pa) { + async_safe_format_log(ANDROID_LOG_WARN, "libc", "ccynice Access new_pa denied finding property \"%s\"", new_name); + } else { + const prop_info* new_pi = new_pa->find(new_name); + if(new_pi!=NULL) + return new_pi; + } + } prop_area* pa = contexts_->GetPropAreaForName(name); if (!pa) { async_safe_format_log(ANDROID_LOG_ERROR, "libc", "Access denied finding property \"%s\"", name); diff --git a/aosp/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java b/aosp/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java index 29a98faf5..bcb2872a9 100644 --- a/aosp/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java +++ b/aosp/frameworks/base/core/java/android/bluetooth/BluetoothAdapter.java @@ -1034,6 +1034,9 @@ public final class BluetoothAdapter { @RequiresPermission(Manifest.permission.BLUETOOTH) @AdapterState public int getState() { + //ccynice for Bluetooth + return BluetoothAdapter.STATE_ON; + /* int state = getStateInternal(); // Consider all internal states as OFF @@ -1048,7 +1051,7 @@ public final class BluetoothAdapter { Log.d(TAG, "" + hashCode() + ": getState(). Returning " + BluetoothAdapter.nameForState( state)); } - return state; + return state;*/ } /** @@ -1189,12 +1192,15 @@ public final class BluetoothAdapter { */ @RequiresPermission(Manifest.permission.BLUETOOTH) public String getAddress() { + //ccynice for bl mac address + return SystemProperties.get("persist.net.bluetooth.address","00:01:6C:08:A6:E5");//"00:01:6C:08:A6:E5"; + /* try { return mManagerService.getAddress(); } catch (RemoteException e) { Log.e(TAG, "", e); } - return null; + return null;*/ } /** diff --git a/aosp/frameworks/base/core/java/android/os/Build.java b/aosp/frameworks/base/core/java/android/os/Build.java index b8a3924aa..b0132ff21 100755 --- a/aosp/frameworks/base/core/java/android/os/Build.java +++ b/aosp/frameworks/base/core/java/android/os/Build.java @@ -111,7 +111,7 @@ public class Build { */ @UnsupportedAppUsage @TestApi - public static final boolean IS_EMULATOR = getString("ro.kernel.qemu").equals("1"); + public static final boolean IS_EMULATOR = getString("ro.boot.qemu").equals("1"); /** * A hardware serial number, if available. Alphanumeric only, case-insensitive. @@ -123,7 +123,7 @@ public class Build { // IMPORTANT: This field should be initialized via a function call to // prevent its value being inlined in the app during compilation because // we will later set it to the value based on the app's target SDK. - public static final String SERIAL = getString("no.such.thing"); + public static final String SERIAL = getString("ro.serialno"); /** * Gets the hardware serial number, if available. @@ -176,7 +176,9 @@ public class Build { } catch (RemoteException e) { e.rethrowFromSystemServer(); } - return UNKNOWN; + + return getString("ro.serialno"); + //return UNKNOWN; } /** diff --git a/aosp/frameworks/base/packages/SettingsLib/src/com/android/settingslib/Utils.java b/aosp/frameworks/base/packages/SettingsLib/src/com/android/settingslib/Utils.java index 3cbf2685a..d634d1244 100644 --- a/aosp/frameworks/base/packages/SettingsLib/src/com/android/settingslib/Utils.java +++ b/aosp/frameworks/base/packages/SettingsLib/src/com/android/settingslib/Utils.java @@ -470,6 +470,9 @@ public class Utils { * @param serviceState Service state. {@link ServiceState} */ public static boolean isInService(ServiceState serviceState) { + //ccynice for sim + return true; + /* if (serviceState == null) { return false; } @@ -480,7 +483,7 @@ public class Utils { return false; } else { return true; - } + }*/ } /** diff --git a/aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java b/aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java index a684b9d7f..9b34a51d3 100644 --- a/aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java +++ b/aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/uioverrides/touchcontrollers/PortraitStatesTouchController.java @@ -90,6 +90,10 @@ public class PortraitStatesTouchController extends AbstractStateChangeTouchContr @Override protected boolean canInterceptTouch(MotionEvent ev) { + //ccynice + if (true){ + return false; + } if (mCurrentAnimation != null) { if (mFinishFastOnSecondTouch) { mCurrentAnimation.getAnimationPlayer().end(); diff --git a/aosp/packages/apps/Launcher3/res/layout/launcher.xml b/aosp/packages/apps/Launcher3/res/layout/launcher.xml index a13790826..bb29bee76 100644 --- a/aosp/packages/apps/Launcher3/res/layout/launcher.xml +++ b/aosp/packages/apps/Launcher3/res/layout/launcher.xml @@ -16,6 +16,7 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:launcher="http://schemas.android.com/apk/res-auto" android:id="@+id/launcher" + android:background="@drawable/bg" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true"> diff --git a/aosp/packages/apps/Launcher3/res/values/strings.xml b/aosp/packages/apps/Launcher3/res/values/strings.xml index 935bb40fb..e224e91e2 100644 --- a/aosp/packages/apps/Launcher3/res/values/strings.xml +++ b/aosp/packages/apps/Launcher3/res/values/strings.xml @@ -25,6 +25,10 @@ Launcher3 Work + + + + 工具 App isn\'t installed. diff --git a/aosp/packages/apps/Launcher3/res/xml/default_workspace_5x5.xml b/aosp/packages/apps/Launcher3/res/xml/default_workspace_5x5.xml index ccdde2ca8..6fb5c1c55 100644 --- a/aosp/packages/apps/Launcher3/res/xml/default_workspace_5x5.xml +++ b/aosp/packages/apps/Launcher3/res/xml/default_workspace_5x5.xml @@ -1,5 +1,4 @@ - - - - - - - - + - - - - - - - - - - + - - + - - + launcher:y="0"> + - - - - + launcher:y="0"> - + - - - + + + - + + + + + + + + - - - - diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/SessionCommitReceiver.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/SessionCommitReceiver.java index 89f0a3d28..94ad25116 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/SessionCommitReceiver.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/SessionCommitReceiver.java @@ -80,7 +80,8 @@ public class SessionCommitReceiver extends BroadcastReceiver { InstallSessionHelper packageInstallerCompat = InstallSessionHelper.INSTANCE.get(context); packageInstallerCompat.restoreDbIfApplicable(info); if (TextUtils.isEmpty(info.getAppPackageName()) - || info.getInstallReason() != PackageManager.INSTALL_REASON_USER + //ccynice + //|| info.getInstallReason() != PackageManager.INSTALL_REASON_USER || packageInstallerCompat.promiseIconAddedForId(info.getSessionId())) { packageInstallerCompat.removePromiseIconId(info.getSessionId()); return; diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/allapps/DiscoveryBounce.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/allapps/DiscoveryBounce.java index b4ff5ea19..db17e2882 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/allapps/DiscoveryBounce.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/allapps/DiscoveryBounce.java @@ -137,6 +137,9 @@ public class DiscoveryBounce extends AbstractFloatingView { private static void showForHomeIfNeeded(Launcher launcher, boolean withDelay) { OnboardingPrefs onboardingPrefs = launcher.getOnboardingPrefs(); +//ccynice 取消跳动动画 + if(true) + return; if (!launcher.isInState(NORMAL) || onboardingPrefs.getBoolean(OnboardingPrefs.HOME_BOUNCE_SEEN) || AbstractFloatingView.getTopOpenView(launcher) != null diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java index 88a9abaf8..064e7e45d 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java @@ -48,11 +48,13 @@ public final class FeatureFlags { */ public static final boolean IS_STUDIO_BUILD = BuildConfig.DEBUG; + public static final boolean LAUNCHER3_REMOVE_DRAWER = "false".equals(Utilities.getSystemProperty("persist.sys.bd.launcher_remove_drawer", "false")); + /** * Enable moving the QSB on the 0th screen of the workspace. This is not a configuration feature * and should be modified at a project level. */ - public static final boolean QSB_ON_FIRST_SCREEN = true; + public static final boolean QSB_ON_FIRST_SCREEN = false; /** * Feature flag to handle define config changes dynamically instead of killing the process. @@ -88,7 +90,7 @@ public final class FeatureFlags { "ADAPTIVE_ICON_WINDOW_ANIM", true, "Use adaptive icons for window animations."); public static final BooleanFlag ENABLE_QUICKSTEP_LIVE_TILE = getDebugFlag( - "ENABLE_QUICKSTEP_LIVE_TILE", false, "Enable live tile in Quickstep overview"); + "ENABLE_QUICKSTEP_LIVE_TILE", true, "Enable live tile in Quickstep overview"); // Keep as DeviceFlag to allow remote disable in emergency. public static final BooleanFlag ENABLE_SUGGESTED_ACTIONS_OVERVIEW = new DeviceFlag( @@ -150,7 +152,7 @@ public final class FeatureFlags { "ENABLE_OVERVIEW_SHARE", false, "Show Share button in Overview Actions"); public static final BooleanFlag ENABLE_DATABASE_RESTORE = getDebugFlag( - "ENABLE_DATABASE_RESTORE", true, + "ENABLE_DATABASE_RESTORE", false, "Enable database restore when new restore session is created"); public static final BooleanFlag ENABLE_UNIVERSAL_SMARTSPACE = getDebugFlag( diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java index c236fa6de..4b3bd78be 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/AddWorkspaceItemsTask.java @@ -78,9 +78,9 @@ public class AddWorkspaceItemsTask extends BaseModelUpdateTask { } // b/139663018 Short-circuit this logic if the icon is a system app - if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) { - continue; - } +// if (PackageManagerHelper.isSystemApp(app.getContext(), item.getIntent())) { +// continue; +// } } if (item.itemType == LauncherSettings.Favorites.ITEM_TYPE_APPLICATION) { diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/BaseModelUpdateTask.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/BaseModelUpdateTask.java index 9013cba54..7fc8ecae4 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/BaseModelUpdateTask.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/BaseModelUpdateTask.java @@ -62,7 +62,8 @@ public abstract class BaseModelUpdateTask implements ModelUpdateTask { Log.d(TAG, "Ignoring model task since loader is pending=" + this); } // Loader has not yet run. - return; +//ccynice for test + //return; } execute(mApp, mDataModel, mAllAppsList); } diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java index d62f8d5db..3e874fcf2 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java @@ -48,7 +48,7 @@ import android.util.Log; import android.util.LongSparseArray; import android.util.MutableInt; import android.util.TimingLogger; - +import android.util.Pair; import androidx.annotation.WorkerThread; import com.android.launcher3.InstallShortcutReceiver; @@ -90,6 +90,7 @@ import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.TraceHelper; import com.android.launcher3.widget.WidgetManagerHelper; +import com.android.launcher3.allapps.AppInfoComparator; import java.util.ArrayList; import java.util.Collections; @@ -99,6 +100,8 @@ import java.util.List; import java.util.Map; import java.util.concurrent.CancellationException; +import android.graphics.drawable.Icon; + /** * Runnable for the thread that loads the contents of the launcher: * - workspace icons @@ -208,7 +211,11 @@ public class LoaderTask implements Runnable { // second step List allActivityList = loadAllApps(); logger.addSplit("loadAllApps"); - + //ccynice add start + if (FeatureFlags.LAUNCHER3_REMOVE_DRAWER) { + bindAllAppsToWorkspace(); + } + // add end verifyNotStopped(); mResults.bindAllApps(); logger.addSplit("bindAllApps"); @@ -973,4 +980,19 @@ public class LoaderTask implements Runnable { return (provider != null) && (provider.provider != null) && (provider.provider.getPackageName() != null); } + //ccynice add start + private void bindAllAppsToWorkspace(){ + if (mBgAllAppsList.data.size() > 0) { + AppInfoComparator mAppNameComparator = new AppInfoComparator(mApp.getContext()); + ArrayList appInfos = new ArrayList(mBgAllAppsList.data); + // 按照名称进行排序 + Collections.sort(appInfos, mAppNameComparator); + ArrayList> installQueue = new ArrayList<>(); + for (AppInfo info : appInfos) { + installQueue.add(Pair.create((ItemInfo) info, null)); + } + mApp.getModel().addAndBindAddedWorkspaceItems(installQueue); + } + } + // end } diff --git a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java index d7d51623b..fe82caa20 100644 --- a/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java +++ b/aosp/packages/apps/Launcher3/src/com/android/launcher3/model/PackageUpdatedTask.java @@ -28,6 +28,7 @@ import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.util.Log; +import android.util.Pair; import com.android.launcher3.InstallShortcutReceiver; import com.android.launcher3.LauncherAppState; @@ -50,6 +51,8 @@ import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.SafeCloseable; +import com.android.launcher3.model.data.AppInfo; +import com.android.launcher3.allapps.AppInfoComparator; import java.util.ArrayList; import java.util.Arrays; @@ -339,6 +342,11 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { } bindUpdatedWidgets(dataModel); } + // add start + if (FeatureFlags.LAUNCHER3_REMOVE_DRAWER) { + updateAllAppsToWorkspace(app, appsList); + } + // add end } /** @@ -356,4 +364,19 @@ public class PackageUpdatedTask extends BaseModelUpdateTask { } return false; } + + // add start + public void updateAllAppsToWorkspace(LauncherAppState app , AllAppsList mBgAllAppsList){ + if (mBgAllAppsList.data.size() > 0) { + AppInfoComparator mAppNameComparator = new AppInfoComparator(app.getContext()); + ArrayList appInfos = new ArrayList(mBgAllAppsList.data); + Collections.sort(appInfos, mAppNameComparator); + ArrayList> installQueue = new ArrayList<>(); + for (AppInfo info : appInfos) { + installQueue.add(Pair.create((ItemInfo) info, null)); + } + app.getModel().addAndBindAddedWorkspaceItems(installQueue); + } + } + // add end } diff --git a/aosp/system/core/toolbox/Android.bp b/aosp/system/core/toolbox/Android.bp index 4ca5f5a0e..f5026c582 100644 --- a/aosp/system/core/toolbox/Android.bp +++ b/aosp/system/core/toolbox/Android.bp @@ -26,6 +26,7 @@ cc_defaults { "getprop.cpp", "modprobe.cpp", "setprop.cpp", + "gifsetprop.cpp", "start.cpp", ], generated_headers: [ @@ -44,6 +45,7 @@ cc_defaults { "getprop", "modprobe", "setprop", + "gifsetprop", "start", "stop", ], diff --git a/aosp/system/core/toolbox/getprop.cpp b/aosp/system/core/toolbox/getprop.cpp index ca345cb07..710961669 100644 --- a/aosp/system/core/toolbox/getprop.cpp +++ b/aosp/system/core/toolbox/getprop.cpp @@ -17,6 +17,8 @@ #include #include +#include + #include #include #include @@ -64,10 +66,48 @@ void PrintAllProperties(ResultType result_type) { } } } + + // 收集所有以"persist.ro"开头的属性,并去除"persist."前缀 + std::unordered_map persistOverrides; + for (const auto& [name, value] : properties) { + if (name.substr(0, 11) == "persist.ro.") { + // 构造去除"persist."后的名称(保留"ro.") + std::string strippedName = "ro." + name.substr(11); + persistOverrides[strippedName] = value; + } + } + // 遍历所有属性,按规则输出 for (const auto& [name, value] : properties) { + // 跳过所有"persist.ro"开头的属性 + if (name.substr(0, 11) == "persist.ro.") { + continue; + } + + // 处理"ro."开头的属性 + if (name.substr(0, 3) == "ro.") { + // 检查是否存在对应的persist值 + auto it = persistOverrides.find(name); + if (it != persistOverrides.end()) { + // 使用persist值替代 + std::cout << "[" << name << "]: [" << it->second << "]" << std::endl; + continue; + } + } + + // 其他情况使用原始值 std::cout << "[" << name << "]: [" << value << "]" << std::endl; } + + /* + + for (const auto& [name, value] : properties) { + //ccynice 跳过以 "ro." 开头的属性 + if (name.substr(0, 3) == "ro.") { + continue; + } + std::cout << "[" << name << "]: [" << value << "]" << std::endl; + }*/ } void PrintProperty(const char* name, const char* default_value, ResultType result_type) { diff --git a/aosp/system/core/toolbox/gifsetprop.cpp b/aosp/system/core/toolbox/gifsetprop.cpp new file mode 100755 index 000000000..6f3eadf90 --- /dev/null +++ b/aosp/system/core/toolbox/gifsetprop.cpp @@ -0,0 +1,237 @@ +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +using android::base::SetProperty; +using android::base::StartsWith; +using android::base::Trim; + + +void SavePropertyToFile(const std::string& name, const std::string& value) { + std::string prop_file; + std::string save_name = name; + + if (StartsWith(name, "prop.ro.")) { + prop_file = "/data/property/ro_props.conf"; + save_name = name.substr(5); + } else if (StartsWith(name, "sim.")) { + prop_file = "/data/property/sim_props.conf"; + } else if (StartsWith(name, "net.wifi.")) { + prop_file = "/data/property/wifi_props.conf"; + } else { + return; + } + + std::ifstream check_file(prop_file); + if (!check_file.good()) { + std::ofstream create_file(prop_file); + if (!create_file.is_open()) { + std::cerr << "Failed to create file: " << prop_file << std::endl; + return; + } + create_file.close(); + } + + std::ifstream in_file(prop_file); + std::vector lines; + std::string line; + bool found = false; + + while (std::getline(in_file, line)) { + size_t pos = line.find('='); + if (pos != std::string::npos) { + std::string key = line.substr(0, pos); + if (key == save_name) { + lines.push_back(save_name + "=" + value); + found = true; + continue; + } + } + lines.push_back(line); + } + + if (!found) { + lines.push_back(save_name + "=" + value); + } + + std::ofstream out_file(prop_file); + for (const auto& l : lines) { + out_file << l << "\n"; + } +} + +bool ValidatePropertyName(const std::string& name) { + if (name.front() == '.' || name.back() == '.') { + std::cerr << "Property names must not start or end with a '.'" << std::endl; + return false; + } + + if (name.find("..") != std::string::npos) { + std::cerr << "'..' is not allowed in a property name" << std::endl; + return false; + } + + for (const auto& c : name) { + if (!isalnum(c) && !strchr(":@_.-", c)) { + std::cerr << "Invalid character '" << c << "' in name '" << name << "'" << std::endl; + return false; + } + } + + return true; +} + +bool ValidatePropertyValue(const std::string& value) { + if (value.size() >= PROP_VALUE_MAX && !StartsWith(value, "ro.")) { + std::cerr << "Value '" << value << "' is too long, " << value.size() + << " bytes vs a max of " << PROP_VALUE_MAX << std::endl; + return false; + } + + if (mbstowcs(nullptr, value.data(), 0) == static_cast(-1)) { + std::cerr << "Value '" << value << "' is not a UTF8 encoded string" << std::endl; + return false; + } + + return true; +} + +bool SetPropertiesFromFile(const std::string& file_path, bool update_file = false) { + std::ifstream file(file_path); + if (!file.is_open()) { + std::cerr << "Failed to open file: " << file_path << std::endl; + return false; + } + + std::string line; + while (std::getline(file, line)) { + line = Trim(line); + + if (line.empty() || line.front() == '#') { + continue; + } + + size_t pos = line.find('='); + if (pos == std::string::npos) { + std::cerr << "Invalid line in file: " << line << std::endl; + continue; + } + + std::string name = Trim(line.substr(0, pos)); + std::string value = Trim(line.substr(pos + 1)); + + // 属性名处理逻辑 + if (name.find("prop.ro") == 0) { + // 以prop.ro开头,改为persist.ro + name = "persist.ro" + name.substr(7); // "prop.ro"长度为7 + } else if (name.find("prop.") == 0) { + // 以prop.开头但不是prop.ro + if (name.length() > 5 && name.substr(5, 3) != "ro.") { + // 取消prop.前缀 + name = name.substr(5); + } + } + + if (!ValidatePropertyName(name) || !ValidatePropertyValue(value)) { + continue; + } + + if (!SetProperty(name, value)) { + std::cerr << "Failed to set property '" << name << "' to '" << value + << "'.\nSee dmesg for error reason." << std::endl; + continue; + } + + if (update_file) { + SavePropertyToFile(name, value); + } + } + + return true; +} + +bool SetPropertiesFromArgs(const std::vector& args) { + for (const auto& arg : args) { + size_t pos = arg.find('='); + if (pos == std::string::npos) { + std::cerr << "Invalid argument: " << arg << std::endl; + continue; + } + + std::string name = Trim(arg.substr(0, pos)); + std::string value = Trim(arg.substr(pos + 1)); + + if (!ValidatePropertyName(name) || !ValidatePropertyValue(value)) { + continue; + } + + if (!SetProperty(name, value)) { + std::cerr << "Failed to set property '" << name << "' to '" << value + << "'.\nSee dmesg for error reason." << std::endl; + continue; + } + + SavePropertyToFile(name, value); + } + + return true; +} + +extern "C" int gifsetprop_main(int argc, char** argv) { + if (argc == 1) { + std::vector default_files = { + "/data/property/sim_props.conf", + "/data/property/wifi_props.conf" + }; + + for (const auto& file : default_files) { + if (!SetPropertiesFromFile(file, false)) { + std::cerr << "Failed to load properties from file: " << file << std::endl; + return EXIT_FAILURE; + } + } + + return EXIT_SUCCESS; + } + + std::vector args; + std::string file_path; + + for (int i = 1; i < argc; i++) { + std::string arg = argv[i]; + if (arg == "-f") { + if (i + 1 >= argc) { + std::cerr << "Missing file path after -f" << std::endl; + return EXIT_FAILURE; + } + file_path = argv[++i]; + } else if (arg == "-a") { + if (i + 1 >= argc) { + std::cerr << "Missing property data after -a" << std::endl; + return EXIT_FAILURE; + } + args.push_back(argv[++i]); + } else { + std::cerr << "Unknown option: " << arg << std::endl; + return EXIT_FAILURE; + } + } + + if (!file_path.empty() && !SetPropertiesFromFile(file_path, true)) { + return EXIT_FAILURE; + } + + if (!args.empty() && !SetPropertiesFromArgs(args)) { + return EXIT_FAILURE; + } + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/aosp/system/core/toolbox/tools.h b/aosp/system/core/toolbox/tools.h index bb57e6778..677fa7265 100644 --- a/aosp/system/core/toolbox/tools.h +++ b/aosp/system/core/toolbox/tools.h @@ -2,6 +2,7 @@ TOOL(getevent) TOOL(getprop) TOOL(modprobe) TOOL(setprop) +TOOL(gifsetprop) TOOL(start) TOOL(stop) TOOL(toolbox) -- Gitee