Android5.0以下のMultiDexで起動するシルクのように滑らか
5843 ワード
MultiDexの公式ソリューションの使用 上記第1条のように、 を加える. .
を占有することはない.しかし 性能の弱い携帯電話では、 が発生する確率があります.
ぶんせきは、 をロードすることはできない.メインスレッドで実行するとARNが現れる以上、新しいプロセスで初期化しましょう.
解決する MyApplication.class MultiDexService.class AndroidManifest.xml
小さな結び目これでローエンド機のARNは回避され、少なくとも死なない...
新しいピット&分析しかし、ソフトウェアが開いた後も長い間白い画面/黒い画面があり、少しも滑らかではありません. この穴は簡単で、 を設置すればよい.
絹のような滑らかなソリューション style drawable/splash_placeholder AndroidManifest.xml,修正theme次の例 小結
これで糸のようになめらかになる
リファレンス
Androidの性能の最適化の方面はすべてここにあります@鴻洋Android MultiDexは初めてアプリを起動して最適化します実はあなたはMultiDexがいったいどれだけ穴があることを知りません
minSdkVersion >=21
:multiDexEnabled true
を追加するだけでOK、その他はでたらめをしなくてもいいandroid {
defaultConfig {
...
minSdkVersion 21
targetSdkVersion 26
multiDexEnabled true // ,
}
...
}
minSdkVersion <21
:それはちょっと面倒です.multiDexEnabled true
compile 'com.android.support:multidex:1.0.1'
MultiDexApplication
を使用するか、カスタムapplication
にMultidex.install(this);
を次のように追加するpublic class MyApplication extends SomeOtherApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(context);
Multidex.install(this);
}
}
minSdkVersion<21
の場合に遭遇したピットAndroid5.0
以上の設備はまだしも、Multidex.install(this);
はそれほど時間を取らず、基本的には秒で実行されている.Android5.0
以上の設備はapk
を設置する際にMultidex
を最適化しているので、初めて開いたときに実行すると、Multidex.install(this);
はAndroid5.0
以下の設備の下で、Multidex.install(this);
は数秒の時間(私のプログラムでは4秒ほどかかりました)を費やして、ソフトウェアが初めて開いて少なくとも白いスクリーンが4秒でトップページに入ることを意味します(まず靴を置いて、もちろん解決策があって、後ろにあります)Multidex.install(this);
が実行する時間が長く、ANR
(結局、メインスレッドでこんなに長い時間実行されている)のぶんせき
Android5.0
以下の装置においてMultidex.install(this)
が実行するに違いない.そうでなければ、主Dex
以外のDex
ファイル解決する
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(base)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP && TextUtils.equals(applicationContext?.packageName, processName)) {
val multiDexPreference = getSharedPreferences("MultiDexPreference", Context.MODE_PRIVATE)
if (multiDexPreference.getString(BuildConfig.VERSION_NAME, "") != the2thDexSHA1) {// multiDex
val lock = java.lang.Object()
thread {
Looper.prepare()
val handler = object : Handler(Looper.myLooper()) {
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
synchronized(lock) {
lock.notify()
multiDexPreference.edit().putString(BuildConfig.VERSION_NAME, the2thDexSHA1).apply()
if (null != Looper.myLooper()) Looper.myLooper().quit()
}
}
}
startService( // multiDex
Intent(applicationContext, MultiDexService::class.java)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
.putExtra("MESSENGER", Messenger(handler))
)
Looper.loop()
}
synchronized(lock) {
try {
lock.wait(30000)
} catch (e: InterruptedException) {
e.printStackTrace()
}
}
}
}
if (!processName.endsWith("multiDex")) {
// Android5.0 , MultiDex ,
MultiDex.install(this)
}
}
private val the2thDexSHA1: String? by lazy {
val ai = applicationInfo
val source = ai?.sourceDir
try {
val jar = JarFile(source)
val mf = jar.manifest
val map = mf.entries
val a = map["classes2.dex"]
a?.getValue("SHA1-Digest").toString()
} catch (e: Exception) {
e.printStackTrace()
}
null
}
class MultiDexService : IntentService("MultiDexService") {
override fun onHandleIntent(intent: Intent?) {
val messenger: Messenger? = intent?.getParcelableExtra("MESSENGER")
MultiDex.install(application)
messenger?.send(Message())
android.os.Process.killProcess(android.os.Process.myPid())
}
}
小さな結び目
新しいピット&分析
Launch
のActivity
のtheme
を設置すればよい、windowBackground
のデフォルト壁紙絹のような滑らかなソリューション
-
-
これで糸のようになめらかになる
リファレンス
Androidの性能の最適化の方面はすべてここにあります@鴻洋Android MultiDexは初めてアプリを起動して最適化します実はあなたはMultiDexがいったいどれだけ穴があることを知りません