Android中使用ant混淆编译

 更新时间:2016年9月20日 19:59  点击:1528
Android中使用ant混淆编译方法有需要的同学可参考参考。

1.拿一个普通项目来说,首先为它加上ant编译功能。

 代码如下 复制代码

android update project --name project_name -t 3 -p D:/temp/project_name

此时会在项目根目录自动生成一个名为build.xml的ant脚本。上面的project_name是你的项目名称。

2.加入混淆功能

就第一步来说,在命令行中已经可以使用ant进行编译了。因为Android中是这样的,在输入命令ant debug的时候会自动调用D:/android-sdk-windows/tools/ant/main_rules.xml目录下的规则文件,所以无需自己写ant脚本了。既然它会调用默认的规则文件(默认文件没有加入混淆功能),那么我们想要混淆,直接在这个规则文件上修改就好了。在名为-dex的target后加入一个target,代码如下:

 代码如下 复制代码
1 <target name="optimize" depends="compile">    <jar basedir="${out.classes.absolute.dir}" destfile="temp.jar">    <java jar="D:/android-sdk-windows/tools/proguard/lib/proguard.jar" fork="true" failonerror="true"><jvmarg value="-Dmaximum.inlined.code.length=32">        <arg value="-injars temp.jar"><arg value="-outjars optimized.jar"><arg value="-libraryjars '${android.jar}'"><!-- value="-libraryjars ${library-jar}/some_lib_used.jar"> --><arg value="-dontpreverify"><arg value="-dontoptimize"><arg value="-dontusemixedcaseclassnames"><arg value="-repackageclasses"><arg value="-allowaccessmodification">        <arg value="-keep public class * extends android.app.Activity">          <arg value="-keep public class * extends android.app.Service">          <arg value="-keep public class * extends android.content.BroadcastReceiver">          <arg value="-keep public class * extends android.content.ContentProvider">          <arg value="-keep public class * extends android.view.View">         <arg value="-optimizationpasses 1">        <arg value="-verbose"><arg value="-dontskipnonpubliclibraryclasses"><arg value="-dontskipnonpubliclibraryclassmembers"><arg value="-ignorewarning">    </arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></arg></!--></arg></arg></arg></jvmarg></java>    <delete file="temp.jar">    <delete dir="${out.classes.absolute.dir}">    <mkdir dir="${out.classes.absolute.dir}">    <unzip src="optimized.jar" mce_src="optimized.jar" dest="${out.classes.absolute.dir}">    <delete file="optimized.jar"></delete></unzip></mkdir></delete></delete></jar></target>

修改上面代码涉及到路径的地方,改成本地对应的路径。<arg value="-ignorewarning"/>这一行是自己加入的,意思是忽略警告。

接着在名为-dex的target中进行一个混淆依赖,加入后代码如下:

 代码如下 复制代码
1 <target name="-dex" depends="compile, optimize, -post-compile, -obfuscate" unless="do.not.compile">        <if condition="${manifest.hasCode}">            <then>                <dex-helper>            </dex-helper></then>            <else>                <echo>hasCode = false. Skipping...</echo>            </else>        </if></target>

实际上加入的只是optimize,意思是这个target依赖target optimize。

3.开始编译

可以在命令行中编译了,编译后把class.dex进行反编译,可以看出来混淆成功。不知道为什么在我们的项目中反编译不回来,但是可以保证混淆是成功了。我拿过其他例子项目编译后反编译过,可以看下图:(不好意思,注册一星期之内不能上传图片)

本文章来给大家介绍Android RelativeLayout 属性用法详解,有需要了解RelativeLayout 属性的同学可进入参考参考。

// 相对于给定ID控件

 代码如下 复制代码

android:layout_above 将该控件的底部置于给定ID的控件之上;

android:layout_below 将该控件的底部置于给定ID的控件之下;

android:layout_toLeftOf    将该控件的右边缘与给定ID的控件左边缘对齐;

android:layout_toRightOf  将该控件的左边缘与给定ID的控件右边缘对齐;

android:layout_alignBaseline  将该控件的baseline与给定ID的baseline对齐;

android:layout_alignTop        将该控件的顶部边缘与给定ID的顶部边缘对齐;

android:layout_alignBottom   将该控件的底部边缘与给定ID的底部边缘对齐;

android:layout_alignLeft        将该控件的左边缘与给定ID的左边缘对齐;

android:layout_alignRight      将该控件的右边缘与给定ID的右边缘对齐;

// 相对于父组件

android:layout_alignParentTop      如果为true,将该控件的顶部与其父控件的顶部对齐;

android:layout_alignParentBottom 如果为true,将该控件的底部与其父控件的底部对齐;

android:layout_alignParentLeft      如果为true,将该控件的左部与其父控件的左部对齐;

android:layout_alignParentRight    如果为true,将该控件的右部与其父控件的右部对齐;

// 居中

android:layout_centerHorizontal 如果为true,将该控件的置于水平居中;

android:layout_centerVertical     如果为true,将该控件的置于垂直居中;

android:layout_centerInParent   如果为true,将该控件的置于父控件的中央;

// 外部间隔

android:layout_marginTop       上偏移的值;

android:layout_marginBottom  下偏移的值;

android:layout_marginLeft   左偏移的值;

android:layout_marginRight   右偏移的值;

RelativeLayout代码

 代码如下 复制代码

RelativeLayout relativeLayout = new RelativeLayout(context);
  Spinner spinner = new Spinner(context);
  edit_text_add_country = new AutoCompleteTextView(context);
  edit_text_add_stock = new EditText(this);
  RadioGroup containCountry = new RadioGroup(context);
 
 
  spinner.setId(1);
  edit_text_add_country.setId(2);
  edit_text_add_stock.setId(3);
  containCountry.setId(4);
 
  String[] mCountries = { "China" , "USA", "China2", "Comunicate"};
  List<String> allcountries = new ArrayList<String>();
  ArrayAdapter<String> aspnCountries;
 
  for (int i = 0; i < mCountries.length; i++) {
   allcountries.add(mCountries[i]);
  }
 
  aspnCountries = new ArrayAdapter<String>(this,
    android.R.layout.simple_spinner_item, allcountries);
  aspnCountries
    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  spinner.setAdapter(aspnCountries);
  edit_text_add_country.setAdapter(aspnCountries);
  edit_text_add_country.setHint("input country name");
  edit_text_add_stock.setHint("input stock name");
 
  RelativeLayout.LayoutParams param1, param2, param3;
  param1 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  param2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  param2.addRule(RelativeLayout.BELOW, 1);
  param3 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
  param3.addRule(RelativeLayout.BELOW, 4);
  ViewGroup.LayoutParams param4, param5;
  param4 = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
  param5 = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.WRAP_CONTENT);
 
  containCountry.addView(spinner,param4);
  containCountry.addView(edit_text_add_country, param5);
 
  relativeLayout.addView(containCountry, param1);
  relativeLayout.addView(edit_text_add_stock, param3);
 
  builder.setView(relativeLayout);

看个实例

RelativeLayout代码实现及点击设置

 代码如下 复制代码

public class Main extends Activity {
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
      
        ArrayList<Person> personList = new ArrayList<Person>();
        personList.add(new Person("zwx","23"));
        personList.add(new Person("zwx1","24"));
        personList.add(new Person("zwx2","25"));
      
        LinearLayout ll = (LinearLayout)findViewById(R.id.LinearLayout01);


        for(Person person : personList){
         RelativeLayout rl = new RelativeLayout(this);
         RelativeLayout.LayoutParams  rll = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
          rl.setLayoutParams(rll);


          TextView tv1 = new TextView(this);
          RelativeLayout.LayoutParams tv1_rl = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
          tv1_rl.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
          tv1.setText(person.getName());
          rl.addView(tv1, tv1_rl);
        
          TextView tv2 = new TextView(this);
          RelativeLayout.LayoutParams tv2_rl = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
          tv2_rl.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
          tv2.setText(person.getAge());
          rl.addView(tv2, tv2_rl);


          ll.addView(rl);
          rl.setOnClickListener(new View.OnClickListener() {
    
                @Override
              public void onClick(View v) {
                   Toast.makeText(Main.this, "11", 5000).show();
                }
               }) ;
        }
    }
}


注意:不能在RelativeLayout容器本身和他的子元素之间产生循环依赖,比如说,不能将RelativeLayout的高设置成为WRAP_CONTENT的时候将子元素的高设置成为ALIGN_PARENT_BOTTOM。

本文章来给大家介绍android检测包名和类名是否存在的方法,有需要了解的同学可进入参考参考。

1.对包名的判断,异常则说明不存在:

 代码如下 复制代码


  try { 
    PackageManager pm = getPackageManager();
    pm.getPackageInfo("com.org", PackageManager.GET_ACTIVITIES);
  } catch (NameNotFoundException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }


2.对类名的判断,异常则说明不存在:

 代码如下 复制代码


  try {
  Class.forName("com.org.MainActivity");
} catch (ClassNotFoundException e) {
  // TODO Auto-generated catch block
    return;
}

在安卓开发时我碰到一个问题就是需要实现全屏,但又需要我们来判断出用户是使用了全屏或非全屏了,下面我分别找了两段代码,大家可参考。

先来看一个android屏幕全屏实现代码

 代码如下 复制代码

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
setContentView(R.layout.newslists);
newsListLayout = findViewById(R.id.newslistlayout);
newsListLayout.setBackgroundColor(Color.MAGENTA);

newsNameList = (ListView) findViewById(R.id.newsnamelist);
model = new Model(0, 6);
nameListAdapter = new NewsNameListAdapter(this, model);
newsNameList.setAdapter(nameListAdapter);

showPage = (TextView) findViewById(R.id.newslistshowpage);
updatePage(model.getIndex());
}

现在我们还可以来判断是全屏或非全屏

 代码如下 复制代码

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);      
       
        int v = this.getWindow().getAttributes().flags;
        // 全屏 66816 - 非全屏 65792
        if(v != 66816){//非全屏
         this.getWindow().setFlags(
                    WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }else{//取消全屏
         this.getWindow().clearFlags(
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
        }

    }  

本文章来给大家但要在Android开发中实现获取本机电话号码的实现,这里我们必须是通过SDK来获取哦,有需要了解的朋友可参考。

注:根据Android的安全机制,在使用TelephonyManager时,必须在AndroidManifest.xml中添加
name="READ_PHONE_STATE" /> 否则无法获得系统的许可。

Android开发平台中,可通过TelephonyManager 获取本机号码。

 代码如下 复制代码

private String getPhoneNumber(){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number();
}

或这样写

 代码如下 复制代码
TelephonyManager phoneMgr=(TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
txtPhoneNumber.setText(phoneMgr.getLine1Number()); //txtPhoneNumber

是一个EditText 用于显示手机号

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02