Библиотека Android Правильное использование путаницы с библиотекой поддержки V4

Я пытаюсь уменьшить размер apk для своего проекта, и для этого я пытаюсь удалить всю зависимость от библиотеки support-v4, а добавляю только те модули, которые мне нужны для моего проекта. Согласно приведенному ниже, кажется возможным включить только те модули, которые мне нужны, вместо того, чтобы импортировать всю библиотеку support-v4 (1). Мой текущий проект использует support-v4 (вся библиотека) в gradle. Всякий раз, когда я использую в своих классах действий, таких как ActivityCompat, в заголовке импорта я вижу: «import android.support.v4.app.ActivityCompat;». Меня смущает то, что я удалил библиотеку support-v4 из gradle и включил только модуль, необходимый для класса ActivityCompat, то есть: «com.android.support:support-compat:27.0.0». Почему, когда я пытаюсь использовать класс ActivityCompat, он все еще импортирует тот же «import android.support.v4.app.ActivityCompat;»? Ожидается ли это?

Из справочника по Android: https://developer.android.com/reference/android/support/v4/app/ActivityCompat.html

(1) «Примечание. До версии 24.2.0 библиотеки поддержки существовала единственная библиотека поддержки v4. Эта библиотека была разделена на несколько модулей для повышения эффективности. Для обратной совместимости, если вы укажете support-v4 в своем скрипте Gradle, ваш APK будет включать в себя все модули v4. Однако, чтобы уменьшить размер APK, мы рекомендуем вам просто указать конкретные модули, которые нужны вашему приложению».

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.ActivityCompat;<--regardless of whether I include support-v4 or only the module needed from android(com.android.support:support-compat:27.0.0) same import is still being used.
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
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) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });

        ActivityCompat
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

person Albertano Santacruz    schedule 28.01.2018    source источник
comment
Линт может вам помочь.   -  person Pomagranite    schedule 28.01.2018


Ответы (1)


Согласно документации ActivityCompat (в частности, в верхней Правильно):

принадлежит артефакту Maven com.android.support:support-compat:27.0.0

Таким образом, класс, который вы используете, находится в зависимости support-compat, как и ожидалось. Имена для зависимостей лишь слабо связаны с именами пакетов, в которых находятся классы (очевидно, что изменение пакетов для классов нарушит работу всех, кто обновляется, что, вероятно, не было бы идеальным).

person ianhanniballake    schedule 28.01.2018
comment
Ты не сказал мне ничего, чего бы я уже не знал. Вернитесь и перечитайте вопрос. - person Albertano Santacruz; 28.01.2018
comment
Вы включаете support-compat. android.support.v4.app.ActivityCompat является частью support-compat. Вы спросили, ожидается ли это, и это так. - person ianhanniballake; 28.01.2018
comment
Хорошо, это более понятно. Однако, даже если я удалю модуль (support-compat), я все равно смогу найти класс, то есть, когда я попытаюсь использовать этот класс (ActivityCompat), я все равно смогу его использовать, даже если эта зависимость была удалена из градиента. Я заметил, что jar-файлы как для support-v4, так и для отдельных модулей находятся в папке библиотеки в проектах. - person Albertano Santacruz; 28.01.2018
comment
Вероятно, вам следует просмотреть все дерево зависимостей, чтобы увидеть какие транзитивные зависимости извлекаются библиотеками, которые вы специально объявляете. - person ianhanniballake; 28.01.2018
comment
Таким образом, несмотря на то, что дизайн поддержки включает поддержку v7, а поддержка-v7 включает поддержку-v4, есть шанс, что поддержка-v7 зависит от поддержки-v4 или что поддержка-дизайн зависит от поддержки-v7 или поддержки-v4? - person Albertano Santacruz; 28.01.2018
comment
Похоже, вы имеете в виду эту проблему, где design неправильно зависит от всего support-v4, а не только то, что нужно. К счастью, проблема уже помечена как исправленная для следующего выпуска! - person ianhanniballake; 28.01.2018
comment
Не знал, что это было отмечено как проблема. Так это значит, что до сегодняшнего дня все еще есть шанс циклической зависимости, верно? и мы должны включить поддержку-v4 и поддержку-v7? даже имея поддержку-дизайн. - person Albertano Santacruz; 28.01.2018
comment
Нет циклических зависимостей. Дерево зависимостей точно говорит вам, что включает в себя каждая зависимость. design зависит от appcompat-v7 и support-v4. appcompat-v7 зависит от подмножества support-v4 библиотек. Зависимости AppCompat уже настолько малы, насколько это возможно, поэтому единственное, что вы можете оптимизировать, — это design ошибочное включение support-v4, когда речь идет о вспомогательных библиотеках. Вам действительно нужно посмотреть на свое дерево зависимостей, чтобы увидеть, что еще тянет support-v4. - person ianhanniballake; 28.01.2018
comment
Все, что я пытаюсь сделать, это удалить support-v4 из моего проекта и включить только независимые модули из support-v4, такие как support-compat, support-coreui и т. д. Однако, если support-design автоматически добавляет support-v4, это не кажется возможным. Я удалил support-v4 из gradle и appcompat-v7, и все классы из support-v4 все еще находятся в моем проекте, просто сохранив support-design. - person Albertano Santacruz; 28.01.2018