GMS認証のverifier--LOCATIONソースコード鑑賞


LOCATIONテストの簡単な紹介


verifierテストのLOCATIONは、主に位置モードが有効かどうかをテストし、それぞれ位置モードが省電力モードで、設備モード、高精度モード、位置オフモードだけをテストします.

重要なテスト内容


実はverifierこのテスト項目は、主にLOCATION機能が正常かどうかをテストします.つまり、現在の位置モードが設定後の位置モードと一致しているかどうかをチェックします.コアコードを検証するのは簡単です.
Batteru Saving Mode Testを例にとると、dbデータベースのデータを比較するだけです.
testIsExpectedMode(1, Secure.LOCATION_MODE_BATTERY_SAVING);
protected void testIsExpectedMode(int i, int expectedMode) {
        int mode = getLocationMode();
        boolean passed = mode == expectedMode;
        ……………
}
private int getLocationMode() {
        ContentResolver cr = getContentResolver();
        return Secure.getInt(cr, Secure.LOCATION_MODE, Secure.LOCATION_MODE_OFF);
}

同様に、他の3つのテスト:
Device Only Mode Test:
testIsExpectedMode(1, Secure.LOCATION_MODE_SENSORS_ONLY);

Hight Accuracy Mode Test:
testIsExpectedMode(1, Secure.LOCATION_MODE_HIGH_ACCURACY);

Location Mode Off Test:
testIsExpectedMode(0, Secure.LOCATION_MODE_OFF);

ソース構造の評価


locationディレクトリコード:
私はこのコードを見終わって、google会社がこのコードを書いた兄にとても敬服して、これこそ合格したソフトウェアエンジニアが書いた作品だと思っています.
まずUMLクラス図をください.
どうですか.私が簡単に書いたのではなく、ソースコードがこんなに簡潔です.このumlクラス図を簡単に紹介しましょう.
LocationModeTestActivity:これは親クラスで、3つの抽象メソッドを定義しています:createTestItems():--テスト項目setInfoResourcesの作成():--テスト項目の名前testAdvance(int state):--テストロジック
重要ないくつかの属性:LayoutInflater mInflater--処理UIインタフェースViewGroup mItemList--処理UIインタフェース、主にテスト項目Runnable mRunner--処理ロジックのスレッドViewmHandler--処理ロジックスレッドの発動者
LocationModeTestActivityクラスでは、上記の3つの抽象的なメソッドの実行方法を定義しました.次に、次の具体的なテスト実装クラス、すなわち、LocationModeBatterySavingTestActivity(テスト省電力モード)LocationModeHighAccuracyTestActivity(テスト高精度モード)LocationModeDeviceOnlyTestActivity(デバイスモードのみ)LocationModeOffTestActivity(位置オフモード)
上で定義した3つの抽象的な方法を実現し,実現が非常に簡潔であることをokした.
非常に不思議に思っているのではないでしょうか.非常に拡張していると思っているのではないでしょうか.構造が非常に目が大きいと思っているのではないでしょうか.デザインモデルがあるのを覚えていますか.
ははは、はい、これはよくあるテンプレートモデルです(テンプレートモデルを知らない場合は、初心者が早く勉強し、何年も働いているベテランであれば、初心者であることを証明するしかありません.そして、不合格ですよ).
一般的なプログラマーがこの機能を実現する場合、彼はこの実現が難しくないと思って、各位置モードに対して、それぞれ検出アルゴリズムを書いて、完成したことを実現するかもしれません.後の同僚がこれ以上実現を拡張するなら、申し訳ありませんが、客官自身でゼロから実現してください.
これが一般プログラマーとandroid社のプログラマーの違いです.
1人は具体的な実装プログラミングに対して、1人はインタフェースと抽象に対してプログラミングします!一人は自分の仕事のプログラミングを完成して、一人はプログラムのフレームワークに対してプログラミングして、成熟した設計モードに適して、プログラムの拡張を便利にして、多くの人の協力を便利にします.
これが私がこのモジュールのコードを見たときの考えです!
弟はいつも自分が毎日烏合の衆と出勤していると感じています.本当に、androidのソフトウェアエンジニア、あなたたちと友达になりたいですね.

ソースキーの評価


では、いくつかの重要な方法を見てみましょう.

インタフェースがどのように実現されるか


LocationModeTestActivityクラスのonCreateメソッドでは、インタフェースに関する論理を定義します.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ........
        mRunner = this;
        mInflater = getLayoutInflater();
        View view = mInflater.inflate(R.layout.location_mode_main, null);
        mItemList = (ViewGroup) view.findViewById(R.id.test_items);
        mHandler = mItemList;
        createTestItems();
        ..........
        setContentView(view);
        ............
        setInfoResources();
        ...............
    }

抽象メソッドcreateTestItems()とsetInfoResourcesはonCreateメソッドで,サブクラスのインタフェースのカスタマイズを実現するために用いられていることが明らかになった.
そのサブクラスのインタフェースはどのようにカスタマイズされているのでしょうか.
    @Override
    protected void createTestItems() {
        createUserItem(R.string.location_mode_turn_on);
        createUserItem(R.string.location_mode_select_battery_saving);
        createAutoItem(R.string.location_mode_secure_gps_off);
        createAutoItem(R.string.location_mode_secure_nlp_on);
        createAutoItem(R.string.location_mode_manager_gps_off);
        createAutoItem(R.string.location_mode_manager_nlp_on);
    }

    @Override
    protected void setInfoResources() {
        setInfoResources(R.string.location_mode_battery_saving_test,
                R.string.location_mode_battery_saving_info, -1);
    }

「createTestItemsメソッド」では、主に「createUserItemメソッド」を呼び出します.さらに、「LocationModestActivityクラス」の「createUserItemメソッド」を確認します.
protected View createUserItem(int stringId) {
        View item = mInflater.inflate(R.layout.location_mode_item, mItemList, false);
        TextView instructions = (TextView) item.findViewById(R.id.instructions);
        instructions.setText(stringId);
        mItemList.addView(item);
        return item;
}

見たかどうかは、そのままviewをmItemListに追加して、簡単明瞭にしましょう.
setInfoResourcesも同様の原理です.

テストロジックがどのように実現されるか


LocationModeTestActivityクラスを表示します.
public abstract class LocationModeTestActivity extends PassFailButtons.Activity implements Runnable {

つまり、LocationModeTestActivityクラスはインタフェースRunnableを実現しています.runメソッドを見てみましょう.
public void run() {
    ........
    testAdvance(mState);
    ........
}

ここから,テストロジックを実現する方法testAdvanceがrun()メソッドで呼び出されていることが分かるが,我々はそこでrunメソッドを呼び出すのか.定義:
private Runnable mRunner;
private View mHandler;

次にnext()メソッドとdelay()メソッドでインタフェースrun()メソッドを呼び出します.
    protected void next() {
        mHandler.post(mRunner);
    }
    protected void delay() {
        mHandler.postDelayed(mRunner, 2000);
    }

ではnext()とdelay()メソッドはいつ呼び出されますか?
    protected void testIsOn(int i) {
        ......
        next();
    }
    protected void testIsExpectedMode(int i, int expectedMode) {
        ...
        next();
        ....
        delay();
    }
    protected void testSecureProviderIsEnabled(int i, String provider) {
        ....
        next();
    }
    protected void testSecureProviderIsDisabled(int i, String provider) {
        ....
        next();
    }
    protected void testManagerProviderIsEnabled(int i, String gpsProvider) {
        ....
        next();
    }
protected void testManagerProviderIsDisabled(int i, String gpsProvider) {
    .....
    next();
}

わかりましたか.はい、これは各テスト項目の後、next()を直接実行し、対応する方法を呼び出して対応する論理をテストします.
一番意外なのは:
private ViewGroup mItemList;
private View mHandler;
mItemList = (ViewGroup) view.findViewById(R.id.test_items);
mHandler = mItemList;
mHandler.post(mRunner);
mHandler.postDelayed(mRunner, 2000);

まさかViewはhandlerの役割を果たしているのだろうか.postメソッドとpostDelayedメソッドを呼び出すことができますか?
国内では開かないandroidの公式サイトを開き、view類の説明を見ました.
java.lang.Object

   ↳    android.view.View
boolean post(Runnable action)
Causes the Runnable to be added to the message queue.
boolean postDelayed(Runnable action, long delayMillis)
Causes the Runnable to be added to the message queue, to be run after the specified amount of time elapses.

わかったわ私は本当に見識がない.
これで、文章はもう書き終わった.このソースコードはどこにあるかと聞かれるかもしれませんが、興味があれば、ソースコードのcts/apps/ctsVerifierディレクトリに行って見てもいいです.