2

現在、サーバーからjsonを取得するアプリに取り組んでいます。複数のデバイスでアプリをテストしていますが、SIM カードは 1 つしかありません。したがって、デバイスでテストするには、SIM カードをそのデバイスに移動する必要があります。アプリが APN 経由でサーバーに接続できない場合、結果はありません。

私がしたことは、上記のjsonのインスタンスをリソースに保存し、デバッグモードのときにそれを結果として使用することです。このようにして、毎回 SIM カードを切り替えることなく、すべて (接続/要求を除く) をテストできます。

private class RequestTask extends AsyncTask< String, String, String > {
    ...
    @Override
    protected void onPostExecute( String pResult ) {
        ...
        if ( retrieveFromRawResource( pResult ) ) {
            pResult = CustomUtils.parseRawResource( getActivity().getResources(), R.raw.debugjson );
        }
        ...
    }

    private boolean retrieveFromRawResource( String pResult ) {
        return !isValidResult( pResult ) && CustomUtils.isDebugMode( getActivity() );
    }

    private boolean isValidResult( String pResult ) {
        return ( pResult != null && !pResult.isEmpty() );
    }
    ...
}

public class CustomUtils {
    ...
    public static String parseRawResource( Resources pResources, int pResourceId ) {
        StringBuilder builder = new StringBuilder();
        String line;
        try {
            InputStream is = pResources.openRawResource( pResourceId );
            BufferedReader reader = new BufferedReader( new InputStreamReader( is ) );
            while ( ( line = reader.readLine() ) != null )
            {
                builder.append( line );
                builder.append( "\n" );
            }
            return builder.toString();
        } catch ( Exception e ) {
            return null;
        }
    }
    ...
    public static boolean isDebugMode( Context pContext ) {
        return ( ( pContext.getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE ) != 0 );
    }
    ...
}

これは問題なく動作しますが、リリース APK に「未使用」のリソースが存在するという欠点があります。このファイルは非常に大きいため、すべてのリリースから削除することをお勧めします。

毎回手動で削除/追加する必要なく、このようなことは可能ですか? 多分antとProguardの組み合わせを使用していますか?コンパイルする前に生のjsonファイルを一時的に削除して後で置き換えることもできますが、そのリソースへの参照は、呼び出されなくてもコード内に残っています。

4

1 に答える 1

1

さて、これが私が最終的に得たものです。私はすでに ant を使用しているので、custom_rules ant ファイルでこれを解決することにしました。トリックは、リリース ターゲットをオーバーライドし、デバッグ リソースを削除し、実際のリリースを実行してから元に戻すことです。リソースを完全に削除することはできないため (コード内ではまだ参照されています)、ダミー リソースに置き換えました。

プロパティ ファイルを使用して、設定を調整できます。この場合、「res/」ディレクトリ内の「debug_」で始まるすべてのファイルがダミーに置き換えられ、「res-debug」ディレクトリに移動されます。

debug.properties:

resource.files=**/debug_*
resource.dir=res/
tmp.dir=res-debug/

custom_rules.ant:

<project name="custom_rules">

    <target name="remove-debug-resources">
        <property file="debug.properties" prefix="debug" />

        <mkdir dir="${debug.tmp.dir}" />
        <!-- move all debug resources from the resources dir to the temporary debug dir -->
        <move todir="${debug.tmp.dir}" overwrite="false"> <!-- don't overwrite, in case last build failed -->
            <fileset dir="${debug.resource.dir}" casesensitive="yes" includes="${debug.resource.files}" />
        </move>
        <!-- create dummy resources for all the moved debug resources to satisfy the compiler -->
        <touch>
            <fileset dir="${debug.tmp.dir}" casesensitive="yes" includes="${debug.resource.files}" />
            <mapper type="glob" from="*" to="${debug.resource.dir}*" />
        </touch>
    </target>

    <target name="release" depends="remove-debug-resources, android_rules.release, restore-debug-resources" />

    <target name="restore-debug-resources">
        <property file="debug.properties" prefix="debug" />

        <!-- move all debug resources from the temporary debug dir back to the resources dir -->
        <move todir="${debug.resource.dir}" failonerror="false">
            <fileset dir="${debug.tmp.dir}" casesensitive="yes" includes="${debug.resource.files}" />
        </move>
        <delete dir="${debug.tmp.dir}" failonerror="false" />
    </target>

</project>

ここで覚えておくべき最も重要なことは、コンパイルが失敗すると、移動されたリソースは復元されないという事実です。シンプルな 'ant restore-debug-resources' でこれを解決できますが、これを手動で行うことを覚えておく必要があります。ant でクリーン オン フェイル ソリューションを見つけることができませんでした。

これが他の人にも役立つことを願っています!

于 2013-07-03T09:48:55.540 に答える