Android 常用开发技巧笔记

一,用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_lowMemoryKillerMinFreeKbytesAdjustconfig_lowMemoryKillerMinFreeKbytesAbsolute来重新调整minFreeadj


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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值