| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- #!/bin/sh
- #
- # To be run with the /system/build.prop (build.prop) and
- # /vendor/build.prop (vendor-build.prop) from the stock
- # ROM of a device you want to spoof values from
- # Command line options:
- # "prop" forces prop format instead of default json
- # "all" forces sometimes optional fields like SECURITY_PATCH to always be included
- # "deprecated" forces the use of extra/incorrect chiteroman PIF fields and names
- # "advanced" adds the verbose logging module setting entry
- N="
- ";
- echo "system build.prop to custom.pif.json/.prop creator \
- $N by osm0sis @ xda-developers";
- item() { echo "$N- $@"; }
- die() { echo "$N$N! $@"; exit 1; }
- file_getprop() {
- case $FORMAT in
- json) grep -m1 "^$2=" "$1" 2>/dev/null | cut -d= -f2- | sed 's|"|\\"|g';;
- prop) grep -m1 "^$2=" "$1" 2>/dev/null | cut -d= -f2-;;
- esac;
- }
- if [ -d "$1" ]; then
- DIR="$1/dummy";
- LOCAL="$(readlink -f "$PWD")";
- shift;
- else
- case "$0" in
- *.sh) DIR="$0";;
- *) DIR="$(lsof -p $$ 2>/dev/null | grep -o '/.*gen_pif_custom.sh$')";;
- esac;
- fi;
- DIR=$(dirname "$(readlink -f "$DIR")");
- if [ "$LOCAL" ]; then
- item "Using prop directory: $DIR";
- item "Using output directory: $LOCAL";
- LOCAL="$LOCAL/";
- fi;
- cd "$DIR";
- FORMAT=json;
- ALLFIELDS=false;
- OLDFIELDS=false;
- ADVANCED=false;
- until [ -z "$1" ]; do
- case $1 in
- json|prop) FORMAT=$1; shift;;
- all) ALLFIELDS=true; shift;;
- deprecated) OLDFIELDS=true; STYLE="(Deprecated)"; shift;;
- advanced) ADVANCED=true; [ -z "$STYLE" ] && STYLE="(Advanced)"; shift;;
- *) die "Invalid argument: $1";;
- esac;
- done;
- item "Using format: $FORMAT $STYLE";
- if [ ! -f build.prop ] && [ ! -f system-build.prop ]; then
- [ ! -f product-build.prop -a ! -f vendor-build.prop ] \
- && die "No build.prop files found in script directory";
- fi;
- item "Parsing build.prop(s) ...";
- MANUFACTURER=$(file_getprop build.prop ro.product.manufacturer);
- MODEL=$(file_getprop build.prop ro.product.model);
- FINGERPRINT=$(file_getprop build.prop ro.build.fingerprint);
- BRAND=$(file_getprop build.prop ro.product.brand);
- PRODUCT=$(file_getprop build.prop ro.product.name);
- DEVICE=$(file_getprop build.prop ro.product.device);
- RELEASE=$(file_getprop build.prop ro.build.version.release);
- ID=$(file_getprop build.prop ro.build.id);
- INCREMENTAL=$(file_getprop build.prop ro.build.version.incremental);
- TYPE=$(file_getprop build.prop ro.build.type);
- TAGS=$(file_getprop build.prop ro.build.tags);
- [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop build.prop ro.product.system.manufacturer);
- [ -z "$MODEL" ] && MODEL=$(file_getprop build.prop ro.product.system.model);
- [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop build.prop ro.system.build.fingerprint);
- [ -z "$BRAND" ] && BRAND=$(file_getprop build.prop ro.product.system.brand);
- [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop build.prop ro.product.system.name);
- [ -z "$DEVICE" ] && DEVICE=$(file_getprop build.prop ro.product.system.device);
- [ -z "$RELEASE" ] && RELEASE=$(file_getprop build.prop ro.system.build.version.release);
- [ -z "$ID" ] && ID=$(file_getprop build.prop ro.system.build.id);
- [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop build.prop ro.system.build.version.incremental);
- [ -z "$TYPE" ] && TYPE=$(file_getprop build.prop ro.system.build.type);
- [ -z "$TAGS" ] && TAGS=$(file_getprop build.prop ro.system.build.tags);
- [ -z "$DEVICE" ] && DEVICE=$(file_getprop build.prop ro.build.product);
- case $DEVICE in
- generic) die 'Generic Google/AOSP "generic" system build.prop values found, rename to system-build.prop and add product-build.prop';;
- esac;
- [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop product-build.prop ro.product.product.manufacturer);
- [ -z "$MODEL" ] && MODEL=$(file_getprop product-build.prop ro.product.product.model);
- [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop product-build.prop ro.product.build.fingerprint);
- [ -z "$BRAND" ] && BRAND=$(file_getprop product-build.prop ro.product.product.brand);
- [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop product-build.prop ro.product.product.name);
- [ -z "$DEVICE" ] && DEVICE=$(file_getprop product-build.prop ro.product.product.device);
- [ -z "$RELEASE" ] && RELEASE=$(file_getprop product-build.prop ro.product.build.version.release);
- [ -z "$ID" ] && ID=$(file_getprop product-build.prop ro.product.build.id);
- [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop product-build.prop ro.product.build.version.incremental);
- [ -z "$TYPE" ] && TYPE=$(file_getprop product-build.prop ro.product.build.type);
- [ -z "$TAGS" ] && TAGS=$(file_getprop product-build.prop ro.product.build.tags);
- case $DEVICE in
- missi|qssi) die 'Generic Qualcomm "qssi/missi" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
- mssi) die 'Generic MediaTek "mssi" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
- essi) die 'Generic Samsung "essi" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
- esac;
- case $PRODUCT in
- TSSI) die 'Generic Infinix "TSSI" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
- esac;
- [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop vendor-build.prop ro.product.vendor.manufacturer);
- [ -z "$MODEL" ] && MODEL=$(file_getprop vendor-build.prop ro.product.vendor.model);
- [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop vendor-build.prop ro.vendor.build.fingerprint);
- [ -z "$BRAND" ] && BRAND=$(file_getprop vendor-build.prop ro.product.vendor.brand);
- [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop vendor-build.prop ro.product.vendor.name);
- [ -z "$DEVICE" ] && DEVICE=$(file_getprop vendor-build.prop ro.product.vendor.device);
- [ -z "$RELEASE" ] && RELEASE=$(file_getprop vendor-build.prop ro.vendor.build.version.release);
- [ -z "$ID" ] && ID=$(file_getprop vendor-build.prop ro.vendor.build.id);
- [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop vendor-build.prop ro.vendor.build.version.incremental);
- [ -z "$TYPE" ] && TYPE=$(file_getprop vendor-build.prop ro.vendor.build.type);
- [ -z "$TAGS" ] && TAGS=$(file_getprop vendor-build.prop ro.vendor.build.tags);
- if [ -z "$FINGERPRINT" ]; then
- if [ -f build.prop ]; then
- die "No fingerprint found, use a /system/build.prop to start";
- else
- die "No fingerprint found, unable to continue";
- fi;
- fi;
- echo "$FINGERPRINT";
- LIST="MANUFACTURER MODEL FINGERPRINT BRAND PRODUCT DEVICE";
- if $OLDFIELDS; then
- BUILD_ID=$ID;
- LIST="$LIST BUILD_ID";
- else
- LIST="$LIST RELEASE ID INCREMENTAL TYPE TAGS";
- fi;
- if ! $ALLFIELDS; then
- item "Parsing build UTC date ...";
- UTC=$(file_getprop build.prop ro.build.date.utc);
- [ -z "$UTC" ] && UTC=$(file_getprop system-build.prop ro.build.date.utc);
- date -u -d @$UTC;
- fi;
- if [ "$UTC" -gt 1521158400 ] || $ALLFIELDS; then
- $ALLFIELDS || item "Build date newer than March 2018, adding SECURITY_PATCH ...";
- SECURITY_PATCH=$(file_getprop build.prop ro.build.version.security_patch);
- [ -z "$SECURITY_PATCH" ] && SECURITY_PATCH=$(file_getprop system-build.prop ro.build.version.security_patch);
- LIST="$LIST SECURITY_PATCH";
- $ALLFIELDS || echo "$SECURITY_PATCH";
- fi;
- item "Parsing build first API level ...";
- DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.product.first_api_level);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.board.first_api_level);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.board.api_level);
- if [ -z "$DEVICE_INITIAL_SDK_INT" ]; then
- [ ! -f vendor-build.prop ] && die "No first API level found, add vendor-build.prop or create empty vendor-build.prop if the device does not have one";
- DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.product.first_api_level);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.board.first_api_level);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.board.api_level);
- fi;
- if [ -z "$DEVICE_INITIAL_SDK_INT" ]; then
- item "No first API level found, falling back to build SDK version ...";
- DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.build.version.sdk);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.system.build.version.sdk);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop system-build.prop ro.build.version.sdk);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop system-build.prop ro.system.build.version.sdk);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.vendor.build.version.sdk);
- [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop product-build.prop ro.product.build.version.sdk);
- fi;
- echo "$DEVICE_INITIAL_SDK_INT";
- if [ "$DEVICE_INITIAL_SDK_INT" -gt 32 ]; then
- item "First API level 33 or higher, resetting to 32 ...";
- DEVICE_INITIAL_SDK_INT=32;
- fi;
- if $OLDFIELDS; then
- FIRST_API_LEVEL=$DEVICE_INITIAL_SDK_INT;
- LIST="$LIST FIRST_API_LEVEL";
- else
- LIST="$LIST DEVICE_INITIAL_SDK_INT";
- fi;
- if $OLDFIELDS; then
- VNDK_VERSION=$(file_getprop vendor-build.prop ro.vndk.version);
- [ -z "$VNDK_VERSION" ] && VNDK_VERSION=$(file_getprop product-build.prop ro.product.vndk.version);
- if [ -z "$VNDK_VERSION" ]; then
- [ ! -f vendor-default.prop ] && die "No VNDK version found, add vendor-default.prop";
- VNDK_VERSION=$(file_getprop vendor-build.prop ro.vndk.version);
- fi;
- LIST="$LIST VNDK_VERSION";
- fi;
- if [ -f "$LOCAL"custom.pif.$FORMAT ]; then
- item "Removing existing custom.pif.$FORMAT ...";
- rm -f "$LOCAL"custom.pif.$FORMAT;
- fi;
- item "Writing new custom.pif.$FORMAT ...";
- case $FORMAT in
- json) CMNT=' //'; EVALPRE='\ \ \ \ \"'; PRE=' "'; MID='": "'; POST='",';;
- prop) CMNT='#'; MID='=';;
- esac;
- ([ "$FORMAT" = "json" ] && echo '{';
- $OLDFIELDS || echo "$CMNT Build Fields";
- for PROP in $LIST; do
- eval echo "$EVALPRE$PROP\$MID\$$PROP\$POST";
- done;
- if ! $OLDFIELDS; then
- echo "$N$CMNT System Properties";
- echo "$PRE"'*.build.id'"$MID$ID$POST";
- case $LIST in
- *SECURITY_PATCH*) echo "$PRE"'*.security_patch'"$MID$SECURITY_PATCH$POST";;
- esac;
- echo "$PRE"'*api_level'"$MID$DEVICE_INITIAL_SDK_INT$POST";
- if $ADVANCED; then
- echo "$N$CMNT Advanced Settings";
- echo "$PRE"'verboseLogs'"$MID"'0'"$POST";
- fi;
- fi) | sed '$s/,/\n}/' | tee "$LOCAL"custom.pif.$FORMAT;
|