视频一区二区三区自拍_千金肉奴隷1985未删减版在线观看_国产成人黄色视频在线播放_少女免费播放片高清在线观看_国产精品v欧美精品v

關(guān)閉
公眾號(hào)二維碼

# 系統(tǒng)要求

變更日志
版本 日期 變更
v0.1 20180703 創(chuàng)建文檔
v0.2 20180703 增加了證書交付,明確安裝APP后無需打開APP
v0.3 20180704 不在白名單的APP處理方式,增加廠商型號(hào)代碼
v0.4 20180704 廠商序列號(hào)、隨機(jī)數(shù)增加關(guān)于重復(fù)性的要求
v0.5 20180704 重復(fù)性要求描述改進(jìn)
v0.6 20180709 增加Linux系統(tǒng),增加廠商和機(jī)型
v0.7 20180717 1. 默認(rèn)靜默打開,額外增加不靜默打開配置
2. 額外增加靜默安裝異常的日志記錄
3. 增加序列號(hào)原則,獲取方式
v0.8 20180726 增加廠商和機(jī)具
v0.9 20180726 增加廠商和機(jī)具
v1.0 20180816 增加本文檔適用于微信支付訂制機(jī)具的描述
v1.1 20180816 增加廠商和機(jī)具
v1.2 20180817 增加廠商和機(jī)具
v1.3 20180821 增加內(nèi)置APP需求
v1.4 20180822 增加系統(tǒng)要求
v1.5 20211022 1.0版本發(fā)布
v1.6 20211112 Windows打開安全保護(hù)指引
v1.7 20220401 排版更新

# 1. 基礎(chǔ)要求

Android Windows
系統(tǒng)版本 Android 7.1以上,平板版本 Windows 7 SP1、Windows 10 (版本20H2) 以上,支持32位和64位系統(tǒng)
系統(tǒng)權(quán)限 - WxpayFaceService運(yùn)行需管理員權(quán)限
APP要求 預(yù)裝刷臉SDK、IoT Service (重置系統(tǒng)需保留)

# 2. 序列號(hào)要求 (All)

設(shè)備序列號(hào),用于唯一標(biāo)識(shí)一臺(tái)設(shè)備。生成設(shè)備序列號(hào)時(shí), 需要確保全局唯一性。

需要滿足以下四個(gè)要求:
① 序列號(hào)在應(yīng)用里面可以獲取
② 序列號(hào)重裝系統(tǒng)后不會(huì)變更
③ 序列號(hào)更換主板后可以寫入
④ 序列號(hào)永遠(yuǎn)和機(jī)器后面銘牌上面貼的編號(hào)一致

注: 設(shè)備商必須保證設(shè)備SN符合微信制定要求, 否則由于SN規(guī)則不符導(dǎo)致的設(shè)備使用, 數(shù)據(jù)統(tǒng)計(jì)等問題, 設(shè)備商自行負(fù)責(zé)解決。

# 2.1. Android 構(gòu)成規(guī)則:

設(shè)備商代碼(2位) + 系統(tǒng)類型(1位) + 型號(hào)代碼(2位) + 廠商序列號(hào)(10位) + 隨機(jī)數(shù)(8位)

字段名 長(zhǎng)度 內(nèi)容/格式 字符取值范圍
設(shè)備商代碼 2 由微信支付為廠商分配 0-9, A-Z
系統(tǒng)類型 1 A:表示Android,W:表示W(wǎng)indows,L:表示Linux 0-9, A-Z
型號(hào)代碼 2 由廠商提供設(shè)備型號(hào)給微信支付, 微信支付分配型號(hào)代碼給廠商 0-9, A-Z
廠商序列號(hào) 10 格式內(nèi)容由廠商按自家現(xiàn)有規(guī)則來確定。 0-9, A-Z
隨機(jī)數(shù) 8 隨機(jī)數(shù)每一位在0-9, A-Z中取值。需要保證隨機(jī)性,對(duì)隨機(jī)數(shù)的唯一性可以不作強(qiáng)校驗(yàn)。
(注意隨機(jī)數(shù)生成時(shí),先初始化)
0-9, A-Z

微信讀取序列號(hào)方式:
Android 8 開始聲明, Build.SERIAL獲取SN方式將被廢棄,將使用Build.getSerial()。 Android 9 已經(jīng)正式廢棄原方式

# 2.2. Windows 構(gòu)成規(guī)則:

字段名 長(zhǎng)度 內(nèi)容/格式 字符取值范圍
設(shè)備商代碼 2 由微信支付為廠商分配 0-9, A-Z
系統(tǒng)類型 1 A: 表示Android, W: 表示W(wǎng)indows, L表示Linux 0-9, A-Z
型號(hào)代碼 2 由廠商提供設(shè)備型號(hào)給微信支付, 微信支付分配型號(hào)代碼給廠商 0-9, A-Z
廠商序列號(hào) 12 使用網(wǎng)卡MAC地址 0-9, A-Z
隨機(jī)數(shù) 6 隨機(jī)數(shù)每一位在0-9, A-Z中取值。需要保證隨機(jī)性,對(duì)隨機(jī)數(shù)的唯一性可以不作強(qiáng)校驗(yàn)。
(注意隨機(jī)數(shù)生成時(shí),先初始化)
0-9, A-Z

微信讀取序列號(hào)方式:

  • 1.27版本以上推薦方式:
    SN寫入BIOS設(shè)置,參考MSDN上WMI與CIM文檔,對(duì)應(yīng)wmic命令 wmic bios get SerialNumber。
    提示:如果主板使用DMIEDIT,SN對(duì)應(yīng)項(xiàng)是[Type 001] -- System Information項(xiàng)的Serial Number字段。
  • 舊方式:
    從c:\serial.txt中讀取。 在安裝人臉SDK之前,需要先生成這個(gè)文件。
    注意:在使用1.27版本以上SDK,同時(shí)使用BIOS及txt文本設(shè)置設(shè)備SN,優(yōu)先讀取BIOS。

# 3. 軟件預(yù)檢測(cè)項(xiàng)適配指引

本頁(yè)主要針對(duì)微信刷臉支付-軟件預(yù)檢測(cè)中的檢測(cè)項(xiàng)提供適配說明,軟件預(yù)檢測(cè)項(xiàng)會(huì)在人臉設(shè)備出廠檢查環(huán)節(jié)進(jìn)行驗(yàn)收和攔截。

# 3.1 Android 相關(guān)

# 3.1.1 系統(tǒng)語(yǔ)言、日期和時(shí)間

要求:系統(tǒng)語(yǔ)言默認(rèn)為中文,【設(shè)置】-【時(shí)間】開啟“自動(dòng)確定日期和時(shí)間”和“自動(dòng)確定時(shí)區(qū)”。
效果:

實(shí)現(xiàn)參考:修改build/make/target/product/full_base.mk,將PRODUCT_LOCALES的值修改為zh_CN

PRODUCT_LOCALES := zh_CN

修改frameworks\base\packages\SettingsProvider\res\values\defaults.xml

<bool name="def_auto_time">true</bool>
<bool name="def_auto_time_zone">true</bool>

# 3.1.2 預(yù)置人臉App和IoTService App

要求:微信支付相關(guān)App(如人臉App、IoTService App等,請(qǐng)參考附錄:微信支付相關(guān)App)需要提前預(yù)置到/system/priv-app目錄。

人臉App預(yù)置方案如下:
1、獲取最新版本人臉App,將其重命名為wxpayface.apk;
2、新建wxpayface目錄,把wxpayface.apk放進(jìn)該目錄(注意目錄名和apk名稱需保持一致);
3、用zip工具打開wxpayface.apk,把里邊的lib拉出來放在wxpayface目錄下,把lib目錄下的armeabi-v7a目錄改為arm;
4、將wxpayface目錄所有內(nèi)容預(yù)置到/system/priv-app/目錄下;
5、最終目錄內(nèi)容如下:
/system/priv-app/wxpayface目錄下有一個(gè)wxpayface.apk
/system/priv-app/wxpayface/lib/arm目錄下有wxpayface自帶的so庫(kù)

IoTService App預(yù)置方案如下:
1、獲取最新版本IoTService App,將其重命名為iotservice.apk(也可以修改為其他名稱,但需要注意apk所在目錄名和apk文件名需保持一致);
2、新建iotservice目錄,把iotservice.apk放進(jìn)該目錄(注意目錄名和apk名稱需保持一致);
3、用zip工具打開iotservice.apk,把里邊的lib拉出來放在iotservice目錄下,把lib目錄下的armeabi-v7a目錄改為arm;
4、將iotservice目錄所有內(nèi)容預(yù)置到/system/priv-app/目錄下;
5、最終目錄內(nèi)容如下:
/system/priv-app/iotservice目錄下有一個(gè)iotservice.apk
/system/priv-app/iotservice/lib/arm目錄下有iotservice自帶的so庫(kù)

實(shí)現(xiàn)參考:
以下是支付側(cè)提供的一份在源碼目錄通過編譯腳本預(yù)置人臉App的樣例代碼(IoTService類似),可供參考:
1、 把人臉App修改為wxpayface.apk;
2、 在Rom源碼的適當(dāng)位置創(chuàng)建一個(gè)目錄,該目錄包含三個(gè)文件,分別是apk文件wxpayface.apk,解壓腳本update_so.sh,編譯文件Android.mk;
3、 編譯Rom源碼,查看輸出目錄是否能產(chǎn)生/system/priv-app/wxpayface目錄,apk及相應(yīng)so是否都正確解壓。
update_so.sh內(nèi)容如下:

#!/bin/bash

rm -rf $1/lib
mkdir -p $1/lib
rm -rf $1/apkUnzip
mkdir -p $1/apkUnzip

unzip -o $1/$2.apk -d $1/apkUnzip

copy_abi_folder() {
  for fileName in $(ls $1/apkUnzip/lib); do
    if [[ -d $1/apkUnzip/lib/$fileName ]]; then
      if [ $fileName == 'arm64-v8a' ]; then
        cp -rf $1/apkUnzip/lib/$fileName $1/lib/arm64
        rm -rf $1/apkUnzip
        return 0
      fi
    fi
  done
  for fileName in $(ls $1/apkUnzip/lib); do
    if [[ -d $1/apkUnzip/lib/$fileName ]]; then
      if [ $fileName == 'armeabi-v7a' ]; then
        cp -rf $1/apkUnzip/lib/$fileName $1/lib/arm
        rm -rf $1/apkUnzip
        return 0
      fi
    fi
  done
  for fileName in $(ls $1/apkUnzip/lib); do
    if [[ -d $1/apkUnzip/lib/$fileName ]]; then
      if [ $fileName == 'arm' ]; then
        cp -rf $1/apkUnzip/lib/$fileName $1/lib
        rm -rf $1/apkUnzip
        return 0
      fi
    fi
  done
  cp -rf $1/apkUnzip/lib $1
  rm -rf $1/apkUnzip
  return 0
}

copy_abi_folder $1

Android.mk內(nèi)容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

###人臉App: wxpayface, IoTService App: iotservice 
LOCAL_MODULE := wxpayface
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MULTILIB := 32
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_DEX_PREOPT := false

###解壓縮獲取so
$(shell `$(LOCAL_PATH)/update_so.sh $(LOCAL_PATH) $(LOCAL_MODULE)`)

###清空臨時(shí)變量JNI_LIBS
JNI_LIBS :=

###當(dāng)前目錄遞歸搜索
$(foreach FILE,$(shell find $(LOCAL_PATH)/lib/ -name *.so), $(eval JNI_LIBS += $(FILE)))

###獲取搜索文件目錄集(相對(duì)目錄)
LOCAL_PREBUILT_JNI_LIBS := $(subst $(LOCAL_PATH),,$(JNI_LIBS))

include $(BUILD_PREBUILT)

# 3.1.3 默認(rèn)授予人臉App和IoTService App應(yīng)用權(quán)限

要求:微信支付相關(guān)App(如人臉App、IoTService App等,請(qǐng)參考文末附錄:微信支付相關(guān)App)需要提前授予應(yīng)用權(quán)限。

實(shí)現(xiàn)參考:
以下是支付側(cè)提供的通過修改framework代碼實(shí)現(xiàn)靜默授權(quán),可供參考:

Android 9以下版本:
修改framework/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java,增加動(dòng)態(tài)權(quán)限授予:

private void grantDefaultSystemHandlerPermissions(int userId) {

//這里給我們應(yīng)用權(quán)限和添加白名單
//如果是人臉,包名修改為:com.tencent.wxpayface
//如果是IoTService,包名修改為:com.tencent.wxpayface.iotservice
//其他包名參考附錄
PackageParser.Package wxpayfacePackage = getSystemPackageLPr("com.tencent.wxpayface");
if (wxpayfacePackage != null && doesPackageSupportRuntimePerissions(wxpayfacePackage)) {
    if (DEBUG) {
        Log.d(TAG, "grantRuntimePermissionsLPw com.tencent.wxpayface");
    }
    grantRuntimePermissionsLPw(wxpayfacePackage, PHONE_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(wxpayfacePackage, STORAGE_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(wxpayfacePackage, LOCATION_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(wxpayfacePackage, CAMERA_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(wxpayfacePackage, SENSORS_PERMISSIONS, userId);
}
PackageParser.Package iotPackage = getSystemPackageLPr("com.tencent.wxpayface.iotservice");
if (iotPackage != null && doesPackageSupportRuntimePerissions(iotPackage)) {
    if (DEBUG) {
        Log.d(TAG, "grantRuntimePermissionsLPw com.tencent.wxpayface.iotservice");
    }
    grantRuntimePermissionsLPw(iotPackage, PHONE_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(iotPackage, STORAGE_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(iotPackage, LOCATION_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(iotPackage, CAMERA_PERMISSIONS, userId);
    grantRuntimePermissionsLPw(iotPackage, SENSORS_PERMISSIONS, userId);
    }
}

Android 10以上版本:
修改framework/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java,增加動(dòng)態(tài)權(quán)限授予:

public void grantDefaultPermissions(int userId) {
  
      //這里給我們應(yīng)用權(quán)限和添加白名單
      //如果是人臉,包名修改為:com.tencent.wxpayface
      //如果是IoTService,包名修改為:com.tencent.wxpayface.iotservice
      
      try {
        //com.tencent.wxpayface
        PackageInfo pkg = mContext.getPackageManager().getPackageInfo("com.tencent.wxpayface", DEFAULT_PACKAGE_INFO_QUERY_FLAGS);
        grantRuntimePermissionsForSystemPackage(userId, pkg);
      } catch (Throwable e) {
        Log.e(TAG, "grantRuntimePermissionsForSystemPackage com.tencent.wxpayface err:", e);
      }

      try {
        //com.tencent.wxpayface.iotservice
        PackageInfo pkg = mContext.getPackageManager().getPackageInfo("com.tencent.wxpayface.iotservice", DEFAULT_PACKAGE_INFO_QUERY_FLAGS);
        grantRuntimePermissionsForSystemPackage(userId, pkg);
      } catch (Throwable e) {
        Log.e(TAG, "grantRuntimePermissionsForSystemPackage com.tencent.wxpayface.iotservice err:", e);
      }
      
      // 這里結(jié)束
      grantPermissionsToSysComponentsAndPrivApps(userId);
      grantDefaultSystemHandlerPermissions(userId);
      grantDefaultPermissionExceptions(userId);
      synchronized (mLock) {
        mDefaultPermissionsGrantedUsers.put(userId, userId);
      }
  }

# 3.1.4 實(shí)現(xiàn)人臉App和IoTService App靜默升級(jí)

要求:微信支付相關(guān)App(如人臉App、IoTService App等,請(qǐng)參考文末附錄:微信支付相關(guān)App)進(jìn)行升級(jí)時(shí),不顯示升級(jí)界面,直接進(jìn)行升級(jí)。

實(shí)現(xiàn)參考:
以下是人臉App升級(jí)調(diào)用邏輯(其他App升級(jí)調(diào)用邏輯類似),可創(chuàng)建一個(gè)Demo App,通過以下代碼調(diào)用人臉軟件升級(jí),查看是否可以靜默升級(jí):

public class APKUtils {
    private final static String TAG = "APKUtils";
    public static final int FLAG_PRIVILEGED = 1<<30;

    public static int getVersionCode(Context context, String str) {
        try {
            return context.getPackageManager().getPackageInfo(str, 0).versionCode;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return 0;
    }

    public static String getVersionName(Context context, String str) {
        try {
            return context.getPackageManager().getPackageInfo(str, 0).versionName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    public static void installApk(Context context, String apkFileString) {
        File apkFile = new File(apkFileString);
        if (!apkFile.exists()) {
            Log.d(TAG, "apk file is not exist: " + apkFileString);
            Toast.makeText(context, "文件不存在", Toast.LENGTH_SHORT).show();
            return;
        }

        Log.d(TAG, "use normal install");
        Intent intent = new Intent(Intent.ACTION_VIEW);
        //AndroidN以上版本需通過FileProvider進(jìn)行升級(jí)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            Log.d(TAG, "use provider url");
		   intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
            List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
            for (ResolveInfo resolveInfo : resInfoList) {
                String packageName = resolveInfo.activityInfo.packageName;
                context.grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
        } else {
            Log.d(TAG, "use path url");
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        context.startActivity(intent);
        Log.d(TAG, "use normal install end");
    }
}

靜默升級(jí)異常處理:
對(duì)于安裝失敗的情況,需要把安裝異常記錄在指定位置的文件里。
異常日志目錄

Environment.getExternalStorageDirectory().getAbsolutePath() + "/wxpayface/install_log/"

異常日志文件名

包名.log

例如

com.tencent.wxpayface.log

異常日志記錄格式

  1. 只需要一行,每次覆蓋
  2. 數(shù)據(jù)格式:
時(shí)間戳,包名,當(dāng)前版本,新安裝版本,錯(cuò)誤碼

例如

1531821994,com.tencent.wxpayface,1.0.9,1.1.0,-18

# 3.1.5 關(guān)閉USB授權(quán)彈框

要求:人臉App會(huì)開啟3D攝像頭,在開啟時(shí)不會(huì)彈出USB授權(quán)框。
修改/frameworks/base/core/res/res/values/config.xml文件,將config_disableUsbPermissionDialogs修改為true,如下所示:

<!-- If true, then we do not ask user for permission for apps to connect to USB devices.
         Do not set this to true for production devices. Doing so will cause you to fail CTS. -->
    <bool name="config_disableUsbPermissionDialogs">true</bool>

# 3.1.6 開啟系統(tǒng)定位

要求:【設(shè)置】-【位置信息】默認(rèn)開啟,模式為高精度,同時(shí)開啟WLAN掃描、藍(lán)牙掃描。
備注:需同時(shí)默認(rèn)授予人臉App、IoTService App定位權(quán)限,詳情見"默認(rèn)授予人臉App和IoTService App應(yīng)用權(quán)限"。
效果:

實(shí)現(xiàn)參考:修改frameworks\base\packages\SettingsProvider\res\values\defaults.xml

<string name="def_location_providers_allowed" translatable="false">gps,network</string>
<integer name="def_wifi_scan_always_available">1</integer>

# 3.1.7 導(dǎo)航欄

要求:【設(shè)置】-【顯示】增設(shè)“導(dǎo)航欄”開關(guān)。
功能說明:
1、“導(dǎo)航欄”開關(guān)控制系統(tǒng)是否有導(dǎo)航欄,默認(rèn)值:關(guān)閉。
2、開啟時(shí): 表示系統(tǒng)有導(dǎo)航欄,但默認(rèn)隱藏,底部上滑可以呼出,10秒后自動(dòng)隱藏。
3、關(guān)閉時(shí): 表示系統(tǒng)沒有導(dǎo)航欄,底部上滑不能呼出。
4、備注:如不實(shí)現(xiàn)此設(shè)置,需保證導(dǎo)航欄默認(rèn)隱藏,且上滑不能呼出。

# 3.1.8 微信支付相關(guān)App

App 包名 功能說明 使用場(chǎng)景 是否需要預(yù)置 是否需要靜默授權(quán) 是否需要靜默升級(jí)
人臉App/SDK com.tencent.wxpayface 刷臉支付 青蛙設(shè)備、SDK設(shè)備
IoTService com.tencent.wxpayface.iotservice IoT設(shè)備管理 青蛙設(shè)備、SDK設(shè)備
備注:不同場(chǎng)景需要預(yù)置的App不完全相同,具體請(qǐng)咨詢微信支付技術(shù)支持

# 3.1.9 常見出廠檢查攔截提示與適配指引

檢查失敗提示語(yǔ) 適配指引
人臉APP/人臉SDK沒有預(yù)置進(jìn)系統(tǒng) 見適配指引-預(yù)置人臉App和IoTService App
IoTService沒有預(yù)置進(jìn)系統(tǒng) 見適配指引-預(yù)置人臉App和IoTService App
備注:實(shí)際提示語(yǔ)可能有所差異,如遇提示語(yǔ)不一致請(qǐng)咨詢微信支付技術(shù)支持

# 3.2 Windows 相關(guān)

# 3.2.1 系統(tǒng)開啟UAC

(1)方式一

  • 設(shè)備系統(tǒng)需在系統(tǒng)設(shè)置里開啟UAC
  • 設(shè)置路徑:控制面板->用戶賬戶->用戶賬戶->更改用戶賬戶控制設(shè)置
  • 將UAC等級(jí)調(diào)為默認(rèn)或者始終通知
    詳細(xì)設(shè)置步驟如下圖所示:

(2)方式二
使用注冊(cè)表導(dǎo)入
首先,請(qǐng)點(diǎn)擊進(jìn)入注冊(cè)表;
其次,雙擊文件->確認(rèn)導(dǎo)入,重啟系統(tǒng)即可。

上次更新: 11/14/2022, 3:01:17 PM