gpt4 book ai didi

android - 应用程序安装大小在手机上有何不同?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:40 25 4
gpt4 key购买 nike

我最近做了这个application适用于经常修改设备的根用户。

现在我注意到应用程序的安装大小有一个非常奇怪的行为。

当我使用从 XML 文件初始化 View 的常规 Activity 时,大小为 715 kb

 @Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) findViewById(R.id.display);
powermenu = (Button) findViewById(R.id.powermenu);
turnoffscreen = (Button) findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
}

在我切换到一个对话框后,该对话框被创建并设置了一个包含 XML 文件中的小部件的 View 。应用大小现在为 200kb

@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
//setContentView(R.layout.main_layout);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.main_layout, null);
executeEvents = new ExecuteEvents(this);
display = (TextView) view.findViewById(R.id.display);
powermenu = (Button) view.findViewById(R.id.powermenu);
turnoffscreen = (Button) view.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) view.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);

Dialog dialog = new Dialog(this);
dialog.setContentView(view);
dialog.setTitle(getResources().getString(R.string.app_name));
dialog.show();
}

当我使用它时,它减少到 80kb:

@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
dialog = new Dialog(this);
dialog.setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) dialog.findViewById(R.id.display);
powermenu = (Button) dialog.findViewById(R.id.powermenu);
turnoffscreen = (Button) dialog.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) dialog.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
dialog.setTitle(getString(R.string.app_name));
dialog.show();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
dialog.dismiss();
MainActivity.this.finish();
}
});
}

当我尝试使用最后一种代码样式(80kb)添加动画时,我还注意到应用程序大小发生了另一个奇怪的变化。应用程序大小变得很大 1 MB。这就是我初始化动画并尝试在单击按钮时调用它的方式:

private static final ScaleAnimation animation = new ScaleAnimation(1, .95f, 1, .95f, Animation.RELATIVE_TO_SELF, (float)0.5, Animation.RELATIVE_TO_SELF, (float)0.5);//declared as global variable

在 onCreate 方法中:

animation.setDuration(1000);
animation.setFillAfter(false);

然后我在 onClickListener 中调用它:

mapButton.startAnimation(animation);

当我没有添加任何新资源而只是更改代码样式时,为什么应用程序大小会发生如此剧烈的变化?我初始化对话框中存在的小部件的方式哪里有如此巨大的差异?为什么以我添加动画的方式添加动画时会出现巨大差异?

跟进问题:

 @Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) this.findViewById(R.id.display);
powermenu = (Button) this.findViewById(R.id.powermenu);
turnoffscreen = (Button) this.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) this.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
}

推测

这可能是由于导入的包或类造成的吗?至少对于问题的 animation 部分是有意义的。

添加初始化 View 的上下文会减少内存使用吗?

最佳答案

是的,你的推测接近正确,所以你可能知道你所有的 Java 代码首先被 javac 编译成 Java 字节码,然后 dx 将它们转换对于 Dalvik 字节码,您的 Dalvik 字节码文件(又名 dex)打包在您的 apk 中(顺便说一句,apk 大小变化不大,因为 zip 压缩有帮助)通常为 classes.dex稍后当您在设备中安装 apk 时,Android 可能会针对该特定设备对其进行优化(又名 odex)。

因此,为了验证您最终缓存的 dex 是否确实发生了变化并且是造成此大小变化的原因,例如仅添加动画,您可以通过解压缩 apk 或在您的设备中找到它,我总是发现第二个选项更令人兴奋:

这是没有动画的dex(80kb):

http://i.imgur.com/2JkpWS3.png

以及您的应用信息:

http://i.imgur.com/HseGJih.png

这是带动画的 dex(1 MB):

http://i.imgur.com/pyrthYd.png

以及您的应用信息:

http://i.imgur.com/FSVPWAC.png

只要仔细查看您的 dalvik 字节码常量池,您就会发现它们确实不同:

http://i.imgur.com/02mqaif.png

出于某种原因,我没有得到如此根本的大小差异,但它很明显,我使用 gradle + Android Studio 构建了你的应用程序,所以我认为它们有助于优化一些东西。

最后,您可以使用 ProGuard 但是嘿!现在有些 k 并没有那么多,我不担心在你的应用程序中添加一些“脂肪”,只要它让它变得更好,当然总有改进的余地,但请记住你不是在 java4k 或其他东西中像那样:)

关于android - 应用程序安装大小在手机上有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17617243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com