gen_pif_custom.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. #!/bin/sh
  2. #
  3. # To be run with the /system/build.prop (build.prop) and
  4. # /vendor/build.prop (vendor-build.prop) from the stock
  5. # ROM of a device you want to spoof values from
  6. # Command line options:
  7. # "prop" forces prop format instead of default json
  8. # "all" forces sometimes optional fields like SECURITY_PATCH to always be included
  9. # "deprecated" forces the use of extra/incorrect chiteroman PIF fields and names
  10. # "advanced" adds the verbose logging module setting entry
  11. N="
  12. ";
  13. echo "system build.prop to custom.pif.json/.prop creator \
  14. $N by osm0sis @ xda-developers";
  15. item() { echo "$N- $@"; }
  16. die() { echo "$N$N! $@"; exit 1; }
  17. file_getprop() {
  18. case $FORMAT in
  19. json) grep -m1 "^$2=" "$1" 2>/dev/null | cut -d= -f2- | sed 's|"|\\"|g';;
  20. prop) grep -m1 "^$2=" "$1" 2>/dev/null | cut -d= -f2-;;
  21. esac;
  22. }
  23. if [ -d "$1" ]; then
  24. DIR="$1/dummy";
  25. LOCAL="$(readlink -f "$PWD")";
  26. shift;
  27. else
  28. case "$0" in
  29. *.sh) DIR="$0";;
  30. *) DIR="$(lsof -p $$ 2>/dev/null | grep -o '/.*gen_pif_custom.sh$')";;
  31. esac;
  32. fi;
  33. DIR=$(dirname "$(readlink -f "$DIR")");
  34. if [ "$LOCAL" ]; then
  35. item "Using prop directory: $DIR";
  36. item "Using output directory: $LOCAL";
  37. LOCAL="$LOCAL/";
  38. fi;
  39. cd "$DIR";
  40. FORMAT=json;
  41. ALLFIELDS=false;
  42. OLDFIELDS=false;
  43. ADVANCED=false;
  44. until [ -z "$1" ]; do
  45. case $1 in
  46. json|prop) FORMAT=$1; shift;;
  47. all) ALLFIELDS=true; shift;;
  48. deprecated) OLDFIELDS=true; STYLE="(Deprecated)"; shift;;
  49. advanced) ADVANCED=true; [ -z "$STYLE" ] && STYLE="(Advanced)"; shift;;
  50. *) die "Invalid argument: $1";;
  51. esac;
  52. done;
  53. item "Using format: $FORMAT $STYLE";
  54. if [ ! -f build.prop ] && [ ! -f system-build.prop ]; then
  55. [ ! -f product-build.prop -a ! -f vendor-build.prop ] \
  56. && die "No build.prop files found in script directory";
  57. fi;
  58. item "Parsing build.prop(s) ...";
  59. MANUFACTURER=$(file_getprop build.prop ro.product.manufacturer);
  60. MODEL=$(file_getprop build.prop ro.product.model);
  61. FINGERPRINT=$(file_getprop build.prop ro.build.fingerprint);
  62. BRAND=$(file_getprop build.prop ro.product.brand);
  63. PRODUCT=$(file_getprop build.prop ro.product.name);
  64. DEVICE=$(file_getprop build.prop ro.product.device);
  65. RELEASE=$(file_getprop build.prop ro.build.version.release);
  66. ID=$(file_getprop build.prop ro.build.id);
  67. INCREMENTAL=$(file_getprop build.prop ro.build.version.incremental);
  68. TYPE=$(file_getprop build.prop ro.build.type);
  69. TAGS=$(file_getprop build.prop ro.build.tags);
  70. [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop build.prop ro.product.system.manufacturer);
  71. [ -z "$MODEL" ] && MODEL=$(file_getprop build.prop ro.product.system.model);
  72. [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop build.prop ro.system.build.fingerprint);
  73. [ -z "$BRAND" ] && BRAND=$(file_getprop build.prop ro.product.system.brand);
  74. [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop build.prop ro.product.system.name);
  75. [ -z "$DEVICE" ] && DEVICE=$(file_getprop build.prop ro.product.system.device);
  76. [ -z "$RELEASE" ] && RELEASE=$(file_getprop build.prop ro.system.build.version.release);
  77. [ -z "$ID" ] && ID=$(file_getprop build.prop ro.system.build.id);
  78. [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop build.prop ro.system.build.version.incremental);
  79. [ -z "$TYPE" ] && TYPE=$(file_getprop build.prop ro.system.build.type);
  80. [ -z "$TAGS" ] && TAGS=$(file_getprop build.prop ro.system.build.tags);
  81. [ -z "$DEVICE" ] && DEVICE=$(file_getprop build.prop ro.build.product);
  82. case $DEVICE in
  83. generic) die 'Generic Google/AOSP "generic" system build.prop values found, rename to system-build.prop and add product-build.prop';;
  84. esac;
  85. [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop product-build.prop ro.product.product.manufacturer);
  86. [ -z "$MODEL" ] && MODEL=$(file_getprop product-build.prop ro.product.product.model);
  87. [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop product-build.prop ro.product.build.fingerprint);
  88. [ -z "$BRAND" ] && BRAND=$(file_getprop product-build.prop ro.product.product.brand);
  89. [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop product-build.prop ro.product.product.name);
  90. [ -z "$DEVICE" ] && DEVICE=$(file_getprop product-build.prop ro.product.product.device);
  91. [ -z "$RELEASE" ] && RELEASE=$(file_getprop product-build.prop ro.product.build.version.release);
  92. [ -z "$ID" ] && ID=$(file_getprop product-build.prop ro.product.build.id);
  93. [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop product-build.prop ro.product.build.version.incremental);
  94. [ -z "$TYPE" ] && TYPE=$(file_getprop product-build.prop ro.product.build.type);
  95. [ -z "$TAGS" ] && TAGS=$(file_getprop product-build.prop ro.product.build.tags);
  96. case $DEVICE in
  97. 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';;
  98. mssi) die 'Generic MediaTek "mssi" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
  99. essi) die 'Generic Samsung "essi" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
  100. esac;
  101. case $PRODUCT in
  102. TSSI) die 'Generic Infinix "TSSI" system and/or product build.prop values found, rename to system-build.prop and add vendor-build.prop';;
  103. esac;
  104. [ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop vendor-build.prop ro.product.vendor.manufacturer);
  105. [ -z "$MODEL" ] && MODEL=$(file_getprop vendor-build.prop ro.product.vendor.model);
  106. [ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop vendor-build.prop ro.vendor.build.fingerprint);
  107. [ -z "$BRAND" ] && BRAND=$(file_getprop vendor-build.prop ro.product.vendor.brand);
  108. [ -z "$PRODUCT" ] && PRODUCT=$(file_getprop vendor-build.prop ro.product.vendor.name);
  109. [ -z "$DEVICE" ] && DEVICE=$(file_getprop vendor-build.prop ro.product.vendor.device);
  110. [ -z "$RELEASE" ] && RELEASE=$(file_getprop vendor-build.prop ro.vendor.build.version.release);
  111. [ -z "$ID" ] && ID=$(file_getprop vendor-build.prop ro.vendor.build.id);
  112. [ -z "$INCREMENTAL" ] && INCREMENTAL=$(file_getprop vendor-build.prop ro.vendor.build.version.incremental);
  113. [ -z "$TYPE" ] && TYPE=$(file_getprop vendor-build.prop ro.vendor.build.type);
  114. [ -z "$TAGS" ] && TAGS=$(file_getprop vendor-build.prop ro.vendor.build.tags);
  115. if [ -z "$FINGERPRINT" ]; then
  116. if [ -f build.prop ]; then
  117. die "No fingerprint found, use a /system/build.prop to start";
  118. else
  119. die "No fingerprint found, unable to continue";
  120. fi;
  121. fi;
  122. echo "$FINGERPRINT";
  123. LIST="MANUFACTURER MODEL FINGERPRINT BRAND PRODUCT DEVICE";
  124. if $OLDFIELDS; then
  125. BUILD_ID=$ID;
  126. LIST="$LIST BUILD_ID";
  127. else
  128. LIST="$LIST RELEASE ID INCREMENTAL TYPE TAGS";
  129. fi;
  130. if ! $ALLFIELDS; then
  131. item "Parsing build UTC date ...";
  132. UTC=$(file_getprop build.prop ro.build.date.utc);
  133. [ -z "$UTC" ] && UTC=$(file_getprop system-build.prop ro.build.date.utc);
  134. date -u -d @$UTC;
  135. fi;
  136. if [ "$UTC" -gt 1521158400 ] || $ALLFIELDS; then
  137. $ALLFIELDS || item "Build date newer than March 2018, adding SECURITY_PATCH ...";
  138. SECURITY_PATCH=$(file_getprop build.prop ro.build.version.security_patch);
  139. [ -z "$SECURITY_PATCH" ] && SECURITY_PATCH=$(file_getprop system-build.prop ro.build.version.security_patch);
  140. LIST="$LIST SECURITY_PATCH";
  141. $ALLFIELDS || echo "$SECURITY_PATCH";
  142. fi;
  143. item "Parsing build first API level ...";
  144. DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.product.first_api_level);
  145. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.board.first_api_level);
  146. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.board.api_level);
  147. if [ -z "$DEVICE_INITIAL_SDK_INT" ]; then
  148. [ ! -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";
  149. DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.product.first_api_level);
  150. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.board.first_api_level);
  151. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.board.api_level);
  152. fi;
  153. if [ -z "$DEVICE_INITIAL_SDK_INT" ]; then
  154. item "No first API level found, falling back to build SDK version ...";
  155. DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.build.version.sdk);
  156. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop build.prop ro.system.build.version.sdk);
  157. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop system-build.prop ro.build.version.sdk);
  158. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop system-build.prop ro.system.build.version.sdk);
  159. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop vendor-build.prop ro.vendor.build.version.sdk);
  160. [ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT=$(file_getprop product-build.prop ro.product.build.version.sdk);
  161. fi;
  162. echo "$DEVICE_INITIAL_SDK_INT";
  163. if [ "$DEVICE_INITIAL_SDK_INT" -gt 32 ]; then
  164. item "First API level 33 or higher, resetting to 32 ...";
  165. DEVICE_INITIAL_SDK_INT=32;
  166. fi;
  167. if $OLDFIELDS; then
  168. FIRST_API_LEVEL=$DEVICE_INITIAL_SDK_INT;
  169. LIST="$LIST FIRST_API_LEVEL";
  170. else
  171. LIST="$LIST DEVICE_INITIAL_SDK_INT";
  172. fi;
  173. if $OLDFIELDS; then
  174. VNDK_VERSION=$(file_getprop vendor-build.prop ro.vndk.version);
  175. [ -z "$VNDK_VERSION" ] && VNDK_VERSION=$(file_getprop product-build.prop ro.product.vndk.version);
  176. if [ -z "$VNDK_VERSION" ]; then
  177. [ ! -f vendor-default.prop ] && die "No VNDK version found, add vendor-default.prop";
  178. VNDK_VERSION=$(file_getprop vendor-build.prop ro.vndk.version);
  179. fi;
  180. LIST="$LIST VNDK_VERSION";
  181. fi;
  182. if [ -f "$LOCAL"custom.pif.$FORMAT ]; then
  183. item "Removing existing custom.pif.$FORMAT ...";
  184. rm -f "$LOCAL"custom.pif.$FORMAT;
  185. fi;
  186. item "Writing new custom.pif.$FORMAT ...";
  187. case $FORMAT in
  188. json) CMNT=' //'; EVALPRE='\ \ \ \ \"'; PRE=' "'; MID='": "'; POST='",';;
  189. prop) CMNT='#'; MID='=';;
  190. esac;
  191. ([ "$FORMAT" = "json" ] && echo '{';
  192. $OLDFIELDS || echo "$CMNT Build Fields";
  193. for PROP in $LIST; do
  194. eval echo "$EVALPRE$PROP\$MID\$$PROP\$POST";
  195. done;
  196. if ! $OLDFIELDS; then
  197. echo "$N$CMNT System Properties";
  198. echo "$PRE"'*.build.id'"$MID$ID$POST";
  199. case $LIST in
  200. *SECURITY_PATCH*) echo "$PRE"'*.security_patch'"$MID$SECURITY_PATCH$POST";;
  201. esac;
  202. echo "$PRE"'*api_level'"$MID$DEVICE_INITIAL_SDK_INT$POST";
  203. if $ADVANCED; then
  204. echo "$N$CMNT Advanced Settings";
  205. echo "$PRE"'verboseLogs'"$MID"'0'"$POST";
  206. fi;
  207. fi) | sed '$s/,/\n}/' | tee "$LOCAL"custom.pif.$FORMAT;