一,用adb安装apk时,指定arch
To run in 32 bit mode install using,
adb install --abi armeabi-v7a <path to apk>
To run in 64 bit mode install using,
adb install --abi arm64-v8a <path to apk>
二,编译android代码的时候,出现"ext4_allocate_best_fit_partial: failed to allocate"问题
解决方法:调整分区的大小限制(包括system,cache,userdata)
http://blog.youkuaiyun.com/remme123/article/details/16967523
http://blog.youkuaiyun.com/dai583113948/article/details/9352269
三,解决64位进程调用32位库文件报错问题
大家集成的apk如果使用了第三方32位lib库文件的话请按如下方法修改Android.mk文件:库文件的拷贝方式为:
LOCAL_PREBUILT_JNI_LIBS:= \
@assets/libs/libHAOMA.so
LOCAL_MULTILIB := 32
PRODUCT_COPY_FILES += \
$(LOCAL_PATH)/libs/libHAOMA.so:system/lib64/libHAOMA.so
四, android.util.AndroidRuntimeException: android.content.pm.PackageManager$NameNotFoundException: com.android.webview
01-18 11:27:15.929 2707 2707 E AndroidRuntime: Caused by: android.util.AndroidRuntimeException: android.content.pm.PackageManager$NameNotFoundException: com.android.webview
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.webkit.WebViewFactory.getFactoryClass(WebViewFactory.java:206)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:131)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.webkit.WebView.getFactory(WebView.java:2203)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.webkit.WebView.setWebContentsDebuggingEnabled(WebView.java:1824)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at com.amazon.venezia.VeneziaApplication.setupVeneziaApplication(VeneziaApplication.java:600)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at com.amazon.venezia.VeneziaApplication.onCreate(VeneziaApplication.java:200)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1015)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4775)
01-18 11:27:15.929 2707 2707 E AndroidRuntime: ... 9 more
Inframeworks/base/core/java/android/webkit/WebViewFactory.java
163 private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException { 164 Application initialApplication = AppGlobals.getInitialApplication(); 165 try { 166 // First fetch the package info so we can log the webview package version. 167 // ACOS_MOD_BEGIN {amazon_webview} 168 String packageName = getAmazonWebViewPackageName(); 169 String webViewFactory; 170 try { 171 sPackageInfo = initialApplication.getPackageManager().getPackageInfo(packageName, 0); // first to find "com.amazon.webview.chromium"
172 webViewFactory = AMAZON_WEBVIEW_FACTORY; // "com.android.webview.chromium.WebViewExtAmazonFactoryProvider" 173 } catch (PackageManager.NameNotFoundException e) { 174 packageName = getWebViewPackageName(); 175 sPackageInfo = initialApplication.getPackageManager().getPackageInfo(packageName, 0); // next to find "com.android.webview" 176 webViewFactory = CHROMIUM_WEBVIEW_FACTORY; // "com.android.webview.chromium.WebViewChromiumFactoryProvider" 177 } 178 // ACOS_MOD_END {amazon_webview} 179 Log.i(LOGTAG, "Loading " + packageName + " version " + sPackageInfo.versionName + 180 " (code " + sPackageInfo.versionCode + ")"); 181 182 // Construct a package context to load the Java code into the current app. 183 Context webViewContext = initialApplication.createPackageContext(packageName, 184 Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); 185 initialApplication.getAssets().addAssetPath( 186 webViewContext.getApplicationInfo().sourceDir); 187 ClassLoader clazzLoader = webViewContext.getClassLoader(); 188 Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()"); 189 try { 190 return (Class<WebViewFactoryProvider>) Class.forName(webViewFactory, true, 191 clazzLoader); 192 } finally { 193 Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); 194 } 195 } catch (PackageManager.NameNotFoundException e) { 196 // If the package doesn't exist, then try loading the null WebView instead. 197 // If that succeeds, then this is a device without WebView support; if it fails then 198 // swallow the failure, complain that the real WebView is missing and rethrow the 199 // original exception. 200 try { 201 return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY); 202 } catch (ClassNotFoundException e2) { 203 // Ignore. 204 } 205 Log.e(LOGTAG, "Chromium WebView package does not exist", e); 206 throw new AndroidRuntimeException(e); 207 } 208 }
eclipse编译android项目时,如何把依赖的jar包也打进apk中
最近被一个奇怪的问题所折腾,编译出来的apk文件挺小的,一运行就崩溃,最后把apk解压后看到里面没有相应的jar包,因为我的程序是要用到几个第三方的jar包的,这几个jar包已经放到lib目录下,原因就在于编译时没有打进去,那怎么办呢?
在项目的project下的lib目录下右键(首先确保jar文件在这个lib目录下面),选择Build Path -> Use as Source Folder就可以啦。你会发现编出来的apk大了很多。
Android下实现自动关机的方法
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
// 源码中"android.intent.action.ACTION_REQUEST_SHUTDOWN“ 就是 Intent.ACTION_REQUEST_SHUTDOWN方法
intent.putExtra("android.intent.extra.KEY_CONFIRM", false);
// 源码中"android.intent.extra.KEY_CONFIRM"就是 Intent.EXTRA_KEY_CONFIRM方法
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
Androd中进程创建后,attachApplication的流程
通过AMS创建的android应用程序的入口函数是ActivityThread.main。在该函数中,会创建ActivityThread对象,并调用它的attach方法。
ActivityThread thread = new ActivityThread();
thread.attach(false);
在attach方法中,会调用AMS的attachApplication接口。
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
// Ignore
}
AMS中的attachApplication方法如下:
@Override
public final void attachApplication(IApplicationThread thread) {
synchronized (this) {
int callingPid = Binder.getCallingPid();
final long origId = Binder.clearCallingIdentity();
attachApplicationLocked(thread, callingPid);
Binder.restoreCallingIdentity(origId);
}
}
其中又会调用AMS自己的attachApplicationLocked方法。
在attachApplicationLocked方法中,会分别调用activity的attachApplicationLocked方法和service的attachApplicationLocked方法。如下:
if (normalMode) {
try {
if (mStackSupervisor.attachApplicationLocked(app)) { // activity的方法,在ActivityStackSupervisor.java中
didSomething = true;.j
}
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
}
}
// Find any services that should be running in this process...
if (!badApp) {
try {
didSomething |= mServices.attachApplicationLocked(app, processName); // service的方法,在ActiveServices.java中
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown starting services in " + app, e);
badApp = true;
}
}
Application中onTrimMemory方法的回调时机
在AMS中,有许多情况下,都会要更新进程的oom_adj。其中updateOomAdjLocked函数用于更新所有进程的oomAdj。
在这个函数中会尝试kill进程,或者trim进程,当进程需要trim时(调用的时机,参见http://gityuan.com/2016/08/07/android-adj/),如下:
app.thread.scheduleTrimMemory(curLevel);
其中curLevel的定义,参见ComponentCallbacks2类。
这个函数执行后,会向目标进程的message queue发送一个消息,在目标进程的ui thread中执行Application.onTrimMemory方法。
LMK中mOomMinFree和mOomAdj的更新过程。
1. 在lmk中有一组预定义的值
2. 在系统启动过程中,会调用AMS的updateConfiguration方法,其中有如下代码:
if (mWindowManager != null) {
mProcessList.applyDisplaySize(mWindowManager);
}
ProcessList.java中
voidapplyDisplaySize(WindowManagerService wm) {
if (!mHaveDisplaySize) {
Point p = new Point();
wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p);
if (p.x != 0 && p.y != 0) {
updateOomLevels(p.x, p.y, true);
mHaveDisplaySize = true;
}
}
}
applyDisplaySize函数实际只执行 一下,因为其中有一个变量来控制。
在其中,会根据当前屏幕的分辨率,以及config_lowMemoryKillerMinFreeKbytesAdjust和config_lowMemoryKillerMinFreeKbytesAbsolute来重新调整minFree和adj。
Process.setOomAdj(intpid, int amt)用于设置当个进程的oom adj。
Default style of Android ProgressBar.
260 public ProgressBar(Context context) { 261 this(context, null); 262 } 263 264 public ProgressBar(Context context, AttributeSet attrs) { 265 this(context, attrs, com.android.internal.R.attr.progressBarStyle);We can see that " R.attr.progressBarStyle " is default style if user does not give a style when creating Progress Bar.
R.attr.progressBarStyle point to @style/Widget.Material.ProgressBar if we user Material theme.
248 <item name="progressBarStyle">@style/Widget.Material.ProgressBar</item>
739 <style name="Widget.Material.ProgressBar" parent="Widget.ProgressBar"> 740 <item name="indeterminateDrawable">@drawable/progress_medium_material</item> 741 </style>
394 <style name="Widget.ProgressBar"> 395 <item name="indeterminateOnly">true</item> default style is indeterminate 396 <item name="indeterminateDrawable">@drawable/progress_medium_white</item> 397 <item name="indeterminateBehavior">repeat</item> 398 <item name="indeterminateDuration">3500</item> 399 <item name="minWidth">48dip</item> 400 <item name="maxWidth">48dip</item> 401 <item name="minHeight">48dip</item> 402 <item name="maxHeight">48dip</item> 403 <item name="mirrorForRtl">false</item> 404 </style>
In frameworks/base/core/java/android/widget/ProgressBar.java
329 mOnlyIndeterminate = a.getBoolean( 330 R.styleable.ProgressBar_indeterminateOnly, mOnlyIndeterminate); 333 334 setIndeterminate(mOnlyIndeterminate || a.getBoolean( 335 R.styleable.ProgressBar_indeterminate, mIndeterminate));