低版本android_android android 兼容第三方jar低版本 - CSDN
  • 而这些设备中,有很多种Android平台的版本在使用,一些运行着最新版平台,而另一些还在运行着老的版本。作为一名开发人员,你需要考虑你的应用程序是否支持后向兼容——你想你的应用程序能在所有的设备上运行吗,...
    在全世界,现在人们手里有着各种各样的基于Android的设备。而这些设备中,有很多种Android平台的版本在使用,一些运行着最新版平台,而另一些还在运行着老的版本。作为一名开发人员,你需要考虑你的应用程序是否支持后向兼容——你想你的应用程序能在所有的设备上运行吗,或是只是在最新的平台上运行?在某些情况下,在支持的设备上部署新的API,并支持老的设备是很有用的。

    可以设置minSdkVersion:
    1. <manifest>
    2. <uses-sdk android:minSdkVersion="3" />

    3. </manifest>
    复制代码
    然而,如果你想添加一个有用的但不是必须的特性时,例如在硬件键盘可用的时候弹出一个屏幕键盘,你可以这样书写你的代码:允许你的程序使用新的特征,而在老的设备上不会失败

    使用反射

    假设你想使用android.os.Debug.dumpHprofData(String filename)这个新的方法。Debug这个类自从Android 1.0的时候就已经存在了,但这个方法在Android 1.5(API等级3)中才新增的。如果你想直接调用它,那么,在Android 1.1或更早的设备上,你的app将运行失败。

    最简单的方式是通过反射的方式来调用这个方法。这需要做一次查找并在Method对象上进行缓存。调用这个方法实质上是在调用Method.invoke,并对结果进行拆箱。参考以下内容:

    1. public class Reflect {
    2. private static Method mDebug_dumpHprofData;

    3. static {
    4. initCompatibility();
    5. };

    6. private static void initCompatibility() {
    7. try {
    8. mDebug_dumpHprofData = Debug.class.getMethod(
    9. "dumpHprofData", new Class[] { String.class } );
    10. /* success, this is a newer device */
    11. } catch (NoSuchMethodException nsme) {
    12. /* failure, must be older device */
    13. }
    14. }

    15. private static void dumpHprofData(String fileName) throws IOException {
    16. try {
    17. mDebug_dumpHprofData.invoke(null, fileName);
    18. } catch (InvocationTargetException ite) {
    19. /* unpack original exception when possible */
    20. Throwable cause = ite.getCause();
    21. if (cause instanceof IOException) {
    22. throw (IOException) cause;
    23. } else if (cause instanceof RuntimeException) {
    24. throw (RuntimeException) cause;
    25. } else if (cause instanceof Error) {
    26. throw (Error) cause;
    27. } else {
    28. /* unexpected checked exception; wrap and re-throw */
    29. throw new RuntimeException(ite);
    30. }
    31. } catch (IllegalAccessException ie) {
    32. System.err.println("unexpected " + ie);
    33. }
    34. }

    35. public void fiddle() {
    36. if (mDebug_dumpHprofData != null) {
    37. /* feature is supported */
    38. try {
    39. dumpHprofData("/sdcard/dump.hprof");
    40. } catch (IOException ie) {
    41. System.err.println("dump failed!");
    42. }
    43. } else {
    44. /* feature not supported, do something else */
    45. System.out.println("dump not supported");
    46. }
    47. }
    48. }
    复制代码

    使用静态初始化方法来调用initCompatibility,进行方法的查找。如果查找成功的话,使用一个私有的方法(与原始的函数签名一致——参数,返回值、异常检查)来替换方法的调用。返回值(如果有的话)和异常都如同原始的方法一样进行返回。fiddle方法演示了程序的选择逻辑,是调用新的API还是在新API无效的情况下作其它的事情。

    对于每个你想调用的方法,你可能要添加一个额外的私有Method字段,字段初始化方法,和对调用的包装方法。

    如果想调用一个之前未定义的类的方法的话,就比较复杂了。并且,调用Method.invoke()比直接调用这个方法要慢很多。这种情况可以通过一个包装类来缓和一下。

    使用包装类

    想法是创建一个新的类,来包装新的或已经存在的类暴露出来的所有的新API。包装类中的每个方法只是调用相应的真实方法并返回相同的结果。

    如果目标类和方法存在的话,能得到与直接调用相同的行为,并有少量的性能损失。如果目标类或方法不存在的话,包装类的初始化会失败,并且你的应用程序知道必须避免使用这些新的方法。

    假设这个类是新增的:

    1. public class NewClass {
    2. private static int mDiv = 1;

    3. private int mMult;

    4. public static void setGlobalDiv(int div) {
    5. mDiv = div;
    6. }

    7. public NewClass(int mult) {
    8. mMult = mult;
    9. }

    10. public int doStuff(int val) {
    11. return (val * mMult) / mDiv;
    12. }
    13. }
    复制代码


    我们可能这样创建一个包装类:

    1. class WrapNewClass {
    2. private NewClass mInstance;

    3. /* class initialization fails when this throws an exception */
    4. static {
    5. try {
    6. Class.forName("NewClass");
    7. } catch (Exception ex) {
    8. throw new RuntimeException(ex);
    9. }
    10. }

    11. /* calling here forces class initialization */
    12. public static void checkAvailable() {}

    13. public static void setGlobalDiv(int div) {
    14. NewClass.setGlobalDiv(div);
    15. }

    16. public WrapNewClass(int mult) {
    17. mInstance = new NewClass(mult);
    18. }

    19. public int doStuff(int val) {
    20. return mInstance.doStuff(val);
    21. }
    22. }
    复制代码


    包装类拥有和原始类一模一样的方法和构造函数,加上一个静态的初始化方法和测试方法来检查新类是否存在。如果新类不可获得的话,WrapNewClass的初始化会失败,因此,要确保包装类在这种情况下不要被使用。checkAvailable方法是一种强制类进行初始化的简单方法。我们可以像这样来使用:

    1. public class MyApp {
    2. private static boolean mNewClassAvailable;

    3. /* establish whether the "new" class is available to us */
    4. static {
    5. try {
    6. WrapNewClass.checkAvailable();
    7. mNewClassAvailable = true;
    8. } catch (Throwable t) {
    9. mNewClassAvailable = false;
    10. }
    11. }

    12. public void diddle() {
    13. if (mNewClassAvailable) {
    14. WrapNewClass.setGlobalDiv(4);
    15. WrapNewClass wnc = new WrapNewClass(40);
    16. System.out.println("newer API is available - " + wnc.doStuff(10));
    17. } else {
    18. System.out.println("newer API not available");
    19. }
    20. }
    21. }
    复制代码

    如果调用checkAvailable成功,我们知道新的类是系统的一部分。如果它失败了,我们知道新的类不存在,并作相应的调整。应该指出的是,由于字节码校验不支持对一个不存在的类的引用,因此,在调用checkAvailable之前就有可能失败。像实例代码那样构建,结果是一样的,可能字节码校验抛出异常或者Class.forName的调用抛出异常。

    当包装一个有新方法的已存类时,你只需要在包装类中添加新的方法。老的方法直接调用。新的方法需要在WrapNewClass的静态初始化方法中作一次反射检查。

    测试是关键

    你必须测试任何想支持的Android框架版本。一般来说,应用程序在不同的版本上行为不同。记住一条法则:如果你不尝试,它就不能工作。

    你可以在老版本平台的模拟器上运行应用程序来测试程序的后向兼容性。由于可以创建不同API等级的“虚拟设备”,因此,你可以很容易地进行测试。一旦你创建了AVD,你就可以在新老版本系统上进行程序测试,也许你还可以一边测试一边观察它们的不同点。


    展开全文
  • Android P,系统应用集成,部分应用初次打开时提示此应用专为低版本Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系 定位原因:1. 猜测和应用sdk版本有关 2. AndroidManifest.xml 里 ...

    Android P,系统应用集成,部分应用初次打开时提示此应用专为低版本Android打造,因此可能无法正常运行。请尝试检查更新或与开发者联系

    定位原因:1. 猜测和应用sdk版本有关

    2. AndroidManifest.xml 里  targetSdkVersion版本为15

    <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="15" />

    通过修改targetSdkVersion为23,发现不再提示

    3.通过分析系统源码:发现在环境变量中

    [ro.build.version.min_supported_target_sdk]: [17]

     

    修改方法:

    方法一:app修改 android:targetSdkVersion 修改值为 17以上

    <uses-sdk
            android:minSdkVersion="8"
            android:targetSdkVersion="28" />

    方法二:降低ro.build.version.min_supported_target_sdk 设置值

    build/make/tools/buildinfo.sh

    echo "ro.build.version.min_supported_target_sdk=$PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION

    build\core\version_defaults.mk

    ifndef PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION
      # Used to set minimum supported target sdk version. Apps targeting sdk
      # version lower than the set value will fail to install and run on android
      # device.
      PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION := 17
    endif

    PLATFORM_MIN_SUPPORTED_TARGET_SDK_VERSION := 8

     

    展开全文
  • Android Material Design向下兼容至低版本Android SDK设备 新版的Android Material Design增加了一些很多有趣、有意思的设计元素和风格,比如最近比较常见的Floating Action Button等等。这在新版的Android L,...
    

    Android Material Design向下兼容至低版本Android SDK设备


    新版的Android Material Design增加了一些很多有趣、有意思的设计元素和风格,比如最近比较常见的Floating Action Button等等。这在新版的Android L,Android 6.0中随处可见。然而Android Material Design在标准的Android低版本SDK中无法使用,比如现在常用的Floating Action Button:


    还有SnackBar:



    等等,在Android L上可以直接使用原生Android SDK API实现。


    但是还是有第三方的开源库,帮助开发者向下兼容,将Android Material Design的优秀设计元素向下支持到低版Android设备上。
    MaterialDesignLibrary就是这样的第三方开源库,其在github上的网址链接:https://github.com/navasmdc/MaterialDesignLibrary
    MaterialDesignLibrary的作用和目的:“This is a library with components of Android L to you use in android 2.2”。
    简言之,就是让低版本Android使用上最新的Android L中新的组件。
    MaterialDesignLibrary使用方法:
    (1)直接将其开发包从github上下载,然后解压导入成一个Android库即可。需要注意的是,MaterialDesignLibrary现在是一个基于gradle的库,如果是Eclipse开发者,则需要一定的转换,或者直接将解压后,目录结构MaterialDesignLibrary-master\MaterialDesignLibrary-master\MaterialDesignLibrary\MaterialDesign\src\main下的代码直接导入到Eclipse工程中作为库也可以,不过需要将该目录下的java目录名整合到Eclipse下的标准src目录,最终导入后代码和工程结构如图:


    (2)到这里还没完,因为MaterialDesignLibrary向下兼容开发,作者使用了另外一个第三方库NineOldAndroids,NineOldAndroids库就是帮助一些高版本的Android代码向下兼容设计的。NineOldAndroids在github上的网址链接:https://github.com/JakeWharton/NineOldAndroids
    NineOldAndroids也是一个在gradle上的项目库,如果是Eclipse开发者,则需要将其中Eclipse需要的库包分离出来,Eclipse需要的库的代码在 \MaterialDesignLibrary-master\MaterialDesignLibrary-master\MaterialDesignLibrary\MaterialDesign\src\main目录下,直接将其导入到Eclipse下作为库即可,但需要调整这个目录下的java代码到Eclipse结构下的src目录中,如图:



    (3)前两步导入后,就要开始添加库引用了。需要注意的是:MaterialDesignLibrary和NineOldAndroids本身就是Android库而不是一个Android APP;而MaterialDesignLibrary又引用了NineOldAndroids。
    在我们自己的代码开发中,直接添加对MaterialDesignLibrary库的引用即可。就可以像Android L那样使用Floating Action Button、Snackbar等等了。


    现在把MaterialDesignLibrary库中的一个演示Floating action button的Activity:ButtonsActivity.java抽出来供参考:

    package com.gc.materialdesigndemo.ui;
    
    import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.Window;
    
    import com.gc.materialdesigndemo.R;
    
    public class ButtonsActivity extends Activity {
    
    	int backgroundColor = Color.parseColor("#1E88E5");
    
    	@SuppressLint("NewApi")
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		requestWindowFeature(Window.FEATURE_NO_TITLE);
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_buttons);
    		int color = getIntent().getIntExtra("BACKGROUND", Color.BLACK);
    		findViewById(R.id.buttonflat).setBackgroundColor(color);
    		findViewById(R.id.button).setBackgroundColor(color);
    		findViewById(R.id.buttonFloatSmall).setBackgroundColor(color);
    		findViewById(R.id.buttonIcon).setBackgroundColor(color);
    		findViewById(R.id.buttonFloat).setBackgroundColor(color);
    	}
    
    }
    

    ButtonsActivity.java的布局文件activity_buttons.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:materialdesign="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FFF" >
    
        <com.gc.materialdesign.views.ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
    
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:orientation="vertical" >
    
                <!-- FLAT BUTTON -->
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="32dp"
                    android:layout_marginLeft="24dp" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:text="Flat Button" />
    
                    <View
                        android:layout_width="fill_parent"
                        android:layout_height="1dp"
                        android:layout_alignParentBottom="true"
                        android:background="#1E88E5" />
                </RelativeLayout>
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="72dp" >
    
                    <com.gc.materialdesign.views.ButtonFlat
                        android:id="@+id/buttonflat"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:text="Button"
                        android:textColor="#ffffff" />
                </RelativeLayout>
                <!-- RECTANGLE BUTTON -->
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="32dp"
                    android:layout_marginLeft="24dp" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:text="Rectangle Button" />
    
                    <View
                        android:layout_width="fill_parent"
                        android:layout_height="1dp"
                        android:layout_alignParentBottom="true"
                        android:background="#1E88E5" />
                </RelativeLayout>
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="72dp" >
    
                    <com.gc.materialdesign.views.ButtonRectangle
                        android:id="@+id/button"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:background="#1E88E5"
                        android:text="Button" />
                </RelativeLayout>
                <!-- SMALL FLOAT BUTTON -->
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="32dp"
                    android:layout_marginLeft="24dp" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:text="Small Float Button" />
    
                    <View
                        android:layout_width="fill_parent"
                        android:layout_height="1dp"
                        android:layout_alignParentBottom="true"
                        android:background="#1E88E5" />
                </RelativeLayout>
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="72dp" >
    
                    <com.gc.materialdesign.views.ButtonFloatSmall
                        android:id="@+id/buttonFloatSmall"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:background="#1E88E5"
                        materialdesign:iconDrawable="@drawable/ic_action_new" />
                </RelativeLayout>
    
                <!-- FLOAT BUTTON -->
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="32dp"
                    android:layout_marginLeft="24dp" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:text="Icon Button" />
    
                    <View
                        android:layout_width="fill_parent"
                        android:layout_height="1dp"
                        android:layout_alignParentBottom="true"
                        android:background="#1E88E5" />
                </RelativeLayout>
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="72dp" >
    
                    <com.gc.materialdesign.views.ButtonIcon
                        android:id="@+id/buttonIcon"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerInParent="true"
                        android:background="#1E88E5"
                        materialdesign:iconDrawable="@drawable/ic_next" />
                </RelativeLayout>
    
                <!-- FLOAT BUTTON -->
    
                <RelativeLayout
                    android:layout_width="fill_parent"
                    android:layout_height="32dp"
                    android:layout_marginLeft="24dp" >
    
                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:text="Float Button" />
    
                    <View
                        android:layout_width="fill_parent"
                        android:layout_height="1dp"
                        android:layout_alignParentBottom="true"
                        android:background="#1E88E5" />
                </RelativeLayout>
            </LinearLayout>
        </com.gc.materialdesign.views.ScrollView>
    
        <com.gc.materialdesign.views.ButtonFloat
            android:id="@+id/buttonFloat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_marginRight="24dp"
            android:background="#1E88E5"
            materialdesign:animate="true"
            materialdesign:iconDrawable="@drawable/ic_action_new" />
    
    </RelativeLayout>

    其运行效果图就是本文中的第1图显示的那样。


    我把全部的代码工程(MaterialDesignLibrary库,NineOldAndroids库,以及一个测试MaterialDesignLibrary的项目MaterialDesignActivity)上传到CSDN上供下载使用,CSDN下载页面:http://download.csdn.net/detail/zhangphil/9124325
    将这个压缩文件下载后逐个导入,正确添加库引用后,就可以直接跑MaterialDesignActivity查看运行结果了。

    
    展开全文
  • android低版本工程放到高版本环境中可能会出现错误,解决方法如下: 1。 如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。  (该处理方式只是在高版本中兼容了低版本工程) 2。 如果修改...

    android低版本工程放到高版本环境中可能会出现错误,解决方法如下:
    1。 如果不修改android sdk版本,则使用project clean 命令作用于某工程即可。
           (该处理方式只是在高版本中兼容了低版本工程)
    2。 如果修改android sdk版本,则需要以下几个步骤:
           1)修改SDK
                 选择工程,build path --> configure build path ---> library 删除引用的低版本SDK,
                 然后add External JARs,选择高版本SDK,OK,保存
            2)修改classpath文件 
                 该文件可能存在该项: <classpathentry kind="lib"   path ="你所指定的高版本的地址"
                 把她修改成<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK" />
            3) 修改AndroidManifest.xml
                 在AndroidManifest.xml文件中,application标签后添加<uses-sdk android:minSdkVersion="3"></uses-sdk>
            4) 修改default.properties(很重要)
                  该文件最后一行(前面没用#的)target=android-3 该成target=android-8,保存。
            再看看你的工程和新建的android 2.2的工程结构就一样了

    展开全文
  • 低版本 compile sdk Version:API 22: Android 5.1 (Lollipop) build tools Version:21.0.1 Dependencies: com.android.support.appcompat-v4:22.1.0 com.android.support.appcompat-v7:22.
  • 很多低版本的系统上就会找不到这个方法。那怎么做呢?可以去support包中找相应的方法。例如5.0才出的background tint,那么如果你的minSdk是小于5.0的话,那么studio就报错了,你可以去使用support-v4包中的Drawab
  • 3.0以前的提供的...大量的应用使用了ActionBar,然而市面上扔存在大量的Android 2.2 , 2.3 的设备,是否意味着应用必须要放弃低版本的市场呢!No,Google 新提供了一个V7 jar 包,支持低版本上使用ActionBar。
  • 当我们的minSdkVersion的版本低于新API所在的版本时,我们直接使用新API在编译时会出现报错。 minSdkVersion是在build.gradle中指定的。 Call requires API level 24 (current min is 19) 编译器还是很强大的,...
  • 我这个问题出现在android6.0以下的机子上, 其他版本没问题。 解决方法(前三种方法需要Android同学改,第四种需要web前端同学改): 1.启用mixed content 在Android5.0中,WebView方面做了些修改,如果你的系统...
  • 1.android低版本webview不支持Object.assign改用var objectAssign = require('object-assign')或...代替,例 const OperativeStore = Object.assign(EventEmitter.prototype, { emitChange(){ this.emit( ...
  • 闪退log 如下所示: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPat..................nativeLibraryDirectories=[/data/app/com.appshare.android.ilisten-2/lib/arm64, /system/fake-libs64,
  • 我已经按照网上说的改了 distributionUrl=...}的版本,是我当前gradle的版本,但是还是会报错,如图![图片说明](https://img-ask.csdn.net/upload/201606/30/1467257435_946294.png)
  • 先在本地可运行的项目中找到4个带Grande文件,之后复制到导入的项目中,之后再AS中打开就可以了,是打开不是导入
  • 1.如果版本低于1.6,直接去此网址下载 https://developer.android.com/sdk/older_releases.html 2.先去此页面检查要下载的版本号 https://developer.android.com/studio/releases/sdk-tools.html 3.版本号写入下面...
  • 在项目中发现在华为荣耀6手机上,出现页面白屏,抓包后显示接口调用并没有执行,查找后认为是android版本(升级测试android4.4.2已是华为荣耀6的最新系统)。 华为荣耀6:android版本4.4.2 接口请求是用axios + ...
  • oppo和vivo等低版本浏览器不支持es6写法,所以需要对es6转es5的操作。 IE浏览器没有内置Promise对象。不仅如此,几乎所有的ES6新增的方法在IE都不能用,此时你需要babel Polyfill 一、需要下载几个包 npm ...
  • 问题:使用VS2017开发APP中的页面使用VUE.js遇到打包出来的android文件 在低版本的中显示空白。 打开调试页面显示错误信息如下: 原因:低版本内置的浏览器(webview)版本太低,无法解析 ES2015最新的一些...
  • Flutter之Android SDK版本与External Libraries中的Android API版本不一致问题描述解决办法 问题描述 先看问题图片: Android SDK verson 是 29.0.1,External Libraries 中Android API 版本是25。 解决办法 在项目...
  • ~项目地址 : https://github.com/hjhrq1991/JsBridge问题描述App开发时或多或少加载web页面,但是使用h5或者一些新特性来写的web页在Android低版本系统上经常出现各种兼容适配问题。前言WebView是Android系统提供能...
  • Android SDK 历史版本下载 估计你们应该要科学上网才能下载 http://dl.google.com/android/android-sdk_r16-windows.zip 如果想下载那个版本,将后面的 r16 换成你想下载的版本号就行了,在此记录下,不至于每次都...
1 2 3 4 5 ... 20
收藏数 106,783
精华内容 42,713
关键字:

低版本android