読者です 読者をやめる 読者になる 読者になる

woshidan's blog

そんなことよりコードにダイブ。

build.gradleでminifyEnabledをtrueにしてもActivityはminifyされない

minify検証 Android gradle

まとめ

  • Activityはgradleの設定でminifyをかけてもminifyされない
  • minifyされているかの確認をしたかったらJavaだけのクラスを仕込んで見るのがお手軽

検証1

gradleminifyの設定をした時、うまくいっていたらActivityのクラス名がaなどになっているだろうと下記のようなコード(検証用コード1)を書いてリリースビルドしたapkをインストールしたところ、ログには

01-19 22:43:13.181 9091-9091/? D/MainActivity: com.example.woshidan.minifytest.MainActivity

とminifyされていないクラス名が表示されていました。

検証用コード1

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.woshidan.minifytest"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
// proguard-rules.pro
// minifyされてるの見るテストなのでコメントのみ
package com.example.woshidan.minifytest;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("MainActivity", MainActivity.class.getName());
            }
        });
    }

検証2

先輩に相談したら、「Activityminifyできないとか?」という話の流れになって、「Lanucherに指定されているActivityでは?」「とりあえずAndroidフレームワークと関係ないJavaのクラスを入れてみては」という話になったので、次は下記のようなコード(検証用コード2)を書いてみたら、ログでminifyが確認できたのはJavaのクラスだけだったのでActivityminifyできないようでした。

01-19 22:57:26.532 19165-19165/? D/MainActivity: com.example.woshidan.minifytest.MainActivity
01-19 22:57:26.766 19165-19165/? D/SubActivity: com.example.woshidan.minifytest.SubActivity
01-19 22:57:26.768 19165-19165/? D/MinifyTester: com.example.woshidan.minifytest.a

検証用コード2

build.gradleproguard-rules.proは検証用コード1と同じ。

package com.example.woshidan.minifytest;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Log.d("MainActivity", MainActivity.class.getName());
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, SubActivity.class);
                startActivity(intent);
            }
        });
    }
package com.example.woshidan.minifytest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class SubActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sub);
        Log.d("SubActivity", SubActivity.class.getName());
        MinifyTester.testClassName();
    }
}
package com.example.woshidan.minifytest;

class MinifyTester {
    static void testClassName() {
        Log.d("MinifyTester", MinifyTester.class.getName());
    }
}

おなじくAndroidのシステムから呼ばれるコンポーネントServiceBroadcastReceiverも似たようなことがありそうな気がしますが、調べる機会があったら追記します。