Browse Source

first commit

xiongzhu 1 year ago
commit
c95fff25a5
11 changed files with 1414 additions and 0 deletions
  1. 3 0
      .gitignore
  2. 125 0
      gen_pif_vendor.sh
  3. 47 0
      index.js
  4. 159 0
      my_migrate.sh
  5. 8 0
      package.json
  6. 69 0
      pif-gen-vendor-json-files.sh
  7. 7 0
      pif-gen-vendor-results.txt
  8. 426 0
      pif-test-json-files.sh
  9. 398 0
      vendor-build.prop
  10. 12 0
      vendor.pif.json.bak
  11. 160 0
      yarn.lock

+ 3 - 0
.gitignore

@@ -0,0 +1,3 @@
+node_modules
+.vscode
+.DS_Store

+ 125 - 0
gen_pif_vendor.sh

@@ -0,0 +1,125 @@
+
+# Run with /vendor/build.prop (vendor-build.prop) from the stock ROM, from a Xiaomi device,
+# to generate custom vendor.pif.json for PIF module
+# https://xdaforums.com/t/tools-zips-scripts-osm0sis-odds-and-ends-multiple-devices-platforms.2239421/post-89173470
+
+echo "Generate custom vendor.pif.json file for PIF module from Xiaomi stock vendor-build.prop file\
+     \n - provided by osm0sis @ xda-developers, modified for Xiaomi vendor-build.prop files by zgfg @ xda\n";
+
+function item() { echo "\n- $@"; }
+function die() { echo "\n\n! $@"; exit 1; }
+function file_getprop() { grep "^$2=" "$1" 2>/dev/null | tail -n1 | cut -d= -f2-; }
+
+shdir=${0%/*};
+dir="$1";
+[ -z "$dir" ] || [ ! -d "$dir" ] && dir="$shdir";
+
+vendor_prop="$dir/vendor-build.prop";
+[ ! -f "$vendor_prop" ] || [ ! -r "$vendor_prop" ] || [ ! -s "$vendor_prop" ] && dir='.' && vendor_prop="$dir/vendor-build.prop";
+[ ! -f "$vendor_prop" ] || [ ! -r "$vendor_prop" ] || [ ! -s "$vendor_prop" ] && die "$vendor_prop file not found, unable to continue";
+vendor_json="$dir/vendor.pif.json";
+
+
+item "Parsing MANUFACTURER, MODEL, FINGERPRINT, BRAND, PRODUCT and DEVICE from $vendor_prop ...";
+MANUFACTURER=$(file_getprop "$vendor_prop" ro.vendor.product.manufacturer);
+[ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop "$vendor_prop" ro.product.vendor.manufacturer);
+[ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop "$vendor_prop" ro.company.name);
+[ -z "$MANUFACTURER" ] && MANUFACTURER=$(file_getprop "$vendor_prop" ro.product.manufacturer);
+
+MODEL=$(file_getprop "$vendor_prop" ro.vendor.product.model);
+[ -z "$MODEL" ] && MODEL=$(file_getprop "$vendor_prop" ro.product.vendor.model);
+[ -z "$MODEL" ] && MODEL=$(file_getprop "$vendor_prop" ro.product.vendor.cert);
+
+FINGERPRINT=$(file_getprop "$vendor_prop" ro.vendor.build.fingerprint);
+[ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop "$vendor_prop" ro.bootimage.build.fingerprint);
+[ -z "$FINGERPRINT" ] && FINGERPRINT=$(file_getprop "$vendor_prop" ro.build.fingerprint);
+
+BRAND=$(file_getprop "$vendor_prop" ro.vendor.product.brand);
+[ -z "$BRAND" ] && BRAND=$(file_getprop "$vendor_prop" ro.product.vendor.brand);
+
+PRODUCT=$(file_getprop "$vendor_prop" ro.vendor.product.name);
+[ -z "$PRODUCT" ] && PRODUCT=$(file_getprop "$vendor_prop" ro.product.vendor.name);
+
+DEVICE=$(file_getprop "$vendor_prop" ro.vendor.product.device);
+[ -z "$DEVICE" ] && DEVICE=$(file_getprop "$vendor_prop" ro.product.vendor.device);
+[ -z "$DEVICE" ] && DEVICE=$(file_getprop "$vendor_prop" ro.product.board);
+[ -z "$DEVICE" ] && DEVICE=$(file_getprop "$vendor_prop" ro.product.mod_device);
+
+[ -z "$MANUFACTURER" ] && MANUFACTURER="$BRAND";
+#[ -z "$MODEL" ] && MODEL="$PRODUCT";
+
+
+[ -z "$MANUFACTURER" ] && die "MANUFACTURER not found, unable to continue";
+LIST="MANUFACTURER";
+echo "MANUFACTURER=$MANUFACTURER";
+
+[ -n "$MODEL" ] && LIST="$LIST MODEL" && echo "MODEL=$MODEL";
+
+[ -z "$FINGERPRINT" ] && die "FINGERPRINT not found, unable to continue";
+LIST="$LIST FINGERPRINT";
+echo "FINGERPRINT=$FINGERPRINT";
+
+[ -n "$BRAND" ] && LIST="$LIST BRAND" && echo "BRAND=$BRAND";
+[ -n "$PRODUCT" ] && LIST="$LIST PRODUCT" && echo "PRODUCT=$PRODUCT";
+[ -n "$DEVICE" ] && LIST="$LIST DEVICE" && echo "DEVICE=$DEVICE";
+
+
+item "Parsing BUILD_DATE_UTC ...";
+BUILD_DATE_UTC=$(file_getprop "$vendor_prop" ro.vendor.build.date.utc);
+[ -z "$BUILD_DATE_UTC" ] && BUILD_DATE_UTC=$(file_getprop "$vendor_prop" ro.bootimage.build.date.utc);
+[ -z "$BUILD_DATE_UTC" ] && echo "! BUILD_DATE_UTC not found";
+
+if [ -n "$BUILD_DATE_UTC" ] && [ "$BUILD_DATE_UTC" -gt 1521158400 ]; then
+  item "BUILD_DATE_UTC newer than March 2018, adding SECURITY_PATCH ...";
+  SECURITY_PATCH=$(file_getprop "$vendor_prop" ro.vendor.build.security_patch);
+  [ -z "$SECURITY_PATCH" ] && SECURITY_PATCH=$(file_getprop "$vendor_prop" ro.build.version.security_patch);
+  [ -z "$SECURITY_PATCH" ] && echo "! SECURITY_PATCH not found";
+  [ -n "$SECURITY_PATCH" ] && LIST="$LIST SECURITY_PATCH" && echo "SECURITY_PATCH=$SECURITY_PATCH";
+fi;
+
+item "Parsing VNDK_VERSION ...";
+VNDK_VERSION=$(file_getprop "$vendor_prop" ro.vndk.version);
+[ -n "$VNDK_VERSION" ] && LIST="$LIST VNDK_VERSION" && echo "VNDK_VERSION=$VNDK_VERSION";
+
+
+item "Parsing FIRST_API_LEVEL ...";
+FIRST_API_LEVEL=$(file_getprop "$vendor_prop" ro.product.first_api_level);
+[ -z "$FIRST_API_LEVEL" ] && FIRST_API_LEVEL=$(file_getprop "$vendor_prop" ro.board.first_api_level);
+[ -z "$FIRST_API_LEVEL" ] && FIRST_API_LEVEL=$(file_getprop "$vendor_prop" ro.board.api_level);
+
+if [ -n "$FIRST_API_LEVEL" ] && [ "$FIRST_API_LEVEL" -gt 33 ]; then
+  item "FIRST_API_LEVEL higher than 33, resetting to 33 ...";
+  FIRST_API_LEVEL=33;
+fi;
+
+item "Parsing DEVICE_INITIAL_SDK_INT ...";
+DEVICE_INITIAL_SDK_INT=$(file_getprop "$vendor_prop" ro.vendor.build.version.sdk);
+
+if [ -n "$DEVICE_INITIAL_SDK_INT" ] && [ "$DEVICE_INITIAL_SDK_INT" -gt 33 ]; then
+  item "DEVICE_INITIAL_SDK_INT higher than 33, resetting to 33 ...";
+  DEVICE_INITIAL_SDK_INT=33;
+fi;
+
+[ -z "$FIRST_API_LEVEL" ] && FIRST_API_LEVEL="$DEVICE_INITIAL_SDK_INT";
+[ -z "$DEVICE_INITIAL_SDK_INT" ] && DEVICE_INITIAL_SDK_INT="$FIRST_API_LEVEL";
+[ -z "$FIRST_API_LEVEL" ] && echo "! FIRST_API_LEVEL not found";
+
+[ -n "$FIRST_API_LEVEL" ] && LIST="$LIST FIRST_API_LEVEL" && echo "FIRST_API_LEVEL=$FIRST_API_LEVEL";
+[ -n "$DEVICE_INITIAL_SDK_INT" ] && LIST="$LIST DEVICE_INITIAL_SDK_INT" && echo "DEVICE_INITIAL_SDK_INT=$DEVICE_INITIAL_SDK_INT";
+
+
+if [ -f $vendor_json ]; then
+  item "Removing present $vendor_json ...";
+  mv -f "$vendor_json" "$vendor_json.bak";
+fi;
+
+item "Generating $vendor_json ...";
+echo '{' | tee -a "$vendor_json";
+for PROP in $LIST; do
+  eval echo '\ \ \"$PROP\": \"'\$$PROP'\",';
+done | sed '$s/,//' | tee -a "$vendor_json";
+echo '}' | tee -a "$vendor_json";
+
+[ -z "$BRAND" ] || [ -z "$PRODUCT" ] || [ -z "$DEVICE" ] && item "Run migration script to generate BRAND, PRODUCT and DEVICE";
+
+exit 0;

+ 47 - 0
index.js

@@ -0,0 +1,47 @@
+import axios from "axios"
+import pRetry, { AbortError } from "p-retry"
+import { parse } from "node-html-parser"
+
+async function crawl(url) {
+    const html = await pRetry(
+        async () => {
+            const response = await fetch(url)
+
+            // Abort retrying if the resource doesn't exist
+            if (response.status === 404) {
+                throw new AbortError(response.statusText)
+            }
+
+            return response.text()
+        },
+        { retries: 5 }
+    )
+    console.log(html)
+    const root = parse(html)
+    const rows = root.querySelectorAll(".rTableRow")
+    const props = {}
+    rows.map(row => {
+        const cells = row.querySelectorAll(".rTableCell")
+        if (cells.length === 2) {
+            return {
+                key: cells[0].text.replace(/^- /, "").trim(),
+                value: cells[1].text.trim()
+            }
+        }
+        return null
+    })
+        .filter(i => {
+            return i && i.key && i.value
+        })
+        .forEach(i => {
+            props[i.key] = i.value
+        })
+    console.log(props)
+
+    const collaps = root.querySelectorAll(".collapsible-body")
+    console.log(
+        collaps.map(c => c.querySelectorAll("pre").map(pre => pre.text))
+    )
+}
+
+await crawl("https://desktop.firmware.mobi/device:2332/firmware:21067")

+ 159 - 0
my_migrate.sh

@@ -0,0 +1,159 @@
+#!/bin/sh
+
+MyDir=${0%/*}
+LogFile="$MyDir/migrate.log"
+#exec 3>&1 4>&2 2>$LogFile 1>&2
+#set -x
+
+case "$1" in
+  -h|--help|help) echo "sh migrate.sh [-i] [-f] [-o] [-a] [in-file] [out-file]"; exit 0;;
+esac;
+
+N="
+";
+
+case "$1" in
+  -i|--install|install) INSTALL=1; shift;;
+  *) echo "custom.pif.json migration script \
+    $N  by osm0sis @ xda-developers $N";;
+esac;
+
+item() { echo "- $@"; }
+die() { echo "$N$N! $@"; exit 1; }
+grep_get_json() { eval set -- "$(cat "$FILE" | tr -d '\r\n' | grep -m1 -o "\"$1\""'.*' | cut -d: -f2-)"; echo "$1" | sed -e 's|"|\\\\\\"|g' -e 's|[,}]*$||'; }
+grep_check_json() { grep -q "$1" "$FILE" && [ "$(grep_get_json $1)" ]; }
+
+case "$1" in
+  -f|--force|force) FORCE=1; shift;;
+esac;
+case "$1" in
+  -o|--override|override) OVERRIDE=1; shift;;
+esac;
+case "$1" in
+  -a|--advanced|advanced) ADVANCED=1; shift;;
+esac;
+
+if [ -f "$1" ]; then
+  FILE="$1";
+  DIR="$1";
+else
+  case "$0" in
+    *.sh) DIR="$0";;
+    *) DIR="$(lsof -p $$ 2>/dev/null | grep -o '/.*migrate.sh$')";;
+  esac;
+fi;
+DIR=$(dirname "$(readlink -f "$DIR")");
+[ -z "$FILE" ] && FILE="$DIR/custom.pif.json";
+
+OUT="$2";
+[ -z "$OUT" ] && OUT="$DIR/custom.pif.json";
+
+[ -f "$FILE" ] || die "No json file found";
+
+grep_check_json api_level && [ ! "$FORCE" ] && die "No migration required";
+
+[ "$INSTALL" ] || item "Parsing fields ...";
+
+FPFIELDS="BRAND PRODUCT DEVICE RELEASE ID INCREMENTAL TYPE TAGS";
+ALLFIELDS="MANUFACTURER MODEL FINGERPRINT $FPFIELDS SECURITY_PATCH DEVICE_INITIAL_SDK_INT";
+MYFIELDS="$ALLFIELDS _ORIGINAL_FIRST_API_LEVEL _DUMP_SOURCE _COMMENT verboseLogs";
+
+for FIELD in $MYFIELDS; do
+  eval $FIELD=\"$(grep_get_json $FIELD)\";
+done;
+
+if [ -n "$ID" ] && ! grep_check_json build.id; then
+  item 'Simple entry ID found, changing to ID field and "*.build.id" property ...';
+fi;
+
+if [ -z "$ID" ] && grep_check_json BUILD_ID; then
+  item 'Deprecated entry BUILD_ID found, changing to ID field and "*.build.id" property ...';
+  ID="$(grep_get_json BUILD_ID)";
+fi;
+
+if [ -n "$SECURITY_PATCH" ] && ! grep_check_json security_patch; then
+  item 'Simple entry SECURITY_PATCH found, changing to SECURITY_PATCH field and "*.security_patch" property ...';
+fi;
+
+if grep_check_json VNDK_VERSION; then
+  item 'Deprecated entry VNDK_VERSION found, changing to "*.vndk.version" property ...';
+  VNDK_VERSION="$(grep_get_json VNDK_VERSION)";
+fi;
+
+if [ -n "$DEVICE_INITIAL_SDK_INT" ] && ! grep_check_json api_level; then
+  item 'Simple entry DEVICE_INITIAL_SDK_INT found, changing to DEVICE_INITIAL_SDK_INT field and "*api_level" property ...';
+fi;
+
+if [ -z "$DEVICE_INITIAL_SDK_INT" ] && grep_check_json FIRST_API_LEVEL; then
+  item 'Deprecated entry FIRST_API_LEVEL found, changing to DEVICE_INITIAL_SDK_INT field and "*api_level" property ...';
+  DEVICE_INITIAL_SDK_INT="$(grep_get_json FIRST_API_LEVEL)";
+fi;
+
+if [ -z "$DEVICE_INITIAL_SDK_INT" ] && grep_check_json ignore-FIRST_API_LEVEL; then
+  item 'Deprecated entry FIRST_API_LEVEL found, changing to DEVICE_INITIAL_SDK_INT field and "*api_level" property ...';
+  DEVICE_INITIAL_SDK_INT="$(grep_get_json ignore-FIRST_API_LEVEL)";
+fi;
+
+if [ -z "$RELEASE" -o -z "$INCREMENTAL" -o -z "$TYPE" -o -z "$TAGS" -o "$OVERRIDE" ]; then
+  if [ "$OVERRIDE" ]; then
+    item "Overriding values for fields derivable from FINGERPRINT ...";
+  else
+    item "Missing default fields found, deriving from FINGERPRINT ...";
+  fi;
+  
+  IFS='/:' read F1 F2 F3 F4 F5 F6 F7 F8 <<EOF
+$(grep_get_json FINGERPRINT)
+EOF
+
+  i=1;
+  for FIELD in $FPFIELDS; do
+    eval [ -z \"\$$FIELD\" -o \"$OVERRIDE\" ] \&\& $FIELD=\"\$F$i\";
+    i=$((i+1));
+  done;
+fi;
+
+if [ -z "$SECURITY_PATCH" -o "$SECURITY_PATCH" = "null" ]; then
+  item 'Missing required SECURITY_PATCH field and "*.security_patch" property value found, leaving empty ...';
+  unset SECURITY_PATCH;
+fi;
+
+if [ -z "$DEVICE_INITIAL_SDK_INT" -o "$DEVICE_INITIAL_SDK_INT" = "null" ]; then
+  item 'Missing required DEVICE_INITIAL_SDK_INT field and "*api_level" property value found, setting to 25 ...';
+  DEVICE_INITIAL_SDK_INT=25;
+fi;
+
+if [ -z "$verboseLogs" ]; then
+  item 'Setting verboseLogs to 4 ...';
+  verboseLogs=4;
+fi;
+
+if [ -f "$OUT" ]; then
+  [ "$INSTALL" ] || item "Renaming old file to $(basename "$OUT").bak ...";
+  mv -f "$OUT" "$OUT.bak";
+  grep -qE "verboseLogs|VERBOSE_LOGS" "$OUT.bak" && ADVANCED=1;
+fi;
+
+[ "$INSTALL" ] || item "Writing fields and properties to updated custom.pif.json ...";
+
+(echo "{";
+echo "  // Build Fields";
+for FIELD in $ALLFIELDS; do
+  eval echo '\ \ \ \ \"$FIELD\": \"'\$$FIELD'\",';
+done;
+echo "$N  // System Properties";
+echo '    "*.build.id": "'$ID'",';
+echo '    "*.security_patch": "'$SECURITY_PATCH'",';
+[ -z "$VNDK_VERSION" ] || echo '    "*.vndk.version": "'$VNDK_VERSION'",';
+echo '    "*api_level": "'$DEVICE_INITIAL_SDK_INT'",';
+if [ "$ADVANCED" ]; then
+  echo "$N  // Additional fields";
+  [ -z "$_ORIGINAL_FIRST_API_LEVEL" ] || echo '    "_ORIGINAL_FIRST_API_LEVEL": "'$_ORIGINAL_FIRST_API_LEVEL'",';
+  [ -z "$_DUMP_SOURCE" ] || echo '    "_DUMP_SOURCE": "'$_DUMP_SOURCE'",';
+  [ -z "$_COMMENT" ] || echo '    "_COMMENT": "'$_COMMENT'",';
+  [ -z "$verboseLogs" ] || echo '    "verboseLogs": "'$verboseLogs'",';
+fi) | sed '$s/,/\n}/' > "$OUT";
+
+[ "$INSTALL" ] || cat "$OUT";
+
+#set +x
+#exec 1>&3 2>&4 3>&- 4>&-

+ 8 - 0
package.json

@@ -0,0 +1,8 @@
+{
+    "dependencies": {
+        "axios": "^1.7.2",
+        "node-html-parser": "^6.1.13",
+        "p-retry": "^6.2.0"
+    },
+    "type": "module"
+}

+ 69 - 0
pif-gen-vendor-json-files.sh

@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# Crawl recursively and generate custom JSON files for PIF module from stock Xiaomi vendor-build.prop files,
+# provided by zgfg @ xda
+
+echo "Crawl recursively and generate custom vendor.pif.json files for PIF module from Xiaomi stock vendor-build.prop files\
+     \n - provided by zgfg @ xda\n"
+
+
+FOLDERS_DEPTH="4"  # Increase for crawling deeper than to sub-sub-sub-sub-folders 
+
+script_path=${0%/*}
+test_path="$1"; [ -z "$test_path" ] && test_path="$script_path"
+results="$test_path/pif-gen-vendor-results.txt"; rm -f "$results"
+
+echo "results=$results"
+exec 4>&2 3>&1 2>"$results" 1>&2 
+
+module_path="/data/adb/modules/playintegrityfix"
+gen_script="$script_path/gen_pif_vendor.sh"
+[ ! -f "$gen_script" ] || [ ! -s "$gen_script" ] && gen_script="$module_path/gen_pif_vendor.sh"
+[ ! -f "$gen_script" ] || [ ! -s "$gen_script" ] && gen_script=""
+
+echo "PID=$$" | tee -a "$results"
+echo "script_path=$script_path" | tee -a "$results"
+echo "test_path=$test_path" | tee -a "$results"
+echo "gen_script=$gen_script" | tee -a "$results"
+echo "" | tee -a "$results"
+
+(( folders = 0 )); (( created = 0 ))
+
+function f_gen_json()
+{
+  local folder="$1"; local vendor="$2"
+  echo "$vendor" | tee -a "$results"
+  
+  (( val = 2 ))
+  [ -f "$gen_script" ] && sh "$gen_script" "$folder" && (( val = $? ))
+
+  (( val == 0 )) && (( created++ ))
+#  echo "created=$created" | tee -a "$results"
+  echo "" | tee -a "$results"
+}
+
+function f_process_folder()
+{
+  local folder="$1"
+  [[ "$folder" != *essi* ]] && [[ "$folder" != *missi* ]] && [[ "$folder" != *mssi* ]] && [[ "$folder" != *qssi* ]] && return
+  
+  local list=$( ls "$folder"/vendor-build.prop 2>/dev/null )
+  [ -z "$list" ] && return
+
+  (( folders++ ))
+  for vendor in $list
+  do
+    [ -n "$vendor" ] && [ -f "$vendor" ] && [ -r "$vendor" ] && [ -s "$vendor" ] && f_gen_json "$folder" "$vendor"
+  done
+}
+
+list=$( find "$test_path" -maxdepth $FOLDERS_DEPTH -type d 2>/dev/null )
+for folder in $list
+do
+  [ -n "$folder" ] && [ -e "$folder" ] && f_process_folder "$folder"
+done
+  
+echo "folders=$folders, created=$created" | tee -a "$results"
+echo "" | tee -a "$results"
+
+exec 2>&4 1>&3 4>&- 3>&-

+ 7 - 0
pif-gen-vendor-results.txt

@@ -0,0 +1,7 @@
+PID=5333
+script_path=.
+test_path=.
+gen_script=./gen_pif_vendor.sh
+
+folders=0, created=0
+

+ 426 - 0
pif-test-json-files.sh

@@ -0,0 +1,426 @@
+#!/bin/sh
+
+# Crawl recursively and test custom JSON files for PIF module,
+# provided by zgfg @ xda
+
+echo "Crawl recursively and test custom JSON files for PIF module\
+     \n - provided by zgfg @ xda\n"
+
+
+FOLDERS_DEPTH="4"            # Increase for crawling deeper than to sub-sub-sub-sub-folders 
+
+USE_MODULE="PI_FORK"         # Default, for testing with PI Fork module from Osm0sis
+#USE_MODULE="PI_FIX"         # For testing with PI Fix module from Chiteroman 
+
+MIGRATE_JSON="yes"          # Enable to pre-process JSON files by migrate.sh script from Osm0sis, migration script must be in this script's folder or in the PI Fork module's folder - don't use if testing with PI Fix module
+DELETE_FAILED="yes"         # Enable to automatically delete JSON files that fail to pass Device Integrity
+
+TEST_YASNAC="yes"           # Set undefined or empty to skip testing SN with YASNAC, or else script will first test SN with YASNAC (to speed-up filtering of JSON files)
+YASNAC_Y_COORD="1250"       # Try with lower y if it fails to automatically kick "Run SafetyNet Check" button in YASNAC
+YASNAC_WAIT_VERDICT="8"     # SafetyNet verdict usually returns in 3-4 seconds, but if you decrease and verdict arrives later, script will miss to read
+
+TEST_PI="TEST_SPIC"         # Default, for testing PI with Simple Play Integrity Checker
+#TEST_PI="TEST_PICHECK"      # For testing PI with Play Integrity API Checker
+#TEST_PI="TEST_TBCHECKER"    # For testing PI with TB-Checker 
+#TEST_PI="TEST_IAPI"         # For testing PI with Integrity API
+
+PIF_JSON="*.json"           # Default, PIF JSON mask to test all *.json files
+#PIF_JSON="custom.pif.json"  # PIF JSON mask to test only custom.pif.json files
+#PIF_JSON="vendor.pif.json"  # PIF JSON mask to test only vendor.pif.json files
+
+X_COORD="500"               # Should fit for all YASNAC, SPIC, TB-Checker, PI API Checker and Integrity API
+PI_WAIT_VERDICT="10"        # Play Integrity verdict usually returns in 5-6 seconds, but if you decrease and verdict arrives later, script will miss to read
+
+SPIC_Y_COORD="1000"         # Try with lower y if script fails to automatically kick "Make Play Integrity request" button in SPIC
+PICHECK_Y_COORD="1600"      # Try with lower y if it fails to automatically kick "Check" button in PI API Checker
+TBCHECKER_Y_COORD="1900"    # Try with lower y if it fails to automatically kick "Check Play Integrity" button in TB-Checker
+IAPI_Y_COORD="350"          # Try with lower y if it fails to automatically kick "Request A Universal Integrity Token With The Cloud Project" button in Integrity API
+
+# Change the code beyond this line only on your own risk
+
+module_path="/data/adb/modules/playintegrityfix"
+[ "$USE_MODULE" != "PI_FIX" ] && USE_MODULE="PI_FORK" && custom_json="$module_path/custom.pif.json"
+[ "$USE_MODULE" == "PI_FIX" ] && custom_json="/data/adb/pif.json"
+
+script_path=${0%/*}
+migrate_script="$script_path/migrate.sh"
+[ ! -f "$migrate_script" ] || [ ! -s "$migrate_script" ] && migrate_script="$module_path/migrate.sh"
+[ ! -f "$migrate_script" ] || [ ! -s "$migrate_script" ] && migrate_script=""
+
+test_path="$1"; [ -z "$test_path" ] && test_path="$script_path"
+custom_bak="$test_path/custom.pif.bak"
+
+results="$test_path/pif-test-results.txt"; rm -f "$results"
+echo "results=$results"
+echo "PID=$$" | tee -a "$results"
+echo "script_path=$script_path, test_path=$test_path" | tee -a "$results"
+echo "USE_MODULE=$USE_MODULE, custom_json=$custom_json" | tee -a "$results"
+echo "MIGRATE_JSON=$MIGRATE_JSON, migrate_script=$migrate_script, DELETE_FAILED=$DELETE_FAILED" | tee -a "$results"
+echo "TEST_YASNAC=$TEST_YASNAC, TEST_PI=$TEST_PI, PIF_JSON=$PIF_JSON" | tee -a "$results"
+echo "" | tee -a "$results"
+
+log="$test_path/pif.log"
+yasnac_xml="$test_path/yasnac.xml"; spic_xml="$test_path/spic.xml"; picheck_xml="$test_path/picheck.xml"; tbchecker_xml="$test_path/tbchecker.xml"; iapi_xml="$test_path/iapi.xml"
+
+yasnac="rikka.safetynetchecker"
+spic="com.henrikherzig.playintegritychecker"
+picheck=gr.nikolasspyr.integritycheck
+tbchecker="krypton.tbsafetychecker"
+iapi="com.test.integrity.api.qa.googlemanaged"
+
+integrities="NO_INTEGRITY MEETS_VIRTUAL_INTEGRITY MEETS_BASIC_INTEGRITY MEETS_DEVICE_INTEGRITY MEETS_STRONG_INTEGRITY"
+
+rm -f "$custom_bak"; cp "$custom_json" "$custom_bak" >/dev/null 2>&1
+
+orient=$(settings get system user_rotation)
+auto_rot=$(settings get system accelerometer_rotation)
+settings put system user_rotation 0
+settings put system accelerometer_rotation 0
+
+(( folders = 0 )); (( tested = 0 )); (( migrated = 0 )); (( setApi25 = 0 )); (( passed = 0 )); (( failed = 0 )); (( inconclusive = 0 ))
+
+
+function f_remove_file()
+{
+  local file="$1"
+  rm -f "$file" >/dev/null 2>&1
+}
+
+function f_start_activity()
+{
+  local activity="$1"
+  am start -n "$activity" >/dev/null 2>&1
+}
+
+function f_kill_app()
+{
+  local app="$1"
+  am force-stop "$app" >/dev/null 2>&1
+}
+
+function f_kill_gms()
+{
+  logcat -c
+  killall com.google.android.gms.unstable >/dev/null 2>&1
+}
+
+function f_tap_test()
+{
+  local y_coord="$1"
+  input tap $X_COORD "$y_coord" >/dev/null 2>&1
+}
+
+function f_dump_xml()
+{
+  local xml="$1"
+  uiautomator dump "$xml" >/dev/null 2>&1
+}
+
+function f_test_yasnac()
+{
+  local json="$1"
+  cp "$json" $custom_json
+  f_remove_file "$log"; f_remove_file "$yasnac_xml"
+
+  f_start_activity $yasnac/$yasnac.main.MainActivity
+  sleep 2
+
+  f_kill_gms
+  f_tap_test $YASNAC_Y_COORD
+
+  sleep $YASNAC_WAIT_VERDICT
+  f_dump_xml "$yasnac_xml"
+  f_kill_app $yasnac
+  logcat -d | grep PIF >> "$log"
+
+  (( pass = 0 )); found=$(cat "$yasnac_xml" | grep "Pass")
+  [ -n "$found" ] && (( pass = 1 ))
+
+  (( fail = 0 )); found=$(cat "$yasnac_xml" | grep "Fail")
+  [ -n "$found" ] && (( fail = 1 ))
+
+  (( basic = 0 )); found=$(cat "$yasnac_xml" | grep "BASIC")
+  [ -n "$found" ] && (( basic = 1 ))
+
+  (( hw = 0 )); found=$(cat "$yasnac_xml" | grep "HARDWARE_BACKED")
+  [ -n "$found" ] && (( hw = 1 ))
+
+#  echo "SN Pass:$pass Fail:$fail BASIC:$basic HW:$hw" | tee -a "$results"
+  ((( basic + hw != 1 )) || (( pass + fail < 1 ))) && return 0
+
+  local sn="SN Basic"
+  (( pass == 0 )) && sn="$sn: Fail"
+  (( pass > 0 )) && sn="$sn: Pass"
+  
+  sn="$sn, CTS"
+  (( hw == 0 )) && sn="$sn: BASIC"
+  (( hw > 0 )) && sn="$sn: HARDWARE_BACKED"
+  
+  (( fail > 0 )) && sn="$sn: Fail"
+  (( fail == 0 )) && sn="$sn: Pass"
+  echo "$sn" | tee -a "$results"
+  
+  (( pass == 0 )) && return 1
+  (( fail > 0 )) && return 2
+  (( hw == 0 )) && return 3
+  return 4
+}
+
+function f_test_spic()
+{
+  local json="$1"
+  cp "$json" $custom_json
+  f_remove_file "$log"; f_remove_file "$spic_xml"
+
+  f_start_activity $spic/$spic.MainActivity
+  sleep 2
+
+  f_kill_gms
+  f_tap_test $SPIC_Y_COORD
+
+  sleep $PI_WAIT_VERDICT
+  f_dump_xml "$spic_xml"
+  f_kill_app $spic
+  logcat -d | grep PIF >> "$log"
+
+  (( i = 0 )); (( val = i++ ))
+  for meets in $integrities
+  do
+    found=$(cat "$spic_xml" | grep $meets)
+    [ -n "$found" ] && echo $meets | tee -a "$results" && (( val = i ))
+    (( i++ ))
+  done
+  return $val
+}
+
+function f_test_picheck()
+{
+  local json="$1"
+  cp "$json" $custom_json
+  f_remove_file "$log"; f_remove_file "$picheck_xml"
+
+  f_start_activity $picheck/$picheck.MainActivity
+  sleep 2
+
+  f_kill_gms
+  f_tap_test $PICHECK_Y_COORD
+
+  sleep $PI_WAIT_VERDICT
+  input tap 870 190
+  sleep 1
+  f_dump_xml "$picheck_xml"
+  f_kill_app $picheck
+  logcat -d | grep PIF >> "$log"
+
+  (( i = 0 )); (( val = i++ ))
+  for meets in $integrities
+  do
+    found=$(cat "$picheck_xml" | grep $meets)
+    [ -n "$found" ] && echo $meets | tee -a "$results" && (( val = i ))
+    (( i++ ))
+  done
+  (( val > 0 )) && return $val
+
+  local deviceIntegrity=$(cat "$picheck_xml" | grep -o "deviceIntegrity")
+  local deviceRecognition=$(cat "$picheck_xml" | grep -o "deviceRecognitionVerdict") 
+#  echo "integrity=$deviceIntegrity, recognition=$deviceRecognition" | tee -a "$results"
+  [ -n "$deviceIntegrity" ] && [ -z "$deviceRecognition" ] && echo NO_INTEGRITY | tee -a "$results" && (( val = 1 ))
+
+  return $val
+}
+
+function f_test_tbchecker()
+{
+  local json="$1"
+  cp "$json" $custom_json
+  f_remove_file "$log"; f_remove_file "$tbchecker_xml"
+
+  f_start_activity $tbchecker/$tbchecker.main.MainActivity
+  sleep 2
+
+  f_kill_gms
+  f_tap_test $TBCHECKER_Y_COORD
+
+  sleep $PI_WAIT_VERDICT
+  f_dump_xml "$tbchecker_xml"
+  f_kill_app $tbchecker
+  logcat -d | grep PIF >> "$log"
+
+  local pass=$(cat "$tbchecker_xml" | grep -o 'Pass' | wc -l)
+  local fail=$(cat "$tbchecker_xml" | grep -o 'Fail' | wc -l)
+#  echo "PI Pass:$pass Fail:$fail" | tee -a "$results"
+
+  (( val = pass+2 ))
+  (( pass == 1 )) && meets=MEETS_BASIC_INTEGRITY
+  (( pass == 2 )) && meets=MEETS_DEVICE_INTEGRITY
+  (( pass == 3 )) && meets=MEETS_STRONG_INTEGRITY
+
+  (( pass == 0 )) && meets=NO_INTEGRITY && (( val = 1 ))
+  (( pass == 0 )) && (( fail == 0 )) && meets="" && (( val = 0 ))
+ 
+  [ -n "$meets" ] && echo $meets | tee -a "$results"
+  return $val
+}
+
+function f_test_iapi()
+{
+  local json="$1"
+  cp "$json" $custom_json
+  f_remove_file "$log"; f_remove_file "$iapi_xml"
+
+  f_start_activity $iapi/com.dynamic.integrity.MainActivity
+  sleep 2
+
+  f_kill_gms
+  f_tap_test $IAPI_Y_COORD
+
+  sleep $PI_WAIT_VERDICT
+  f_dump_xml "$iapi_xml"
+  f_kill_app $iapi
+  logcat -d | grep PIF >> "$log"
+
+  (( i = 0 )); (( val = i++ ))
+  for meets in $integrities
+  do
+    found=$(cat "$iapi_xml" | grep $meets)
+    [ -n "$found" ] && echo $meets | tee -a "$results" && (( val = i ))
+    (( i++ ))
+  done
+  return $val
+}
+
+function f_test_pi()
+{
+  local json="$1"; local verbose="$2"
+
+  local prop=$(cat "$json" | grep -o '"\SECURITY_PATCH"[^,}]*')
+  [ -n "$verbose" ] && [ -n "$prop" ] && echo "$prop" | tee -a "$results"
+
+  prop=$(cat "$json" | grep -o '"\_ORIGINAL_FIRST_API_LEVEL"[^,}]*')
+  [ -n "$verbose" ] && [ -n "$prop" ] && echo "$prop" | tee -a "$results"
+
+  prop=$(cat "$json" | grep -o '"\*api_level"[^,}]*')
+  [ -n "$prop" ] && echo "$prop" | tee -a "$results"
+
+  prop=$(cat "$json" | grep -o '"\DEVICE_INITIAL_SDK_INT"[^,}]*')
+  [ -n "$prop" ] && echo "$prop" | tee -a "$results"
+
+  prop=$(cat "$json" | grep -o '"\FIRST_API_LEVEL"[^,}]*')
+  [ -n "$prop" ] && echo "$prop" | tee -a "$results"
+
+  case "$TEST_PI" in
+    TEST_PICHECK) f_test_picheck "$json"
+    ;;
+    TEST_TBCHECKER) f_test_tbchecker "$json"
+    ;;
+    TEST_IAPI) f_test_iapi "$json"
+    ;;
+    TEST_SPIC|*) f_test_spic "$json"
+    ;;
+  esac
+  (( val = $? )); return $val
+}
+
+function f_set_api_25()
+{
+  local json="$1"
+
+  sed -i 's/"\*api_level"[^,}]*/"\*api_level": "25"/' "$json"
+  sed -i 's/"DEVICE_INITIAL_SDK_INT"[^,}]*/"DEVICE_INITIAL_SDK_INT": "25"/' "$json"
+  sed -i 's/"FIRST_API_LEVEL"[^,}]*/"FIRST_API_LEVEL": "25"/' "$json"
+
+  (( setApi25++ ))
+}
+
+function f_migrate_json()
+{
+  local json="$1"; local folder="$2"
+
+  local custom=""
+  [ -f "$migrate_script" ] && sh "$migrate_script" -i -f -o -a "$json" && custom="$folder/custom.pif.json"
+  [ -f "$custom" ] && mv "$custom" "$json" && (( migrated++ ))
+}
+
+function f_prep_json()
+{
+  local json="$1"; local folder="$2"
+  
+  [ -n "$MIGRATE_JSON" ] && f_migrate_json "$json" "$folder"
+  
+#  sed -i 's/"VNDK_VERSION"/"ignore-VNDK_VERSION"/' "$json"
+
+  [ "$USE_MODULE" == "PI_FORK" ] && api25=$(cat "$json" | grep -o '"\*api_level"[^,}]*' | grep -o '25')
+
+  local prop=$(cat "$json" | grep -o '"FIRST_API_LEVEL"[^,}]*')
+  [ "$USE_MODULE" == "PI_FIX" ] && [ -n "$api25" ] && api25=$(echo "$prop" | grep -o '25')
+
+  prop=$(cat "$json" | grep -o '"DEVICE_INITIAL_SDK_INT"[^,}]*')
+  [ "$USE_MODULE" == "PI_FORK" ] && [ -n "$prop" ] && [ -n "$api25" ] && api25=$(echo "$prop" | grep -o '25')
+
+#  echo "api25=$api25" | tee -a "$results"
+}
+
+function f_test_json()
+{
+  local json="$1"; local folder="$2"
+  echo "$json" | tee -a "$results"
+  (( tested++ ))
+  
+  f_prep_json "$json" "$folder"
+
+  (( val = 0 )); local changeApi=""
+  if [ -n "$TEST_YASNAC" ]; then
+    f_test_yasnac "$json"; (( val = $? ))
+    (( val == 2 )) && changeApi="yes"
+  fi
+#  echo "api25=$api25, changeApi=$changeApi" | tee -a "$results"
+
+  [ -z "$api25" ] && [ -n "$changeApi" ] && f_set_api_25 "$json"
+  (( val != 1 )) && f_test_pi "$json" "yes" && (( val = $? ))
+  (( val > 1 )) && (( val < 4 )) && [ -z "$api25" ] && [ -z "$changeApi" ] && f_set_api_25 "$json" && f_test_pi "$json" && (( val = $? ))
+
+  (( val > 0 )) && (( val < 4 )) && (( failed++ ))
+  (( val > 0 )) && (( val < 4 ))  && [ -n "$DELETE_FAILED" ] && echo "Deleted" | tee -a "$results" && f_remove_file "$json"  
+
+  (( val == 0 )) && echo "Inconclusive" | tee -a "$results" && (( inconclusive++ ))
+  (( val >= 4 )) && (( passed++ ))
+  
+#  echo "tested=$tested, setApi25=$setApi25, passed=$passed" | tee -a "$results"
+#  echo "failed=$failed, inconclusive=$inconclusive" | tee -a "$results"
+  echo "" | tee -a "$results"
+  return $val
+}
+
+function f_test_folder()
+{
+  local folder="$1"
+  
+  local list=$( ls "$folder"/$PIF_JSON 2>/dev/null )
+  [ -z "$list" ] && return
+
+  (( folders++ ))
+  for json in $list
+  do
+    [ -n "$json" ] && [ -f "$json" ] && [ -r "$json" ] && [ -s "$json" ] && f_test_json "$json" "$folder"
+  done
+}
+
+list=$( find "$test_path" -maxdepth $FOLDERS_DEPTH -type d 2>/dev/null )
+for folder in $list
+do
+  [ -n "$folder" ] && [ -e "$folder" ] && f_test_folder "$folder"
+done
+  
+echo "folders=$folders" | tee -a "$results"
+echo "tested=$tested, migrated=$migrated, setApi25=$setApi25" | tee -a "$results"
+echo "passed=$passed, failed=$failed, inconclusive=$inconclusive" | tee -a "$results"
+echo "" | tee -a "$results"
+
+f_remove_file "$custom_json"; cp "$custom_bak" "$custom_json" >/dev/null 2>&1
+f_kill_gms
+
+f_kill_app $yasnac; f_kill_app $spic; f_kill_app $picheck; f_kill_app $tbchecker; f_kill_app $iapi
+f_remove_file "$yasnac_xml"; f_remove_file "$spic_xml"; f_remove_file "$picheck_xml"; f_remove_file "$tbchecker_xml"; f_remove_file "$iapi_xml"
+
+settings put system user_rotation "$orient"
+settings put system accelerometer_rotation "$auto_rot"

+ 398 - 0
vendor-build.prop

@@ -0,0 +1,398 @@
+#
+# ADDITIONAL_DEFAULT_PROPERTIES
+#
+ro.actionable_compatible_property.enabled=true
+ro.postinstall.fstab.prefix=/system
+ro.oem_unlock_supported=1
+ro.secure=1
+security.perf_harden=1
+ro.adb.secure=1
+ro.allow.mock.location=0
+ro.debuggable=0
+debug.atrace.tags.enableflags=0
+persist.traced.enable=1
+com.samsung.speg.disable=true
+dalvik.vm.image-dex2oat-Xms=64m
+dalvik.vm.image-dex2oat-Xmx=64m
+dalvik.vm.dex2oat-Xms=64m
+dalvik.vm.dex2oat-Xmx=512m
+dalvik.vm.usejit=true
+dalvik.vm.usejitprofiles=true
+dalvik.vm.dexopt.secondary=true
+dalvik.vm.appimageformat=lz4
+ro.dalvik.vm.native.bridge=0
+pm.dexopt.first-boot=quicken
+pm.dexopt.boot=verify
+pm.dexopt.install=speed-profile
+pm.dexopt.bg-dexopt=speed-profile
+pm.dexopt.ab-ota=speed-profile
+pm.dexopt.inactive=verify
+pm.dexopt.shared=speed
+dalvik.vm.dex2oat-updatable-bcp-packages-file=/system/etc/updatable-bcp-packages.txt
+dalvik.vm.dex2oat-resolve-startup-strings=true
+dalvik.vm.dex2oat-max-image-block-size=524288
+dalvik.vm.minidebuginfo=true
+dalvik.vm.dex2oat-minidebuginfo=true
+ro.iorapd.enable=false
+ro.multisim.simslotcount=1
+ro.telephony.default_cdma_sub=0
+ro.telephony.iwlan_operation_mode=legacy
+persist.radio.sib16_support=1
+restore.feature.use_samsung_smart_switch_flow=1
+setupwizard.feature.enable_stencil_partner_customization=1
+ro.com.google.clientidbase=android-samsung-ss
+ro.setupwizard.rotation_locked=false
+setupwizard.theme=glif_v3_light
+ro.setupwizard.wifi_on_exit=false
+ro.setupwizard.mode=OPTIONAL
+ro.opa.eligible_device=true
+ro.com.google.gmsversion=11_202106
+persist.sys.usb.config=none
+#
+# ADDITIONAL VENDOR DEFAULT PROPERTIES
+#
+ro.vndk.version=30
+persist.sys.usb.config=mtp
+ro.zygote=zygote64_32
+ro.logd.size.stats=64K
+log.tag.stats_log=I
+ro.vendor.multisim.simslotcount=1
+ro.radio.noril=no
+ro.vendor.epdg.support=true
+ro.bionic.arch=arm64
+ro.bionic.cpu_variant=generic
+ro.bionic.2nd_arch=arm
+ro.bionic.2nd_cpu_variant=cortex-a53
+persist.sys.dalvik.vm.lib.2=libart.so
+dalvik.vm.isa.arm64.variant=generic
+dalvik.vm.isa.arm64.features=default
+dalvik.vm.isa.arm.variant=cortex-a53
+dalvik.vm.isa.arm.features=default
+
+# begin common build properties
+# autogenerated by build/make/tools/buildinfo_common.sh
+ro.system.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.system.build.date.utc=1663045168
+ro.system.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+ro.system.build.id=RP1A.200720.012
+ro.system.build.tags=release-keys
+ro.system.build.type=user
+ro.system.build.version.incremental=A205U1UESDCVI1
+ro.system.build.version.release=11
+ro.system.build.version.release_or_codename=11
+ro.system.build.version.sdk=30
+ro.product.system.brand=samsung
+ro.product.system.device=a20p
+ro.product.system.manufacturer=samsung
+ro.product.system.model=SM-A205U1
+ro.product.system.name=a20pue
+# end common build properties
+# begin build properties
+# autogenerated by buildinfo.sh
+ro.build.id=RP1A.200720.012
+ro.build.display.id=RP1A.200720.012.A205U1UESDCVI1
+ro.build.keys=test-keys
+ro.build.display_build_number=true
+ro.build.version.incremental=A205U1UESDCVI1
+ro.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.build.date.utc=1663045168
+ro.build.version.sdk=30
+ro.build.version.preview_sdk=0
+ro.build.version.preview_sdk_fingerprint=REL
+ro.build.version.codename=REL
+ro.build.version.all_codenames=REL
+ro.build.version.release=11
+ro.build.version.release_or_codename=11
+ro.build.version.security_patch=2022-09-01
+ro.build.version.base_os=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UEU9CUH3:user/release-keys
+ro.build.version.security_index=1
+ro.build.version.min_supported_target_sdk=23
+ro.build.type=user
+ro.build.user=dpi
+ro.build.host=SWDK6309
+ro.build.tags=release-keys
+ro.build.flavor=a20pue-user
+ro.build.system_root_image=true
+ro.build.tf_modelnumber=SM-A205U1
+# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,
+# use ro.product.cpu.abilist instead.
+ro.product.cpu.abi=arm64-v8a
+ro.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi
+ro.product.cpu.abilist32=armeabi-v7a,armeabi
+ro.product.cpu.abilist64=arm64-v8a
+ro.product.locale=en-US
+ro.wifi.channels=
+# ro.build.product is obsolete; use ro.product.device
+# ro.product.name/ro.product.device should use PRODUCT_MODEL in case of jpn model
+ro.build.product=a20p
+# Do not try to parse description or thumbprint
+ro.build.description=a20pue-user 11 RP1A.200720.012 A205U1UESDCVI1 release-keys
+# Samsung Specific Properties
+ro.build.PDA=A205U1UESDCVI1
+ro.build.sw_version=A205U1UESDCVI1
+ro.build.official.release=true
+ro.build.2ndbrand=false
+ro.config.rm_preload_enabled=1
+ro.build.changelist=21984420
+ro.product_ship=true
+ro.user_trial=FALSE
+ro.hardware.chipname=exynos7904
+ro.build.characteristics=phone
+# end build properties
+
+#
+# from device/samsung/a20p/system.prop
+#
+#
+# system.prop for universal7885
+#
+
+ro.arch=exynos7904
+ro.kernel.qemu=0
+ro.kernel.qemu.gles=1
+persist.demo.hdmirotationlock=false
+
+#Enable S.LSI USB settings
+dev.usbsetting.embedded=on
+
+#RILD debug level setting
+ro.debug_level=0x494d
+
+#Phone early start enable flag
+sys.config.phone_start_early=true
+
+#for DTV FullSeg SD Recording..
+oneseg.extSdCard.path=/storage/extSdCard
+
+#Status of softsim
+persist.sys.softsim.status=default,default
+persist.sys.softsim.netmode=3g
+persist.sys.softsim.type=default
+
+# Set csc support in OMX
+# If not set or set to 0, OMX will only use BT.601 colorspace.
+# Set to 1 if and only if BOARD_USES_EXYNOS_DATASPACE_FEATURE := true in BoardConfig.mk
+ro.vendor.cscsupported=1
+
+#for DTV FullSeg SD Recording..
+oneseg.extSdCard.path=/storage/extSdCard
+
+
+
+# end of device/samsung/a20p/system.prop
+
+#
+# ADDITIONAL_BUILD_PROPERTIES
+#
+ro.product.first_api_level=28
+ro.treble.enabled=true
+ro.build.version.sem=3001
+ro.build.version.sep=120100
+persist.log.semlevel=0xFFFFFF00
+persist.log.level=0xFFFFFFFF
+ro.system.build.version.sehi=3003
+ro.build.selinux=1
+ro.config.iccc_version=3.0
+ro.config.dmverity=G
+ro.config.tima=1
+ro.config.timaversion=3.0
+ro.config.timaversion_info=Knox3.4_S.R.R
+ro.config.knox.ucm=1
+ro.config.knox=v30
+ro.kernel.qemu=0
+net.bt.name=Android
+
+ro.product.first_api_level=28
+ro.vendor.build.security_patch=
+ro.vendor.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi
+ro.vendor.product.cpu.abilist32=armeabi-v7a,armeabi
+ro.vendor.product.cpu.abilist64=arm64-v8a
+ro.product.board=exynos7904
+ro.board.platform=universal7904
+ro.hwui.use_vulkan=
+# begin common build properties
+# autogenerated by build/make/tools/buildinfo_common.sh
+ro.vendor.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.vendor.build.date.utc=1663045168
+ro.vendor.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+ro.vendor.build.id=RP1A.200720.012
+ro.vendor.build.tags=release-keys
+ro.vendor.build.type=user
+ro.vendor.build.version.incremental=A205U1UESDCVI1
+ro.vendor.build.version.release=11
+ro.vendor.build.version.release_or_codename=11
+ro.vendor.build.version.sdk=30
+ro.product.vendor.brand=samsung
+ro.product.vendor.device=a20p
+ro.product.vendor.manufacturer=samsung
+ro.product.vendor.model=SM-A205U1
+ro.product.vendor.name=a20pue
+# end common build properties
+#
+# BOOTIMAGE_BUILD_PROPERTIES
+#
+ro.bootimage.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.bootimage.build.date.utc=1663045168
+ro.bootimage.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+#
+# ADDITIONAL VENDOR BUILD PROPERTIES
+#
+net.dns1=8.8.8.8
+net.dns2=8.8.4.4
+persist.demo.hdmirotationlock=false
+dev.usbsetting.embedded=on
+ro.surface_flinger.vsync_event_phase_offset_ns=0
+ro.surface_flinger.vsync_sf_event_phase_offset_ns=0
+ro.surface_flinger.max_frame_buffer_acquired_buffers=3
+ro.surface_flinger.running_without_sync_framework=false
+debug.sf.disable_backpressure=1
+wifi.interface=wlan0
+ro.opengles.version=196610
+debug.slsi_platform=1
+debug.hwc.winupdate=1
+dalvik.vm.heapstartsize=8m
+dalvik.vm.heapgrowthlimit=192m
+dalvik.vm.heapsize=512m
+dalvik.vm.heaptargetutilization=0.75
+dalvik.vm.heapminfree=512k
+dalvik.vm.heapmaxfree=8m
+security.ASKS.policy_version=00000000
+security.ASKS.version=0
+security.ASKS.time_value=00000000
+security.ASKS.rufs_enable=true
+security.ADP.version=0
+security.ADP.policy_version=00000000
+sys.config.activelaunch_enable=true
+ro.smps.enable=false
+ro.hardware.keystore=mdfpp
+ro.security.keystore.keytype=sak,gak
+security.securehw.available=false
+security.securenvm.available=false
+ro.apex.updatable=false
+sys.config.hardcoder.enable=false
+sys.config.ibs.enable=false
+dalvik.vm.lockprof.threshold=500
+ro.control_privapp_permissions=enforce
+ro.carrier=unknown
+telephony.lteOnCdmaDevice=0
+vendor.sec.rild.libpath=/vendor/lib64/libsec-ril.so
+persist.radio.multisim.config=ss
+ro.security.cass.feature=1
+ro.security.vpnpp.ver=2.2
+ro.security.vpnpp.release=1.0
+ro.config.ringtone=Over_the_Horizon.ogg
+ro.config.notification_sound=Spaceline.ogg
+ro.config.alarm_alert=Homecoming.ogg
+ro.config.media_sound=Media_preview_Touch_the_light.ogg
+ro.config.ringtone_2=Atomic_Bell.ogg
+ro.config.notification_sound_2=Signal.ogg
+ro.config.vc_call_vol_steps=8
+ro.build.scafe.version=2021A
+ro.sf.lcd_density=280
+ro.slmk.dha_th_rate=2.0
+ro.slmk.add_bonusEFK=2
+ro.slmk.v_bonusEFK=20480
+ro.slmk.dha_lmk_scale=0.2425
+ro.slmk.dha_cached_min=3
+ro.slmk.dha_cached_max=6
+ro.slmk.dha_empty_min=6
+ro.slmk.dha_empty_init=16
+ro.slmk.dha_empty_max=16
+ro.slmk.2nd.dha_cached_min=6
+ro.slmk.2nd.dha_cached_max=12
+ro.slmk.2nd.dha_empty_min=6
+ro.slmk.2nd.dha_empty_init=20
+ro.slmk.2nd.dha_empty_max=20
+ro.slmk.dha_2ndprop_thMB=2048
+ro.slmk.fha_enable=true
+ro.slmk.enable_userspace_lmk=true
+ro.slmk.kill_heaviest_task=true
+ro.slmk.custom_sw_limit=225
+ro.slmk.2nd.custom_sw_limit=225
+ro.slmk.2nd.upgrade_pressure=55
+ro.slmk.custom_tm_limit=1000
+ro.slmk.2nd.freelimit_val=10
+ro.slmk.enable_reentry_lmk=true
+persist.sys.kpm_onoff=false
+ro.slmk.chimera_strategy_3gb=560,8,7,1098
+persist.sys.zram.daily_quota_remain=131072
+ro.sys.kernelmemory.nandswap.daily_quota=131072
+ro.sys.kernelmemory.nandswap.daily_quota_limit=393216
+ro.config.pageboost.vramdisk.bootfile.enabled=true
+ro.config.pageboost.vramdisk.minimize=true
+ro.frp.pst=/dev/block/persistent
+ro.config.systemaudiodebug=abox
+ro.camera.notify_nfc=1
+
+ro.odm.product.cpu.abilist=arm64-v8a,armeabi-v7a,armeabi
+ro.odm.product.cpu.abilist32=armeabi-v7a,armeabi
+ro.odm.product.cpu.abilist64=arm64-v8a
+# begin common build properties
+# autogenerated by build/make/tools/buildinfo_common.sh
+ro.odm.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.odm.build.date.utc=1663045168
+ro.odm.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+ro.odm.build.id=RP1A.200720.012
+ro.odm.build.tags=release-keys
+ro.odm.build.type=user
+ro.odm.build.version.incremental=A205U1UESDCVI1
+ro.odm.build.version.release=11
+ro.odm.build.version.release_or_codename=11
+ro.odm.build.version.sdk=30
+ro.product.odm.brand=samsung
+ro.product.odm.device=a20p
+ro.product.odm.manufacturer=samsung
+ro.product.odm.model=SM-A205U1
+ro.product.odm.name=a20pue
+# end common build properties
+#
+# ADDITIONAL ODM BUILD PROPERTIES
+#
+
+# begin common build properties
+# autogenerated by build/make/tools/buildinfo_common.sh
+ro.product.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.product.build.date.utc=1663045168
+ro.product.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+ro.product.build.id=RP1A.200720.012
+ro.product.build.tags=release-keys
+ro.product.build.type=user
+ro.product.build.version.incremental=A205U1UESDCVI1
+ro.product.build.version.release=11
+ro.product.build.version.release_or_codename=11
+ro.product.build.version.sdk=30
+ro.product.product.brand=samsung
+ro.product.product.device=a20p
+ro.product.product.manufacturer=samsung
+ro.product.product.model=SM-A205U1
+ro.product.product.name=a20pue
+# end common build properties
+#
+# ADDITIONAL PRODUCT PROPERTIES
+#
+ro.build.characteristics=phone
+
+# begin common build properties
+# autogenerated by build/make/tools/buildinfo_common.sh
+ro.system_ext.build.date=Tue Sep 13 13:59:28 KST 2022
+ro.system_ext.build.date.utc=1663045168
+ro.system_ext.build.fingerprint=samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys
+ro.system_ext.build.id=RP1A.200720.012
+ro.system_ext.build.tags=release-keys
+ro.system_ext.build.type=user
+ro.system_ext.build.version.incremental=A205U1UESDCVI1
+ro.system_ext.build.version.release=11
+ro.system_ext.build.version.release_or_codename=11
+ro.system_ext.build.version.sdk=30
+ro.product.system_ext.brand=samsung
+ro.product.system_ext.device=a20p
+ro.product.system_ext.manufacturer=samsung
+ro.product.system_ext.model=SM-A205U1
+ro.product.system_ext.name=a20pue
+# end common build properties
+#
+# ADDITIONAL SYSTEM_EXT BUILD PROPERTIES
+#
+#
+# RECOVERY UI BUILD PROPERTIES
+#

+ 12 - 0
vendor.pif.json.bak

@@ -0,0 +1,12 @@
+{
+  "MANUFACTURER": "samsung",
+  "MODEL": "SM-A205U1",
+  "FINGERPRINT": "samsung/a20pue/a20p:11/RP1A.200720.012/A205U1UESDCVI1:user/release-keys",
+  "BRAND": "samsung",
+  "PRODUCT": "a20pue",
+  "DEVICE": "a20p",
+  "SECURITY_PATCH": "2022-09-01",
+  "VNDK_VERSION": "30",
+  "FIRST_API_LEVEL": "28",
+  "DEVICE_INITIAL_SDK_INT": "30"
+}

+ 160 - 0
yarn.lock

@@ -0,0 +1,160 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/retry@0.12.2":
+  version "0.12.2"
+  resolved "https://registry.npmmirror.com/@types/retry/-/retry-0.12.2.tgz#ed279a64fa438bb69f2480eda44937912bb7480a"
+  integrity sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@^1.7.2:
+  version "1.7.2"
+  resolved "https://registry.npmmirror.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621"
+  integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==
+  dependencies:
+    follow-redirects "^1.15.6"
+    form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
+
+boolbase@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
+css-select@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.npmmirror.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
+  integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
+  dependencies:
+    boolbase "^1.0.0"
+    css-what "^6.1.0"
+    domhandler "^5.0.2"
+    domutils "^3.0.1"
+    nth-check "^2.0.1"
+
+css-what@^6.1.0:
+  version "6.1.0"
+  resolved "https://registry.npmmirror.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+  integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+dom-serializer@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+  integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+  dependencies:
+    domelementtype "^2.3.0"
+    domhandler "^5.0.2"
+    entities "^4.2.0"
+
+domelementtype@^2.3.0:
+  version "2.3.0"
+  resolved "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+  integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^5.0.2, domhandler@^5.0.3:
+  version "5.0.3"
+  resolved "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+  integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+  dependencies:
+    domelementtype "^2.3.0"
+
+domutils@^3.0.1:
+  version "3.1.0"
+  resolved "https://registry.npmmirror.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
+  integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
+  dependencies:
+    dom-serializer "^2.0.0"
+    domelementtype "^2.3.0"
+    domhandler "^5.0.3"
+
+entities@^4.2.0:
+  version "4.5.0"
+  resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+  integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+follow-redirects@^1.15.6:
+  version "1.15.6"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
+he@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.npmmirror.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
+
+is-network-error@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/is-network-error/-/is-network-error-1.1.0.tgz#d26a760e3770226d11c169052f266a4803d9c997"
+  integrity sha512-tUdRRAnhT+OtCZR/LxZelH/C7QtjtFrTu5tXCA8pl55eTUElUHT+GPYV8MBMBvea/j+NxQqVt3LbWMRir7Gx9g==
+
+mime-db@1.52.0:
+  version "1.52.0"
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+  version "2.1.35"
+  resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
+node-html-parser@^6.1.13:
+  version "6.1.13"
+  resolved "https://registry.npmmirror.com/node-html-parser/-/node-html-parser-6.1.13.tgz#a1df799b83df5c6743fcd92740ba14682083b7e4"
+  integrity sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==
+  dependencies:
+    css-select "^5.1.0"
+    he "1.2.0"
+
+nth-check@^2.0.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+  integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+  dependencies:
+    boolbase "^1.0.0"
+
+p-retry@^6.2.0:
+  version "6.2.0"
+  resolved "https://registry.npmmirror.com/p-retry/-/p-retry-6.2.0.tgz#8d6df01af298750009691ce2f9b3ad2d5968f3bd"
+  integrity sha512-JA6nkq6hKyWLLasXQXUrO4z8BUZGUt/LjlJxx8Gb2+2ntodU/SS63YZ8b0LUTbQ8ZB9iwOfhEPhg4ykKnn2KsA==
+  dependencies:
+    "@types/retry" "0.12.2"
+    is-network-error "^1.0.0"
+    retry "^0.13.1"
+
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
+retry@^0.13.1:
+  version "0.13.1"
+  resolved "https://registry.npmmirror.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+  integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==