【问题标题】:Android library Correct usage of V4 Support Library ConfusionAndroid库正确使用V4支持库混淆
【发布时间】:2018-01-28 01:23:51
【问题描述】:

我正在尝试减少我的项目的 apk 大小,为此我正在尝试删除整个 support-v4 库依赖项,而只添加我的项目所需的模块。根据下面,似乎可以只包含我需要的模块,而不是导入整个 support-v4 库(1)。我当前的项目在 gradle 中使用 support-v4(整个库)。每当我使用时,在导入标头上的 ActivityCompat 等活动类中,我会看到:“import android.support.v4.app.ActivityCompat;”。我的困惑是我已经从 gradle 中删除了 support-v4 库,并且只包括了 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 支持库。该库分为多个模块 提高效率。为了向后兼容,如果您列出 在 Gradle 脚本中添加 support-v4,您的 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);
    }
}

【问题讨论】:

  • Lint 可以帮助你。

标签: android android-studio gradle android-support-library support-v4


【解决方案1】:

根据ActivityCompat documentation(特别是右上角):

属于Maven神器com.android.support:support-compat:27.0.0

因此,正如预期的那样,您正在使用的类位于 support-compat 依赖项中。依赖项的命名仅与类所在包的命名松散相关(显然,更改类的包会破坏所有升级的人,这可能并不理想)。

【讨论】:

  • 你没有告诉我任何我不知道的事情。返回并重新阅读问题。
  • 您包括support-compat。 android.support.v4.app.ActivityCompat 是 support-compat 的一部分。你问这是否符合预期。
  • 好的,这更清楚了。但是,即使我删除了模块(support-compat),我仍然能够找到该类,也就是说,当我尝试使用该类(ActivityCompat)时,即使从 gradle 中删除了该依赖项,我仍然可以使用它。我注意到 support-v4 和各个模块的 jar 都在项目的 library 文件夹中。
  • 您可能应该view your whole dependency tree 看看您特别声明的库引入了哪些传递依赖项。
  • 因此,即使 support-design 包括 support-v7 并且 support-v7 包括 support-v4,也有可能 support-v7 依赖于 support-v4 或者 support-design 依赖于 support-v7 或支持-v4?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
  • 2015-04-05
  • 1970-01-01
相关资源
最近更新 更多