How to Use property_set and property_get in Android Native Code: A Complete Guide with Examples

In Android development, system properties are a powerful tool for managing various configurations and settings within the Android OS. The functions property_set and property_get are essential when working with Android’s native code (C/C++) to read and modify these system properties. This blog post will provide a comprehensive guide on using property_set and property_get in Android native code, complete with examples to help you understand their usage.

Understanding property_get and property_set

1. property_get

The property_get function is used to retrieve the value of a system property. It’s commonly used when you need to check the current state of a particular system setting or configuration.

Syntax:

int property_get(const char *key, char *value, const char *default_value);
  • key: The name of the property you want to retrieve.
  • value: A buffer where the retrieved value will be stored.
  • default_value: A default value to return if the property does not exist.

Example:

#include <cutils/properties.h>

void getSystemProperty() {
    char value[PROP_VALUE_MAX];
    int len = property_get("ro.product.model", value, "Unknown");

    if (len > 0) {
        printf("Product Model: %s\n", value);
    } else {
        printf("Failed to get property\n");
    }
}

In this example, property_get is used to retrieve the ro.product.model property, which stores the model name of the device.

2. property_set

The property_set function is used to set or modify the value of a system property. This function is useful when you need to programmatically change system settings.

Syntax:

int property_set(const char *key, const char *value);
  • key: The name of the property you want to set.
  • value: The value you want to assign to the property.

Example:

#include <cutils/properties.h>

void setSystemProperty() {
    int result = property_set("persist.sys.debuggable", "1");

    if (result == 0) {
        printf("Property set successfully\n");
    } else {
        printf("Failed to set property\n");
    }
}

In this example, property_set is used to enable the persist.sys.debuggable property, which can be useful for debugging purposes.

Practical Example: Changing a System Property in Android

Here’s a practical example that combines both property_get and property_set:

#include <cutils/properties.h>
#include <stdio.h>

int main() {
    char value[PROP_VALUE_MAX];
    int len = property_get("persist.sys.theme", value, "light");

    printf("Current Theme: %s\n", value);

    if (strcmp(value, "light") == 0) {
        property_set("persist.sys.theme", "dark");
        printf("Theme changed to dark\n");
    } else {
        property_set("persist.sys.theme", "light");
        printf("Theme changed to light\n");
    }

    return 0;
}

Explanation:

  • This program checks the current theme of the system (persist.sys.theme) using property_get.
  • It then toggles the theme between “light” and “dark” using property_set.

Why Use property_set and property_get?

  • Flexibility: These functions allow for dynamic configuration changes without needing to rebuild the system.
  • Customization: Developers can create custom properties for their specific needs.
  • Debugging: Useful for enabling and disabling features based on system properties.

Best Practices

  • Security: Be cautious when modifying system properties, as incorrect usage can lead to system instability.
  • Validation: Always validate the success of property_set and property_get to ensure that the intended changes have taken place.

The property_set and property_get functions are powerful tools in Android’s native code for managing system properties. By understanding how to use these functions correctly, developers can gain greater control over the Android system, enabling dynamic changes and custom configurations.

Leave a Comment